Merge commit 'e3453fd44480d903338c663238bf280215dd9a07'
authorDerek Buitenhuis <derek.buitenhuis@gmail.com>
Sun, 8 May 2016 22:25:58 +0000 (23:25 +0100)
committerDerek Buitenhuis <derek.buitenhuis@gmail.com>
Sun, 8 May 2016 22:25:58 +0000 (23:25 +0100)
* commit 'e3453fd44480d903338c663238bf280215dd9a07':
  matroska: Write the field order information

Merged-by: Derek Buitenhuis <derek.buitenhuis@gmail.com>
1  2 
libavformat/matroskaenc.c
tests/ref/lavf/mkv
tests/ref/seek/lavf-mkv

@@@ -731,70 -626,52 +731,108 @@@ static int mkv_write_codecprivate(AVFor
      return ret;
  }
  
 +static int mkv_write_video_color(AVIOContext *pb, AVCodecParameters *par, AVStream *st) {
 +    int side_data_size = 0;
 +    const uint8_t *side_data = av_stream_get_side_data(
 +        st, AV_PKT_DATA_MASTERING_DISPLAY_METADATA, &side_data_size);
 +    ebml_master colorinfo = start_ebml_master(pb, MATROSKA_ID_VIDEOCOLOR, 0);
 +
 +    if (par->color_trc != AVCOL_TRC_UNSPECIFIED &&
 +        par->color_trc < AVCOL_TRC_NB) {
 +        put_ebml_uint(pb, MATROSKA_ID_VIDEOCOLORTRANSFERCHARACTERISTICS,
 +                      par->color_trc);
 +    }
 +    if (par->color_space != AVCOL_SPC_UNSPECIFIED &&
 +        par->color_space < AVCOL_SPC_NB) {
 +        put_ebml_uint(pb, MATROSKA_ID_VIDEOCOLORMATRIXCOEFF, par->color_space);
 +    }
 +    if (par->color_primaries != AVCOL_PRI_UNSPECIFIED &&
 +        par->color_primaries < AVCOL_PRI_NB) {
 +        put_ebml_uint(pb, MATROSKA_ID_VIDEOCOLORPRIMARIES, par->color_primaries);
 +    }
 +    if (par->color_range != AVCOL_RANGE_UNSPECIFIED &&
 +        par->color_range < AVCOL_RANGE_NB) {
 +        put_ebml_uint(pb, MATROSKA_ID_VIDEOCOLORRANGE, par->color_range);
 +    }
 +    if (side_data_size == sizeof(AVMasteringDisplayMetadata)) {
 +        ebml_master meta_element = start_ebml_master(
 +            pb, MATROSKA_ID_VIDEOCOLORMASTERINGMETA, 0);
 +        const AVMasteringDisplayMetadata *metadata =
 +            (const AVMasteringDisplayMetadata*)side_data;
 +        if (metadata->has_primaries) {
 +            put_ebml_float(pb, MATROSKA_ID_VIDEOCOLOR_RX,
 +                           av_q2d(metadata->display_primaries[0][0]));
 +            put_ebml_float(pb, MATROSKA_ID_VIDEOCOLOR_RY,
 +                           av_q2d(metadata->display_primaries[0][1]));
 +            put_ebml_float(pb, MATROSKA_ID_VIDEOCOLOR_GX,
 +                           av_q2d(metadata->display_primaries[1][0]));
 +            put_ebml_float(pb, MATROSKA_ID_VIDEOCOLOR_GY,
 +                           av_q2d(metadata->display_primaries[1][1]));
 +            put_ebml_float(pb, MATROSKA_ID_VIDEOCOLOR_BX,
 +                           av_q2d(metadata->display_primaries[2][0]));
 +            put_ebml_float(pb, MATROSKA_ID_VIDEOCOLOR_BY,
 +                           av_q2d(metadata->display_primaries[2][1]));
 +            put_ebml_float(pb, MATROSKA_ID_VIDEOCOLOR_WHITEX,
 +                           av_q2d(metadata->white_point[0]));
 +            put_ebml_float(pb, MATROSKA_ID_VIDEOCOLOR_WHITEY,
 +                           av_q2d(metadata->white_point[1]));
 +        }
 +        if (metadata->has_luminance) {
 +            put_ebml_float(pb, MATROSKA_ID_VIDEOCOLOR_LUMINANCEMAX,
 +                           av_q2d(metadata->max_luminance));
 +            put_ebml_float(pb, MATROSKA_ID_VIDEOCOLOR_LUMINANCEMIN,
 +                           av_q2d(metadata->min_luminance));
 +        }
 +        end_ebml_master(pb, meta_element);
 +    }
 +    end_ebml_master(pb, colorinfo);
 +    return 0;
 +}
 +
+ 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)
 +                                 AVStream *st, int mode, int *h_width, int *h_height)
  {
      int i;
 -    int display_width, display_height;
 -    int h_width = 1, h_height = 1;
 -    AVCodecParameters *par = st->codecpar;
 +    int ret = 0;
      AVDictionaryEntry *tag;
      MatroskaVideoStereoModeType format = MATROSKA_VIDEO_STEREOMODE_TYPE_NB;
  
@@@ -1045,11 -868,11 +1083,14 @@@ static int mkv_write_track(AVFormatCont
          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);
++        if (mkv->mode != MODE_WEBM)
++            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);
 +        ret = mkv_write_stereo_mode(s, pb, st, mkv->mode,
 +                                    &display_width_div,
 +                                    &display_height_div);
          if (ret < 0)
              return ret;
  
@@@ -1,6 -1,3 +1,6 @@@
- 7c6509f597fb57bab002cbceec960011 *./tests/data/lavf/lavf.mkv
- 472872 ./tests/data/lavf/lavf.mkv
 -76d400179dfd6143f50ea4d19fe8ed99 *./tests/data/lavf/lavf.mkv
 -320383 ./tests/data/lavf/lavf.mkv
 -./tests/data/lavf/lavf.mkv CRC=0x36193cda
++c081514c38735524ab09dbd2a498b7b3 *./tests/data/lavf/lavf.mkv
++472875 ./tests/data/lavf/lavf.mkv
 +./tests/data/lavf/lavf.mkv CRC=0xec6c3c68
- 5f8cb4b7e98610347dd8d0d58a828a0f *./tests/data/lavf/lavf.mkv
- 320548 ./tests/data/lavf/lavf.mkv
++d1fc3a31150d00aebbd674862640f701 *./tests/data/lavf/lavf.mkv
++320551 ./tests/data/lavf/lavf.mkv
 +./tests/data/lavf/lavf.mkv CRC=0xec6c3c68
@@@ -1,48 -1,53 +1,48 @@@
- ret: 0         st: 1 flags:1 dts: 0.000000 pts: 0.000000 pos:    797 size:   208
 -ret: 0         st: 1 flags:1 dts:-0.011000 pts:-0.011000 pos:    633 size:   208
++ret: 0         st: 1 flags:1 dts: 0.000000 pts: 0.000000 pos:    800 size:   208
  ret: 0         st:-1 flags:0  ts:-1.000000
- ret: 0         st: 0 flags:1 dts: 0.011000 pts: 0.011000 pos:   1013 size: 27837
 -ret: 0         st: 1 flags:1 dts:-0.011000 pts:-0.011000 pos:    633 size:   208
++ret: 0         st: 0 flags:1 dts: 0.011000 pts: 0.011000 pos:   1016 size: 27837
  ret: 0         st:-1 flags:1  ts: 1.894167
- ret: 0         st: 0 flags:1 dts: 0.971000 pts: 0.971000 pos: 292427 size: 27834
 -ret: 0         st: 0 flags:1 dts: 0.971000 pts: 0.971000 pos: 292271 size: 27834
++ret: 0         st: 0 flags:1 dts: 0.971000 pts: 0.971000 pos: 292430 size: 27834
  ret: 0         st: 0 flags:0  ts: 0.788000
- ret: 0         st: 0 flags:1 dts: 0.971000 pts: 0.971000 pos: 292427 size: 27834
 -ret: 0         st: 0 flags:1 dts: 0.971000 pts: 0.971000 pos: 292271 size: 27834
++ret: 0         st: 0 flags:1 dts: 0.971000 pts: 0.971000 pos: 292430 size: 27834
  ret: 0         st: 0 flags:1  ts:-0.317000
- ret: 0         st: 0 flags:1 dts: 0.011000 pts: 0.011000 pos:   1013 size: 27837
 -ret: 0         st: 1 flags:1 dts:-0.011000 pts:-0.011000 pos:    633 size:   208
 -ret: 0         st: 1 flags:0  ts: 2.577000
 -ret:-EOF
++ret: 0         st: 0 flags:1 dts: 0.011000 pts: 0.011000 pos:   1016 size: 27837
 +ret:-1         st: 1 flags:0  ts: 2.577000
  ret: 0         st: 1 flags:1  ts: 1.471000
- ret: 0         st: 1 flags:1 dts: 0.993000 pts: 0.993000 pos: 320268 size:   209
 -ret: 0         st: 1 flags:1 dts: 0.982000 pts: 0.982000 pos: 320112 size:   209
++ret: 0         st: 1 flags:1 dts: 0.993000 pts: 0.993000 pos: 320271 size:   209
  ret: 0         st:-1 flags:0  ts: 0.365002
- ret: 0         st: 0 flags:1 dts: 0.491000 pts: 0.491000 pos: 146980 size: 27925
 -ret: 0         st: 0 flags:1 dts: 0.491000 pts: 0.491000 pos: 146824 size: 27925
++ret: 0         st: 0 flags:1 dts: 0.491000 pts: 0.491000 pos: 146983 size: 27925
  ret: 0         st:-1 flags:1  ts:-0.740831
- ret: 0         st: 0 flags:1 dts: 0.011000 pts: 0.011000 pos:   1013 size: 27837
 -ret: 0         st: 1 flags:1 dts:-0.011000 pts:-0.011000 pos:    633 size:   208
 -ret: 0         st: 0 flags:0  ts: 2.153000
 -ret:-EOF
++ret: 0         st: 0 flags:1 dts: 0.011000 pts: 0.011000 pos:   1016 size: 27837
 +ret:-1         st: 0 flags:0  ts: 2.153000
  ret: 0         st: 0 flags:1  ts: 1.048000
- ret: 0         st: 0 flags:1 dts: 0.971000 pts: 0.971000 pos: 292427 size: 27834
 -ret: 0         st: 0 flags:1 dts: 0.971000 pts: 0.971000 pos: 292271 size: 27834
++ret: 0         st: 0 flags:1 dts: 0.971000 pts: 0.971000 pos: 292430 size: 27834
  ret: 0         st: 1 flags:0  ts:-0.058000
- ret: 0         st: 1 flags:1 dts: 0.000000 pts: 0.000000 pos:    797 size:   208
 -ret: 0         st: 1 flags:1 dts:-0.011000 pts:-0.011000 pos:    633 size:   208
++ret: 0         st: 1 flags:1 dts: 0.000000 pts: 0.000000 pos:    800 size:   208
  ret: 0         st: 1 flags:1  ts: 2.836000
- ret: 0         st: 1 flags:1 dts: 0.993000 pts: 0.993000 pos: 320268 size:   209
 -ret: 0         st: 1 flags:1 dts: 0.982000 pts: 0.982000 pos: 320112 size:   209
 -ret: 0         st:-1 flags:0  ts: 1.730004
 -ret:-EOF
++ret: 0         st: 1 flags:1 dts: 0.993000 pts: 0.993000 pos: 320271 size:   209
 +ret:-1         st:-1 flags:0  ts: 1.730004
  ret: 0         st:-1 flags:1  ts: 0.624171
- ret: 0         st: 0 flags:1 dts: 0.491000 pts: 0.491000 pos: 146980 size: 27925
 -ret: 0         st: 0 flags:1 dts: 0.491000 pts: 0.491000 pos: 146824 size: 27925
++ret: 0         st: 0 flags:1 dts: 0.491000 pts: 0.491000 pos: 146983 size: 27925
  ret: 0         st: 0 flags:0  ts:-0.482000
- ret: 0         st: 0 flags:1 dts: 0.011000 pts: 0.011000 pos:   1013 size: 27837
 -ret: 0         st: 1 flags:1 dts:-0.011000 pts:-0.011000 pos:    633 size:   208
++ret: 0         st: 0 flags:1 dts: 0.011000 pts: 0.011000 pos:   1016 size: 27837
  ret: 0         st: 0 flags:1  ts: 2.413000
- ret: 0         st: 0 flags:1 dts: 0.971000 pts: 0.971000 pos: 292427 size: 27834
 -ret: 0         st: 0 flags:1 dts: 0.971000 pts: 0.971000 pos: 292271 size: 27834
 -ret: 0         st: 1 flags:0  ts: 1.307000
 -ret:-EOF
++ret: 0         st: 0 flags:1 dts: 0.971000 pts: 0.971000 pos: 292430 size: 27834
 +ret:-1         st: 1 flags:0  ts: 1.307000
  ret: 0         st: 1 flags:1  ts: 0.201000
- ret: 0         st: 1 flags:1 dts: 0.000000 pts: 0.000000 pos:    797 size:   208
 -ret: 0         st: 1 flags:1 dts:-0.011000 pts:-0.011000 pos:    633 size:   208
++ret: 0         st: 1 flags:1 dts: 0.000000 pts: 0.000000 pos:    800 size:   208
  ret: 0         st:-1 flags:0  ts:-0.904994
- ret: 0         st: 0 flags:1 dts: 0.011000 pts: 0.011000 pos:   1013 size: 27837
 -ret: 0         st: 1 flags:1 dts:-0.011000 pts:-0.011000 pos:    633 size:   208
++ret: 0         st: 0 flags:1 dts: 0.011000 pts: 0.011000 pos:   1016 size: 27837
  ret: 0         st:-1 flags:1  ts: 1.989173
- ret: 0         st: 0 flags:1 dts: 0.971000 pts: 0.971000 pos: 292427 size: 27834
 -ret: 0         st: 0 flags:1 dts: 0.971000 pts: 0.971000 pos: 292271 size: 27834
++ret: 0         st: 0 flags:1 dts: 0.971000 pts: 0.971000 pos: 292430 size: 27834
  ret: 0         st: 0 flags:0  ts: 0.883000
- ret: 0         st: 0 flags:1 dts: 0.971000 pts: 0.971000 pos: 292427 size: 27834
 -ret: 0         st: 0 flags:1 dts: 0.971000 pts: 0.971000 pos: 292271 size: 27834
++ret: 0         st: 0 flags:1 dts: 0.971000 pts: 0.971000 pos: 292430 size: 27834
  ret: 0         st: 0 flags:1  ts:-0.222000
- ret: 0         st: 0 flags:1 dts: 0.011000 pts: 0.011000 pos:   1013 size: 27837
 -ret: 0         st: 1 flags:1 dts:-0.011000 pts:-0.011000 pos:    633 size:   208
 -ret: 0         st: 1 flags:0  ts: 2.672000
 -ret:-EOF
++ret: 0         st: 0 flags:1 dts: 0.011000 pts: 0.011000 pos:   1016 size: 27837
 +ret:-1         st: 1 flags:0  ts: 2.672000
  ret: 0         st: 1 flags:1  ts: 1.566000
- ret: 0         st: 1 flags:1 dts: 0.993000 pts: 0.993000 pos: 320268 size:   209
 -ret: 0         st: 1 flags:1 dts: 0.982000 pts: 0.982000 pos: 320112 size:   209
++ret: 0         st: 1 flags:1 dts: 0.993000 pts: 0.993000 pos: 320271 size:   209
  ret: 0         st:-1 flags:0  ts: 0.460008
- ret: 0         st: 0 flags:1 dts: 0.491000 pts: 0.491000 pos: 146980 size: 27925
 -ret: 0         st: 0 flags:1 dts: 0.491000 pts: 0.491000 pos: 146824 size: 27925
++ret: 0         st: 0 flags:1 dts: 0.491000 pts: 0.491000 pos: 146983 size: 27925
  ret: 0         st:-1 flags:1  ts:-0.645825
- ret: 0         st: 0 flags:1 dts: 0.011000 pts: 0.011000 pos:   1013 size: 27837
 -ret: 0         st: 1 flags:1 dts:-0.011000 pts:-0.011000 pos:    633 size:   208
++ret: 0         st: 0 flags:1 dts: 0.011000 pts: 0.011000 pos:   1016 size: 27837