aboutsummaryrefslogtreecommitdiffstats
path: root/ffmpeg.c
diff options
context:
space:
mode:
authorRoman Shaposhnik <roman@shaposhnik.org>2003-10-03 01:08:10 +0000
committerRoman Shaposhnik <roman@shaposhnik.org>2003-10-03 01:08:10 +0000
commita686caf03ddd29b32abd1af5c6f887bc09e6d71b (patch)
tree6e1ea12178f7ad09aeca1f0e1071b0e4cd18b116 /ffmpeg.c
parente692fd601de39ef541b93b7d135569b8232c7b2d (diff)
downloadffmpeg-a686caf03ddd29b32abd1af5c6f887bc09e6d71b.tar.gz
* 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
Diffstat (limited to 'ffmpeg.c')
-rw-r--r--ffmpeg.c25
1 files changed, 23 insertions, 2 deletions
diff --git a/ffmpeg.c b/ffmpeg.c
index 9784b52351..6970054589 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;