| @@ -1073,14 +1073,71 @@ static void do_subtitle_out(AVFormatContext *s, | |||
| static int bit_buffer_size= 1024*256; | |||
| static uint8_t *bit_buffer= NULL; | |||
| static void do_video_resample(OutputStream *ost, | |||
| InputStream *ist, | |||
| AVFrame *in_picture, | |||
| AVFrame **out_picture) | |||
| { | |||
| int resample_changed = 0; | |||
| AVCodecContext *dec = ist->st->codec; | |||
| *out_picture = in_picture; | |||
| #if !CONFIG_AVFILTER | |||
| resample_changed = ost->resample_width != dec->width || | |||
| ost->resample_height != dec->height || | |||
| ost->resample_pix_fmt != dec->pix_fmt; | |||
| if (resample_changed) { | |||
| av_log(NULL, AV_LOG_INFO, | |||
| "Input stream #%d.%d frame changed from size:%dx%d fmt:%s to size:%dx%d fmt:%s\n", | |||
| ist->file_index, ist->st->index, | |||
| ost->resample_width, ost->resample_height, av_get_pix_fmt_name(ost->resample_pix_fmt), | |||
| dec->width , dec->height , av_get_pix_fmt_name(dec->pix_fmt)); | |||
| ost->resample_width = dec->width; | |||
| ost->resample_height = dec->height; | |||
| ost->resample_pix_fmt = dec->pix_fmt; | |||
| } | |||
| ost->video_resample = dec->width != enc->width || | |||
| dec->height != enc->height || | |||
| dec->pix_fmt != enc->pix_fmt; | |||
| if (ost->video_resample) { | |||
| *out_picture = &ost->resample_frame; | |||
| if (!ost->img_resample_ctx || resample_changed) { | |||
| /* initialize the destination picture */ | |||
| if (!ost->resample_frame.data[0]) { | |||
| avcodec_get_frame_defaults(&ost->resample_frame); | |||
| if (avpicture_alloc((AVPicture *)&ost->resample_frame, enc->pix_fmt, | |||
| enc->width, enc->height)) { | |||
| fprintf(stderr, "Cannot allocate temp picture, check pix fmt\n"); | |||
| exit_program(1); | |||
| } | |||
| } | |||
| /* initialize a new scaler context */ | |||
| sws_freeContext(ost->img_resample_ctx); | |||
| ost->img_resample_ctx = sws_getContext(dec->width, dec->height, dec->pix_fmt, | |||
| enc->width, enc->height, enc->pix_fmt, | |||
| ost->sws_flags, NULL, NULL, NULL); | |||
| if (ost->img_resample_ctx == NULL) { | |||
| fprintf(stderr, "Cannot get resampling context\n"); | |||
| exit_program(1); | |||
| } | |||
| } | |||
| sws_scale(ost->img_resample_ctx, in_picture->data, in_picture->linesize, | |||
| 0, ost->resample_height, (*out_picture)->data, (*out_picture)->linesize); | |||
| } | |||
| #endif | |||
| } | |||
| static void do_video_out(AVFormatContext *s, | |||
| OutputStream *ost, | |||
| InputStream *ist, | |||
| AVFrame *in_picture, | |||
| int *frame_size, float quality) | |||
| { | |||
| int nb_frames, i, ret, av_unused resample_changed; | |||
| AVFrame *final_picture, *formatted_picture; | |||
| int nb_frames, i, ret; | |||
| AVFrame *final_picture; | |||
| AVCodecContext *enc, *dec; | |||
| double sync_ipts; | |||
| @@ -1123,55 +1180,7 @@ static void do_video_out(AVFormatContext *s, | |||
| if (nb_frames <= 0) | |||
| return; | |||
| formatted_picture = in_picture; | |||
| final_picture = formatted_picture; | |||
| #if !CONFIG_AVFILTER | |||
| resample_changed = ost->resample_width != dec->width || | |||
| ost->resample_height != dec->height || | |||
| ost->resample_pix_fmt != dec->pix_fmt; | |||
| if (resample_changed) { | |||
| av_log(NULL, AV_LOG_INFO, | |||
| "Input stream #%d.%d frame changed from size:%dx%d fmt:%s to size:%dx%d fmt:%s\n", | |||
| ist->file_index, ist->st->index, | |||
| ost->resample_width, ost->resample_height, av_get_pix_fmt_name(ost->resample_pix_fmt), | |||
| dec->width , dec->height , av_get_pix_fmt_name(dec->pix_fmt)); | |||
| ost->resample_width = dec->width; | |||
| ost->resample_height = dec->height; | |||
| ost->resample_pix_fmt = dec->pix_fmt; | |||
| } | |||
| ost->video_resample = dec->width != enc->width || | |||
| dec->height != enc->height || | |||
| dec->pix_fmt != enc->pix_fmt; | |||
| if (ost->video_resample) { | |||
| final_picture = &ost->resample_frame; | |||
| if (!ost->img_resample_ctx || resample_changed) { | |||
| /* initialize the destination picture */ | |||
| if (!ost->resample_frame.data[0]) { | |||
| avcodec_get_frame_defaults(&ost->resample_frame); | |||
| if (avpicture_alloc((AVPicture *)&ost->resample_frame, enc->pix_fmt, | |||
| enc->width, enc->height)) { | |||
| fprintf(stderr, "Cannot allocate temp picture, check pix fmt\n"); | |||
| exit_program(1); | |||
| } | |||
| } | |||
| /* initialize a new scaler context */ | |||
| sws_freeContext(ost->img_resample_ctx); | |||
| ost->img_resample_ctx = sws_getContext(dec->width, dec->height, dec->pix_fmt, | |||
| enc->width, enc->height, enc->pix_fmt, | |||
| ost->sws_flags, NULL, NULL, NULL); | |||
| if (ost->img_resample_ctx == NULL) { | |||
| fprintf(stderr, "Cannot get resampling context\n"); | |||
| exit_program(1); | |||
| } | |||
| } | |||
| sws_scale(ost->img_resample_ctx, formatted_picture->data, formatted_picture->linesize, | |||
| 0, ost->resample_height, final_picture->data, final_picture->linesize); | |||
| } | |||
| #endif | |||
| do_video_resample(ost, ist, in_picture, &final_picture); | |||
| /* duplicates frame if needed */ | |||
| for(i=0;i<nb_frames;i++) { | |||