mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2025-03-28 12:32:17 +02:00
avformat/matroskadec: set aspect ratio only when DisplayWidth and DisplayHeight are in pixels
A missing DisplayUnit element or one with the default value of 0 means DisplayWidth and DisplayHeight should be interpreted as pixels. The current code setting st->sample_aspect_ratio is wrong when DisplayUnit is anything else. Reviewed-by: Carl Eugen Hoyos <ceffmpeg@gmail.com> Signed-off-by: James Almer <jamrial@gmail.com>
This commit is contained in:
parent
8e53c1567c
commit
bad8bbc26a
@ -309,6 +309,14 @@ typedef enum {
|
|||||||
MATROSKA_VIDEO_STEREOMODE_TYPE_NB,
|
MATROSKA_VIDEO_STEREOMODE_TYPE_NB,
|
||||||
} MatroskaVideoStereoModeType;
|
} MatroskaVideoStereoModeType;
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
MATROSKA_VIDEO_DISPLAYUNIT_PIXELS = 0,
|
||||||
|
MATROSKA_VIDEO_DISPLAYUNIT_CENTIMETERS = 1,
|
||||||
|
MATROSKA_VIDEO_DISPLAYUNIT_INCHES = 2,
|
||||||
|
MATROSKA_VIDEO_DISPLAYUNIT_DAR = 3,
|
||||||
|
MATROSKA_VIDEO_DISPLAYUNIT_UNKNOWN = 4,
|
||||||
|
} MatroskaVideoDisplayUnit;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Matroska Codec IDs, strings
|
* Matroska Codec IDs, strings
|
||||||
*/
|
*/
|
||||||
|
@ -168,6 +168,7 @@ typedef struct MatroskaTrackVideo {
|
|||||||
uint64_t pixel_width;
|
uint64_t pixel_width;
|
||||||
uint64_t pixel_height;
|
uint64_t pixel_height;
|
||||||
EbmlBin color_space;
|
EbmlBin color_space;
|
||||||
|
uint64_t display_unit;
|
||||||
uint64_t interlaced;
|
uint64_t interlaced;
|
||||||
uint64_t field_order;
|
uint64_t field_order;
|
||||||
uint64_t stereo_mode;
|
uint64_t stereo_mode;
|
||||||
@ -436,7 +437,7 @@ static const EbmlSyntax matroska_track_video[] = {
|
|||||||
{ MATROSKA_ID_VIDEOPIXELCROPT, EBML_NONE },
|
{ MATROSKA_ID_VIDEOPIXELCROPT, EBML_NONE },
|
||||||
{ MATROSKA_ID_VIDEOPIXELCROPL, EBML_NONE },
|
{ MATROSKA_ID_VIDEOPIXELCROPL, EBML_NONE },
|
||||||
{ MATROSKA_ID_VIDEOPIXELCROPR, EBML_NONE },
|
{ MATROSKA_ID_VIDEOPIXELCROPR, EBML_NONE },
|
||||||
{ MATROSKA_ID_VIDEODISPLAYUNIT, EBML_NONE },
|
{ MATROSKA_ID_VIDEODISPLAYUNIT, EBML_UINT, 0, offsetof(MatroskaTrackVideo, display_unit), { .u= MATROSKA_VIDEO_DISPLAYUNIT_PIXELS } },
|
||||||
{ MATROSKA_ID_VIDEOFLAGINTERLACED, EBML_UINT, 0, offsetof(MatroskaTrackVideo, interlaced), { .u = MATROSKA_VIDEO_INTERLACE_FLAG_UNDETERMINED } },
|
{ MATROSKA_ID_VIDEOFLAGINTERLACED, EBML_UINT, 0, offsetof(MatroskaTrackVideo, interlaced), { .u = MATROSKA_VIDEO_INTERLACE_FLAG_UNDETERMINED } },
|
||||||
{ MATROSKA_ID_VIDEOFIELDORDER, EBML_UINT, 0, offsetof(MatroskaTrackVideo, field_order), { .u = MATROSKA_VIDEO_FIELDORDER_UNDETERMINED } },
|
{ MATROSKA_ID_VIDEOFIELDORDER, EBML_UINT, 0, offsetof(MatroskaTrackVideo, field_order), { .u = MATROSKA_VIDEO_FIELDORDER_UNDETERMINED } },
|
||||||
{ MATROSKA_ID_VIDEOSTEREOMODE, EBML_UINT, 0, offsetof(MatroskaTrackVideo, stereo_mode), { .u = MATROSKA_VIDEO_STEREOMODE_TYPE_NB } },
|
{ MATROSKA_ID_VIDEOSTEREOMODE, EBML_UINT, 0, offsetof(MatroskaTrackVideo, stereo_mode), { .u = MATROSKA_VIDEO_STEREOMODE_TYPE_NB } },
|
||||||
@ -2296,11 +2297,13 @@ static int matroska_parse_tracks(AVFormatContext *s)
|
|||||||
if (track->video.stereo_mode && track->video.stereo_mode < MATROSKA_VIDEO_STEREOMODE_TYPE_NB)
|
if (track->video.stereo_mode && track->video.stereo_mode < MATROSKA_VIDEO_STEREOMODE_TYPE_NB)
|
||||||
mkv_stereo_mode_display_mul(track->video.stereo_mode, &display_width_mul, &display_height_mul);
|
mkv_stereo_mode_display_mul(track->video.stereo_mode, &display_width_mul, &display_height_mul);
|
||||||
|
|
||||||
av_reduce(&st->sample_aspect_ratio.num,
|
if (track->video.display_unit == MATROSKA_VIDEO_DISPLAYUNIT_PIXELS) {
|
||||||
&st->sample_aspect_ratio.den,
|
av_reduce(&st->sample_aspect_ratio.num,
|
||||||
st->codecpar->height * track->video.display_width * display_width_mul,
|
&st->sample_aspect_ratio.den,
|
||||||
st->codecpar->width * track->video.display_height * display_height_mul,
|
st->codecpar->height * track->video.display_width * display_width_mul,
|
||||||
255);
|
st->codecpar->width * track->video.display_height * display_height_mul,
|
||||||
|
255);
|
||||||
|
}
|
||||||
if (st->codecpar->codec_id != AV_CODEC_ID_HEVC)
|
if (st->codecpar->codec_id != AV_CODEC_ID_HEVC)
|
||||||
st->need_parsing = AVSTREAM_PARSE_HEADERS;
|
st->need_parsing = AVSTREAM_PARSE_HEADERS;
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user