mxfdec: fix frame height vs field height confusion

Reviewed-by: Tomas Härdin <tomas.hardin@codemill.se>
Reveiwed-by: Baptiste Coudurier <baptiste.coudurier@gmail.com>
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
Signed-off-by: Luca Barbato <lu_zero@gentoo.org>
pull/59/head
Joseph Artsimovich 13 years ago committed by Luca Barbato
parent 5ed032fb8b
commit 634d670538
  1. 8
      libavformat/mxf.h
  2. 33
      libavformat/mxfdec.c

@ -46,6 +46,14 @@ enum MXFMetadataSetType {
TypeBottom,// add metadata type before this
};
enum MXFFrameLayout {
FullFrame = 0,
MixedFields,
OneField,
SegmentedFrame,
SeparateFields
};
typedef struct {
UID key;
int64_t offset;

@ -132,7 +132,8 @@ typedef struct {
AVRational sample_rate;
AVRational aspect_ratio;
int width;
int height;
int height; /* Field height, not frame height */
int frame_layout; /* See MXFFrameLayout enum */
int channels;
int bits_per_sample;
unsigned int component_depth;
@ -824,6 +825,9 @@ static int mxf_read_generic_descriptor(void *arg, AVIOContext *pb, int tag, int
case 0x3202:
descriptor->height = avio_rb32(pb);
break;
case 0x320C:
descriptor->frame_layout = avio_r8(pb);
break;
case 0x320E:
descriptor->aspect_ratio.num = avio_rb32(pb);
descriptor->aspect_ratio.den = avio_rb32(pb);
@ -1467,7 +1471,34 @@ static int mxf_parse_structural_metadata(MXFContext *mxf)
if (st->codec->codec_id == CODEC_ID_NONE)
st->codec->codec_id = container_ul->id;
st->codec->width = descriptor->width;
/* Field height, not frame height */
st->codec->height = descriptor->height;
switch (descriptor->frame_layout) {
case SegmentedFrame:
/* This one is a weird layout I don't fully understand. */
av_log(mxf->fc, AV_LOG_INFO,
"SegmentedFrame layout isn't currently supported\n");
break;
case FullFrame:
break;
case OneField:
/* Every other line is stored and needs to be duplicated. */
av_log(mxf->fc, AV_LOG_INFO,
"OneField frame layout isn't currently supported\n");
break;
/* The correct thing to do here is fall through, but by
* breaking we might be able to decode some streams at half
* the vertical resolution, rather than not al all.
* It's also for compatibility with the old behavior. */
case SeparateFields:
case MixedFields:
/* Turn field height into frame height. */
st->codec->height *= 2;
default:
av_log(mxf->fc, AV_LOG_INFO,
"Unknown frame layout type: %d\n",
descriptor->frame_layout);
}
if (st->codec->codec_id == CODEC_ID_RAWVIDEO) {
st->codec->pix_fmt = descriptor->pix_fmt;
if (st->codec->pix_fmt == PIX_FMT_NONE) {

Loading…
Cancel
Save