[FFmpeg-devel] [PATCH] avformat/matroskaenc: use display aspect ratio for DisplayWidth and DisplayHeight when possible

James Almer jamrial at gmail.com
Wed Nov 2 22:26:30 EET 2016


On 10/28/2016 12:03 AM, James Almer wrote:
> On 10/22/2016 5:33 PM, James Almer wrote:
>> This avoids potential rounding errors and guarantees the source aspect
>> ratio is preserved.
>> Keep writing pixel values when Stereo 3D Mode is enabled and for WebM,
>> as the format doesn't support anything else.
>>
>> This fixes ticket #5743, implementing the suggestion from ticket #5903.
>>
>> Signed-off-by: James Almer <jamrial at gmail.com>
>> ---
>>  libavformat/matroskaenc.c | 15 +++++++++++++--
>>  1 file changed, 13 insertions(+), 2 deletions(-)
>>
>> diff --git a/libavformat/matroskaenc.c b/libavformat/matroskaenc.c
>> index 03d5326..5790fe1 100644
>> --- a/libavformat/matroskaenc.c
>> +++ b/libavformat/matroskaenc.c
>> @@ -1193,8 +1193,19 @@ static int mkv_write_track(AVFormatContext *s, MatroskaMuxContext *mkv,
>>                  return AVERROR(EINVAL);
>>              }
>>              if (d_width != par->width || display_width_div != 1 || display_height_div != 1) {
>> -                put_ebml_uint(pb, MATROSKA_ID_VIDEODISPLAYWIDTH , d_width / display_width_div);
>> -                put_ebml_uint(pb, MATROSKA_ID_VIDEODISPLAYHEIGHT, par->height / display_height_div);
>> +                if (mkv->mode == MODE_WEBM || display_width_div != 1 || display_height_div != 1) {
>> +                    put_ebml_uint(pb, MATROSKA_ID_VIDEODISPLAYWIDTH , d_width / display_width_div);
>> +                    put_ebml_uint(pb, MATROSKA_ID_VIDEODISPLAYHEIGHT, par->height / display_height_div);
>> +                } else {
>> +                    AVRational display_aspect_ratio;
>> +                    av_reduce(&display_aspect_ratio.num, &display_aspect_ratio.den,
>> +                              par->width  * (int64_t)st->sample_aspect_ratio.num,
>> +                              par->height * (int64_t)st->sample_aspect_ratio.den,
>> +                              1024 * 1024);
>> +                    put_ebml_uint(pb, MATROSKA_ID_VIDEODISPLAYWIDTH,  display_aspect_ratio.num);
>> +                    put_ebml_uint(pb, MATROSKA_ID_VIDEODISPLAYHEIGHT, display_aspect_ratio.den);
>> +                    put_ebml_uint(pb, MATROSKA_ID_VIDEODISPLAYUNIT, MATROSKA_VIDEO_DISPLAYUNIT_DAR);
>> +                }
>>              }
>>          } else if (display_width_div != 1 || display_height_div != 1) {
>>              put_ebml_uint(pb, MATROSKA_ID_VIDEODISPLAYWIDTH , par->width / display_width_div);
> 
> Ping.
> 

Applied



More information about the ffmpeg-devel mailing list