You've already forked FFmpeg
mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2025-08-15 14:13:16 +02:00
avformat/movenc: set XDCAM codec tag correctly
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
This commit is contained in:
@@ -897,6 +897,65 @@ static AVRational find_fps(AVFormatContext *s, AVStream *st)
|
|||||||
return rate;
|
return rate;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int mov_get_mpeg2_xdcam_codec_tag(AVFormatContext *s, MOVTrack *track)
|
||||||
|
{
|
||||||
|
int tag = MKTAG('m', '2', 'v', '1'); //fallback tag
|
||||||
|
int interlaced = track->enc->field_order > AV_FIELD_PROGRESSIVE;
|
||||||
|
AVStream *st = track->st;
|
||||||
|
int rate = av_q2d(find_fps(s, st));
|
||||||
|
|
||||||
|
if (track->enc->pix_fmt == AV_PIX_FMT_YUV420P) {
|
||||||
|
if (track->enc->width == 1280 && track->enc->height == 720) {
|
||||||
|
if (!interlaced) {
|
||||||
|
if (rate == 24) tag = MKTAG('x','d','v','4');
|
||||||
|
else if (rate == 25) tag = MKTAG('x','d','v','5');
|
||||||
|
else if (rate == 30) tag = MKTAG('x','d','v','1');
|
||||||
|
else if (rate == 50) tag = MKTAG('x','d','v','a');
|
||||||
|
else if (rate == 60) tag = MKTAG('x','d','v','9');
|
||||||
|
}
|
||||||
|
} else if (track->enc->width == 1440 && track->enc->height == 1080) {
|
||||||
|
if (!interlaced) {
|
||||||
|
if (rate == 24) tag = MKTAG('x','d','v','6');
|
||||||
|
else if (rate == 25) tag = MKTAG('x','d','v','7');
|
||||||
|
else if (rate == 30) tag = MKTAG('x','d','v','8');
|
||||||
|
} else {
|
||||||
|
if (rate == 25) tag = MKTAG('x','d','v','3');
|
||||||
|
else if (rate == 30) tag = MKTAG('x','d','v','2');
|
||||||
|
}
|
||||||
|
} else if (track->enc->width == 1920 && track->enc->height == 1080) {
|
||||||
|
if (!interlaced) {
|
||||||
|
if (rate == 24) tag = MKTAG('x','d','v','d');
|
||||||
|
else if (rate == 25) tag = MKTAG('x','d','v','e');
|
||||||
|
else if (rate == 30) tag = MKTAG('x','d','v','f');
|
||||||
|
} else {
|
||||||
|
if (rate == 25) tag = MKTAG('x','d','v','c');
|
||||||
|
else if (rate == 30) tag = MKTAG('x','d','v','b');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else if (track->enc->pix_fmt == AV_PIX_FMT_YUV422P) {
|
||||||
|
if (track->enc->width == 1280 && track->enc->height == 720) {
|
||||||
|
if (!interlaced) {
|
||||||
|
if (rate == 24) tag = MKTAG('x','d','5','4');
|
||||||
|
else if (rate == 25) tag = MKTAG('x','d','5','5');
|
||||||
|
else if (rate == 30) tag = MKTAG('x','d','5','1');
|
||||||
|
else if (rate == 50) tag = MKTAG('x','d','5','a');
|
||||||
|
else if (rate == 60) tag = MKTAG('x','d','5','9');
|
||||||
|
}
|
||||||
|
} else if (track->enc->width == 1920 && track->enc->height == 1080) {
|
||||||
|
if (!interlaced) {
|
||||||
|
if (rate == 24) tag = MKTAG('x','d','5','d');
|
||||||
|
else if (rate == 25) tag = MKTAG('x','d','5','e');
|
||||||
|
else if (rate == 30) tag = MKTAG('x','d','5','f');
|
||||||
|
} else {
|
||||||
|
if (rate == 25) tag = MKTAG('x','d','5','c');
|
||||||
|
else if (rate == 30) tag = MKTAG('x','d','5','b');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return tag;
|
||||||
|
}
|
||||||
|
|
||||||
static const struct {
|
static const struct {
|
||||||
enum AVPixelFormat pix_fmt;
|
enum AVPixelFormat pix_fmt;
|
||||||
uint32_t tag;
|
uint32_t tag;
|
||||||
@@ -944,11 +1003,14 @@ static int mov_get_codec_tag(AVFormatContext *s, MOVTrack *track)
|
|||||||
(track->enc->codec_id == AV_CODEC_ID_DVVIDEO ||
|
(track->enc->codec_id == AV_CODEC_ID_DVVIDEO ||
|
||||||
track->enc->codec_id == AV_CODEC_ID_RAWVIDEO ||
|
track->enc->codec_id == AV_CODEC_ID_RAWVIDEO ||
|
||||||
track->enc->codec_id == AV_CODEC_ID_H263 ||
|
track->enc->codec_id == AV_CODEC_ID_H263 ||
|
||||||
|
track->enc->codec_id == AV_CODEC_ID_MPEG2VIDEO ||
|
||||||
av_get_bits_per_sample(track->enc->codec_id)))) { // pcm audio
|
av_get_bits_per_sample(track->enc->codec_id)))) { // pcm audio
|
||||||
if (track->enc->codec_id == AV_CODEC_ID_DVVIDEO)
|
if (track->enc->codec_id == AV_CODEC_ID_DVVIDEO)
|
||||||
tag = mov_get_dv_codec_tag(s, track);
|
tag = mov_get_dv_codec_tag(s, track);
|
||||||
else if (track->enc->codec_id == AV_CODEC_ID_RAWVIDEO)
|
else if (track->enc->codec_id == AV_CODEC_ID_RAWVIDEO)
|
||||||
tag = mov_get_rawvideo_codec_tag(s, track);
|
tag = mov_get_rawvideo_codec_tag(s, track);
|
||||||
|
else if (track->enc->codec_id == AV_CODEC_ID_MPEG2VIDEO)
|
||||||
|
tag = mov_get_mpeg2_xdcam_codec_tag(s, track);
|
||||||
else if (track->enc->codec_type == AVMEDIA_TYPE_VIDEO) {
|
else if (track->enc->codec_type == AVMEDIA_TYPE_VIDEO) {
|
||||||
tag = ff_codec_get_tag(ff_codec_movvideo_tags, track->enc->codec_id);
|
tag = ff_codec_get_tag(ff_codec_movvideo_tags, track->enc->codec_id);
|
||||||
if (!tag) { // if no mac fcc found, try with Microsoft tags
|
if (!tag) { // if no mac fcc found, try with Microsoft tags
|
||||||
|
Reference in New Issue
Block a user