Fix frame height vs field height confusion in MXF decoding.
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>
This commit is contained in:
parent
4ed0d182e2
commit
84b9b4aa18
@ -46,6 +46,14 @@ enum MXFMetadataSetType {
|
|||||||
TypeBottom,// add metadata type before this
|
TypeBottom,// add metadata type before this
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum MXFFrameLayout {
|
||||||
|
FullFrame = 0,
|
||||||
|
MixedFields,
|
||||||
|
OneField,
|
||||||
|
SegmentedFrame,
|
||||||
|
SeparateFields
|
||||||
|
};
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
UID key;
|
UID key;
|
||||||
int64_t offset;
|
int64_t offset;
|
||||||
|
@ -142,7 +142,8 @@ typedef struct {
|
|||||||
AVRational sample_rate;
|
AVRational sample_rate;
|
||||||
AVRational aspect_ratio;
|
AVRational aspect_ratio;
|
||||||
int width;
|
int width;
|
||||||
int height;
|
int height; /* Field height, not frame height */
|
||||||
|
int frame_layout; /* See MXFFrameLayout enum */
|
||||||
int channels;
|
int channels;
|
||||||
int bits_per_sample;
|
int bits_per_sample;
|
||||||
unsigned int component_depth;
|
unsigned int component_depth;
|
||||||
@ -832,6 +833,9 @@ static int mxf_read_generic_descriptor(void *arg, AVIOContext *pb, int tag, int
|
|||||||
case 0x3202:
|
case 0x3202:
|
||||||
descriptor->height = avio_rb32(pb);
|
descriptor->height = avio_rb32(pb);
|
||||||
break;
|
break;
|
||||||
|
case 0x320C:
|
||||||
|
descriptor->frame_layout = avio_r8(pb);
|
||||||
|
break;
|
||||||
case 0x320E:
|
case 0x320E:
|
||||||
descriptor->aspect_ratio.num = avio_rb32(pb);
|
descriptor->aspect_ratio.num = avio_rb32(pb);
|
||||||
descriptor->aspect_ratio.den = avio_rb32(pb);
|
descriptor->aspect_ratio.den = avio_rb32(pb);
|
||||||
@ -1493,7 +1497,26 @@ static int mxf_parse_structural_metadata(MXFContext *mxf)
|
|||||||
if (st->codec->codec_id == CODEC_ID_NONE)
|
if (st->codec->codec_id == CODEC_ID_NONE)
|
||||||
st->codec->codec_id = container_ul->id;
|
st->codec->codec_id = container_ul->id;
|
||||||
st->codec->width = descriptor->width;
|
st->codec->width = descriptor->width;
|
||||||
st->codec->height = descriptor->height;
|
st->codec->height = descriptor->height; /* Field height, not frame 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:
|
||||||
|
st->codec->height *= 2; /* Turn field height into frame height. */
|
||||||
|
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) {
|
if (st->codec->codec_id == CODEC_ID_RAWVIDEO) {
|
||||||
st->codec->pix_fmt = descriptor->pix_fmt;
|
st->codec->pix_fmt = descriptor->pix_fmt;
|
||||||
if (st->codec->pix_fmt == PIX_FMT_NONE) {
|
if (st->codec->pix_fmt == PIX_FMT_NONE) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user