Merge commit '48e6432407a73d5006d84609456e6e0bc3dd8fc4'
authorMichael Niedermayer <michaelni@gmx.at>
Tue, 1 Jul 2014 18:44:05 +0000 (20:44 +0200)
committerMichael Niedermayer <michaelni@gmx.at>
Tue, 1 Jul 2014 18:55:42 +0000 (20:55 +0200)
* commit '48e6432407a73d5006d84609456e6e0bc3dd8fc4':
  matroska: Factor out mkv_write_stereo_mode

Conflicts:
libavformat/matroskaenc.c

Merged-by: Michael Niedermayer <michaelni@gmx.at>
1  2 
libavformat/matroskaenc.c

@@@ -680,8 -624,29 +680,22 @@@ static int mkv_write_codecprivate(AVFor
      return ret;
  }
  
 -static void mkv_write_stereo_mode(AVIOContext *pb, uint8_t stereo_fmt,
++static int mkv_write_stereo_mode(AVFormatContext *s, AVIOContext *pb, int st_mode,
+                                   int mode)
+ {
 -    int valid_fmt = 0;
 -
 -    switch (mode) {
 -    case MODE_WEBM:
 -        if (stereo_fmt <= MATROSKA_VIDEO_STEREOMODE_TYPE_TOP_BOTTOM ||
 -            stereo_fmt == MATROSKA_VIDEO_STEREOMODE_TYPE_RIGHT_LEFT)
 -            valid_fmt = 1;
 -        break;
 -    case MODE_MATROSKAv2:
 -        if (stereo_fmt <= MATROSKA_VIDEO_STEREOMODE_TYPE_BOTH_EYES_BLOCK_RL)
 -            valid_fmt = 1;
 -        break;
 -    }
++    if ((mode == MODE_WEBM && st_mode > 3 && st_mode != 11)
++        || st_mode >= MATROSKA_VIDEO_STEREO_MODE_COUNT) {
++        av_log(s, AV_LOG_ERROR,
++               "The specified stereo mode is not valid.\n");
++        return AVERROR(EINVAL);
++    } else
++        put_ebml_uint(pb, MATROSKA_ID_VIDEOSTEREOMODE, st_mode);
 -    if (valid_fmt)
 -        put_ebml_uint (pb, MATROSKA_ID_VIDEOSTEREOMODE, stereo_fmt);
++    return 0;
+ }
  static int mkv_write_track(AVFormatContext *s, MatroskaMuxContext *mkv,
 -                           int i, AVIOContext *pb)
 +                           int i, AVIOContext *pb, int default_stream_exists)
  {
      AVStream *st = s->streams[i];
      AVCodecContext *codec = st->codec;
          // XXX: interlace flag?
          put_ebml_uint (pb, MATROSKA_ID_VIDEOPIXELWIDTH , codec->width);
          put_ebml_uint (pb, MATROSKA_ID_VIDEOPIXELHEIGHT, codec->height);
 -        if ((tag = av_dict_get(s->metadata, "stereo_mode", NULL, 0))) {
 -            mkv_write_stereo_mode(pb, atoi(tag->value), mkv->mode);
 +
 +        if ((tag = av_dict_get(st->metadata, "stereo_mode", NULL, 0)) ||
 +            (tag = av_dict_get( s->metadata, "stereo_mode", NULL, 0))) {
-             // save stereo mode flag
-             uint64_t st_mode = MATROSKA_VIDEO_STEREO_MODE_COUNT;
++            int st_mode = MATROSKA_VIDEO_STEREO_MODE_COUNT;
 +
 +            for (j=0; j<MATROSKA_VIDEO_STEREO_MODE_COUNT; j++)
 +                if (!strcmp(tag->value, ff_matroska_video_stereo_mode[j])){
 +                    st_mode = j;
 +                    break;
 +                }
 +
-             if ((mkv->mode == MODE_WEBM && st_mode > 3 && st_mode != 11)
-                 || st_mode >= MATROSKA_VIDEO_STEREO_MODE_COUNT) {
-                 av_log(s, AV_LOG_ERROR,
-                        "The specified stereo mode is not valid.\n");
++            if (mkv_write_stereo_mode(s, pb, st_mode, mkv->mode) < 0)
 +                return AVERROR(EINVAL);
-             } else
-                 put_ebml_uint(pb, MATROSKA_ID_VIDEOSTEREOMODE, st_mode);
 +
 +            switch (st_mode) {
 +            case 1:
 +            case 8:
 +            case 9:
 +            case 11:
 +                display_width_div = 2;
 +                break;
 +            case 2:
 +            case 3:
 +            case 6:
 +            case 7:
 +                display_height_div = 2;
 +                break;
 +            }
          }
 +
 +        if ((tag = av_dict_get(st->metadata, "alpha_mode", NULL, 0)) ||
 +            (tag = av_dict_get( s->metadata, "alpha_mode", NULL, 0)) ||
 +            (codec->pix_fmt == AV_PIX_FMT_YUVA420P)) {
 +            put_ebml_uint(pb, MATROSKA_ID_VIDEOALPHAMODE, 1);
 +        }
 +
          if (st->sample_aspect_ratio.num) {
 -            int d_width = codec->width*av_q2d(st->sample_aspect_ratio);
 -            put_ebml_uint(pb, MATROSKA_ID_VIDEODISPLAYWIDTH , d_width);
 -            put_ebml_uint(pb, MATROSKA_ID_VIDEODISPLAYHEIGHT, codec->height);
 -            put_ebml_uint(pb, MATROSKA_ID_VIDEODISPLAYUNIT, 3);
 +            int64_t d_width = av_rescale(codec->width, st->sample_aspect_ratio.num, st->sample_aspect_ratio.den);
 +            if (d_width > INT_MAX) {
 +                av_log(s, AV_LOG_ERROR, "Overflow in display width\n");
 +                return AVERROR(EINVAL);
 +            }
 +            put_ebml_uint(pb, MATROSKA_ID_VIDEODISPLAYWIDTH , d_width / display_width_div);
 +            put_ebml_uint(pb, MATROSKA_ID_VIDEODISPLAYHEIGHT, codec->height / display_height_div);
 +        } else if (display_width_div != 1 || display_height_div != 1) {
 +            put_ebml_uint(pb, MATROSKA_ID_VIDEODISPLAYWIDTH , codec->width / display_width_div);
 +            put_ebml_uint(pb, MATROSKA_ID_VIDEODISPLAYHEIGHT, codec->height / display_height_div);
 +        }
 +
 +        if (codec->codec_id == AV_CODEC_ID_RAWVIDEO) {
 +            uint32_t color_space = av_le2ne32(codec->codec_tag);
 +            put_ebml_binary(pb, MATROSKA_ID_VIDEOCOLORSPACE, &color_space, sizeof(color_space));
          }
          end_ebml_master(pb, subinfo);
          break;