[FFmpeg-cvslog] ffmpeg: fix aspect ratio setting

Baptiste Coudurier baptiste.coudurier at gmail.com
Thu Apr 7 00:50:37 CEST 2011


On 04/06/2011 10:44 AM, Stefano Sabatini wrote:
> On date Tuesday 2011-04-05 15:02:08 -0700, Baptiste Coudurier wrote:
>> On 04/05/2011 12:09 PM, Baptiste Coudurier wrote:
> [...]
>>>> That said, I don't see a sane way to make -vf and -aspect convive when
>>>> filtering is enabled, that is i'd tend to say to the user to just use
>>>> -vf when she wants to change the final aspect (and keep -aspect for
>>>> -vcodec copy).
>>>
>>> Having 2 options is confusing for the user.
>>>
>>> I think the correct solution is to avoid adding filters when -aspect is
>>> specified on the commandline, and check frame_aspect_ratio directly.
>>> My first patch did this. It's easy to distinguish between -aspect
>>> specified or not.
>>>
>>> If it was, override the output aspect ratio no matter what (at the end
>>> of configure_filters)
>>>
>>
>> Patch attached.
>>
>> -- 
>> Baptiste COUDURIER
>> Key fingerprint                 8D77134D20CC9220201FC5DB0AC9325C5C1ABAAA
>> FFmpeg maintainer                                  http://www.ffmpeg.org
> 
>> From 4ebbb6a5f34dd8d39610a9185eac5f7a925f2141 Mon Sep 17 00:00:00 2001
>> From: Baptiste Coudurier <baptiste.coudurier at gmail.com>
>> Date: Tue, 5 Apr 2011 13:37:11 -0700
>> Subject: [PATCH] Fix -aspect cli option
> 
> Please extend the commit log so that we have some more information
> stored in metadata for the next poor guy trying to figure this out.

Please suggest another message.

>> ---
>>  ffmpeg.c |   33 ++++++++++++++-------------------
>>  1 files changed, 14 insertions(+), 19 deletions(-)
>>
>> diff --git a/ffmpeg.c b/ffmpeg.c
>> index 0ea369e..ccf1867 100644
>> --- a/ffmpeg.c
>> +++ b/ffmpeg.c
>> @@ -149,7 +149,6 @@ static int nb_streamid_map = 0;
>>  static int frame_width  = 0;
>>  static int frame_height = 0;
>>  static float frame_aspect_ratio = 0;
>> -static int frame_aspect_ratio_override = 0;
>>  static enum PixelFormat frame_pix_fmt = PIX_FMT_NONE;
>>  static int frame_bits_per_raw_sample = 0;
>>  static enum AVSampleFormat audio_sample_fmt = AV_SAMPLE_FMT_NONE;
>> @@ -285,6 +284,8 @@ typedef struct AVOutputStream {
>>      int resample_width;
>>      int resample_pix_fmt;
>>  
>> +    float frame_aspect_ratio;
> 
> I suggest to change this to "display_aspect_ratio" in a successive
> patch (as there is already enough confusion with display/pixel/sample
> aspect ratio).

Feel free to do it.

>> +
>>      /* full frame size of first frame */
>>      int original_height;
>>      int original_width;
>> @@ -429,6 +430,8 @@ static int configure_filters(AVInputStream *ist, AVOutputStream *ost)
>>      codec->width  = ost->output_video_filter->inputs[0]->w;
>>      codec->height = ost->output_video_filter->inputs[0]->h;
>>      codec->sample_aspect_ratio = ost->st->sample_aspect_ratio =
>> +        ost->frame_aspect_ratio ? // overriden by the -aspect cli option
>> +        av_d2q(ost->frame_aspect_ratio*codec->height/codec->width, 255) :
>>          ost->output_video_filter->inputs[0]->sample_aspect_ratio;
>>  
>>      return 0;
>> @@ -1695,7 +1698,7 @@ static int output_packet(AVInputStream *ist, int ist_index,
>>                              break;
>>                          case AVMEDIA_TYPE_VIDEO:
> 
>>  #if CONFIG_AVFILTER
>> -                            if (ost->picref->video)
>> +                            if (ost->picref->video && !ost->frame_aspect_ratio)
>>                                  ost->st->codec->sample_aspect_ratio = ost->picref->video->pixel_aspect;
>>  #endif
> 
> I wonder if this is required at all.

Did you test without ? If not do it.

>>                              do_video_out(os, ost, ist, &picture, &frame_size);
>> @@ -2242,6 +2245,13 @@ static int transcode(AVFormatContext **output_files,
>>                  codec->width = icodec->width;
>>                  codec->height = icodec->height;
>>                  codec->has_b_frames = icodec->has_b_frames;
> 
>> +                if (!codec->sample_aspect_ratio.num) {
>> +                    codec->sample_aspect_ratio =
>> +                    ost->st->sample_aspect_ratio =
>> +                        ist->st->sample_aspect_ratio.num ? ist->st->sample_aspect_ratio :
>> +                        ist->st->codec->sample_aspect_ratio.num ?
>> +                        ist->st->codec->sample_aspect_ratio : (AVRational){0, 1};
>> +                }
> 
> Nit+: maybe ist->st->codec -> icodec for brevity.

ist->st is common, I prefer it this way.

[...]

-- 
Baptiste COUDURIER
Key fingerprint                 8D77134D20CC9220201FC5DB0AC9325C5C1ABAAA
FFmpeg maintainer                                  http://www.ffmpeg.org


More information about the ffmpeg-cvslog mailing list