diff options
author | Luca Barbato <lu_zero@gentoo.org> | 2016-04-02 22:35:44 +0200 |
---|---|---|
committer | Luca Barbato <lu_zero@gentoo.org> | 2016-04-03 19:36:57 +0200 |
commit | e3453fd44480d903338c663238bf280215dd9a07 (patch) | |
tree | 228a3ec2128bb06f9081f2527511427a1d09c3b5 /libavformat/matroskaenc.c | |
parent | b3051a460cf02a5b86ff0d1e14abba23ea55ff6d (diff) | |
download | ffmpeg-e3453fd44480d903338c663238bf280215dd9a07.tar.gz |
matroska: Write the field order information
And bump the document version to 4.
Diffstat (limited to 'libavformat/matroskaenc.c')
-rw-r--r-- | libavformat/matroskaenc.c | 45 |
1 files changed, 43 insertions, 2 deletions
diff --git a/libavformat/matroskaenc.c b/libavformat/matroskaenc.c index ebde61264e..2260d42887 100644 --- a/libavformat/matroskaenc.c +++ b/libavformat/matroskaenc.c @@ -626,6 +626,45 @@ static int mkv_write_codecprivate(AVFormatContext *s, AVIOContext *pb, return ret; } +static void mkv_write_field_order(AVIOContext *pb, + enum AVFieldOrder field_order) +{ + switch (field_order) { + case AV_FIELD_UNKNOWN: + put_ebml_uint(pb, MATROSKA_ID_VIDEOFLAGINTERLACED, + MATROSKA_VIDEO_INTERLACE_FLAG_UNDETERMINED); + break; + case AV_FIELD_PROGRESSIVE: + put_ebml_uint(pb, MATROSKA_ID_VIDEOFLAGINTERLACED, + MATROSKA_VIDEO_INTERLACE_FLAG_PROGRESSIVE); + break; + case AV_FIELD_TT: + case AV_FIELD_BB: + case AV_FIELD_TB: + case AV_FIELD_BT: + put_ebml_uint(pb, MATROSKA_ID_VIDEOFLAGINTERLACED, + MATROSKA_VIDEO_INTERLACE_FLAG_INTERLACED); + switch (field_order) { + case AV_FIELD_TT: + put_ebml_uint(pb, MATROSKA_ID_VIDEOFIELDORDER, + MATROSKA_VIDEO_FIELDORDER_TT); + break; + case AV_FIELD_BB: + put_ebml_uint(pb, MATROSKA_ID_VIDEOFIELDORDER, + MATROSKA_VIDEO_FIELDORDER_BB); + break; + case AV_FIELD_TB: + put_ebml_uint(pb, MATROSKA_ID_VIDEOFIELDORDER, + MATROSKA_VIDEO_FIELDORDER_TB); + break; + case AV_FIELD_BT: + put_ebml_uint(pb, MATROSKA_ID_VIDEOFIELDORDER, + MATROSKA_VIDEO_FIELDORDER_BT); + break; + } + } +} + static int mkv_write_stereo_mode(AVFormatContext *s, AVIOContext *pb, AVStream *st, int mode) { @@ -825,10 +864,12 @@ static int mkv_write_track(AVFormatContext *s, MatroskaMuxContext *mkv, } subinfo = start_ebml_master(pb, MATROSKA_ID_TRACKVIDEO, 0); - // XXX: interlace flag? + put_ebml_uint (pb, MATROSKA_ID_VIDEOPIXELWIDTH , par->width); put_ebml_uint (pb, MATROSKA_ID_VIDEOPIXELHEIGHT, par->height); + mkv_write_field_order(pb, par->field_order); + // check both side data and metadata for stereo information, // write the result to the bitstream if any is found ret = mkv_write_stereo_mode(s, pb, st, mkv->mode); @@ -1145,7 +1186,7 @@ static int mkv_write_header(AVFormatContext *s) put_ebml_uint (pb, EBML_ID_EBMLMAXIDLENGTH , 4); put_ebml_uint (pb, EBML_ID_EBMLMAXSIZELENGTH , 8); put_ebml_string (pb, EBML_ID_DOCTYPE , s->oformat->name); - put_ebml_uint (pb, EBML_ID_DOCTYPEVERSION , 2); + put_ebml_uint (pb, EBML_ID_DOCTYPEVERSION , 4); put_ebml_uint (pb, EBML_ID_DOCTYPEREADVERSION , 2); end_ebml_master(pb, ebml_header); |