From a686caf03ddd29b32abd1af5c6f887bc09e6d71b Mon Sep 17 00:00:00 2001 From: Roman Shaposhnik Date: Fri, 3 Oct 2003 01:08:10 +0000 Subject: [PATCH 1/1] * fixing bug that prevented resampling the picture and changing pix_fmt at the same time. * aspect ratio should be more reliable for DV now. Originally committed as revision 2338 to svn://svn.ffmpeg.org/ffmpeg/trunk --- ffmpeg.c | 25 +++++++++++++++++++++++-- libavformat/dv.c | 2 +- 2 files changed, 24 insertions(+), 3 deletions(-) diff --git a/ffmpeg.c b/ffmpeg.c index 9784b523514..69700545892 100644 --- a/ffmpeg.c +++ b/ffmpeg.c @@ -467,6 +467,7 @@ static void do_video_out(AVFormatContext *s, static uint8_t *video_buffer; uint8_t *buf = NULL, *buf1 = NULL; AVCodecContext *enc, *dec; + enum PixelFormat target_pixfmt; #define VIDEO_BUFFER_SIZE (1024*1024) @@ -534,7 +535,8 @@ static void do_video_out(AVFormatContext *s, return; /* convert pixel format if needed */ - if (enc->pix_fmt != dec->pix_fmt) { + target_pixfmt = ost->video_resample ? PIX_FMT_YUV420P : enc->pix_fmt; + if (dec->pix_fmt != target_pixfmt) { int size; /* create temporary picture */ @@ -545,7 +547,7 @@ static void do_video_out(AVFormatContext *s, formatted_picture = &picture_format_temp; avpicture_fill(formatted_picture, buf, enc->pix_fmt, dec->width, dec->height); - if (img_convert(formatted_picture, enc->pix_fmt, + if (img_convert(formatted_picture, target_pixfmt, in_picture, dec->pix_fmt, dec->width, dec->height) < 0) { fprintf(stderr, "pixel format conversion not handled\n"); @@ -561,6 +563,25 @@ static void do_video_out(AVFormatContext *s, if (ost->video_resample) { final_picture = &ost->pict_tmp; img_resample(ost->img_resample_ctx, final_picture, formatted_picture); + if (enc->pix_fmt != PIX_FMT_YUV420P) { + int size; + + av_free(buf); + /* create temporary picture */ + size = avpicture_get_size(enc->pix_fmt, enc->width, enc->height); + buf = av_malloc(size); + if (!buf) + return; + final_picture = &picture_format_temp; + avpicture_fill(final_picture, buf, enc->pix_fmt, enc->width, enc->height); + + if (img_convert(final_picture, enc->pix_fmt, + &ost->pict_tmp, PIX_FMT_YUV420P, + enc->width, enc->height) < 0) { + fprintf(stderr, "pixel format conversion not handled\n"); + goto the_end; + } + } } else if (ost->video_crop) { picture_crop_temp.data[0] = formatted_picture->data[0] + (ost->topBand * formatted_picture->linesize[0]) + ost->leftBand; diff --git a/libavformat/dv.c b/libavformat/dv.c index a132f97dded..62992fa8fc5 100644 --- a/libavformat/dv.c +++ b/libavformat/dv.c @@ -660,7 +660,7 @@ DVMuxContext* dv_init_mux(AVFormatContext* s) c->has_audio = c->has_video = 0; c->start_time = time(NULL); c->aspect = 0; /* 4:3 is the default */ - if (vst->codec.aspect_ratio == 16.0 / 9.0) + if ((int)(vst->codec.aspect_ratio * 10) == 17) /* 16:9 */ c->aspect = 0x07; if (fifo_init(&c->audio_data, 100*AVCODEC_MAX_AUDIO_FRAME_SIZE) < 0) -- 2.39.2