mirror of
https://github.com/xenia-project/FFmpeg.git
synced 2025-02-19 11:31:43 +00:00
tools: Port to codec parameters API
This commit is contained in:
parent
393596f9d5
commit
b8de14bcdf
@ -450,40 +450,40 @@ fail:
|
|||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int get_private_data(struct Track *track, AVCodecContext *codec)
|
static int get_private_data(struct Track *track, AVCodecParameters *codecpar)
|
||||||
{
|
{
|
||||||
track->codec_private_size = codec->extradata_size;
|
track->codec_private_size = codecpar->extradata_size;
|
||||||
track->codec_private = av_mallocz(codec->extradata_size);
|
track->codec_private = av_mallocz(codecpar->extradata_size);
|
||||||
if (!track->codec_private)
|
if (!track->codec_private)
|
||||||
return AVERROR(ENOMEM);
|
return AVERROR(ENOMEM);
|
||||||
memcpy(track->codec_private, codec->extradata, codec->extradata_size);
|
memcpy(track->codec_private, codecpar->extradata, codecpar->extradata_size);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int get_video_private_data(struct Track *track, AVCodecContext *codec)
|
static int get_video_private_data(struct Track *track, AVCodecParameters *codecpar)
|
||||||
{
|
{
|
||||||
AVIOContext *io = NULL;
|
AVIOContext *io = NULL;
|
||||||
uint16_t sps_size, pps_size;
|
uint16_t sps_size, pps_size;
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
if (codec->codec_id == AV_CODEC_ID_VC1)
|
if (codecpar->codec_id == AV_CODEC_ID_VC1)
|
||||||
return get_private_data(track, codec);
|
return get_private_data(track, codecpar);
|
||||||
|
|
||||||
if ((err = avio_open_dyn_buf(&io)) < 0)
|
if ((err = avio_open_dyn_buf(&io)) < 0)
|
||||||
goto fail;
|
goto fail;
|
||||||
err = AVERROR(EINVAL);
|
err = AVERROR(EINVAL);
|
||||||
if (codec->extradata_size < 11 || codec->extradata[0] != 1)
|
if (codecpar->extradata_size < 11 || codecpar->extradata[0] != 1)
|
||||||
goto fail;
|
goto fail;
|
||||||
sps_size = AV_RB16(&codec->extradata[6]);
|
sps_size = AV_RB16(&codecpar->extradata[6]);
|
||||||
if (11 + sps_size > codec->extradata_size)
|
if (11 + sps_size > codecpar->extradata_size)
|
||||||
goto fail;
|
goto fail;
|
||||||
avio_wb32(io, 0x00000001);
|
avio_wb32(io, 0x00000001);
|
||||||
avio_write(io, &codec->extradata[8], sps_size);
|
avio_write(io, &codecpar->extradata[8], sps_size);
|
||||||
pps_size = AV_RB16(&codec->extradata[9 + sps_size]);
|
pps_size = AV_RB16(&codecpar->extradata[9 + sps_size]);
|
||||||
if (11 + sps_size + pps_size > codec->extradata_size)
|
if (11 + sps_size + pps_size > codecpar->extradata_size)
|
||||||
goto fail;
|
goto fail;
|
||||||
avio_wb32(io, 0x00000001);
|
avio_wb32(io, 0x00000001);
|
||||||
avio_write(io, &codec->extradata[11 + sps_size], pps_size);
|
avio_write(io, &codecpar->extradata[11 + sps_size], pps_size);
|
||||||
err = 0;
|
err = 0;
|
||||||
|
|
||||||
fail:
|
fail:
|
||||||
@ -523,7 +523,7 @@ static int handle_file(struct Tracks *tracks, const char *file, int split,
|
|||||||
struct Track **temp;
|
struct Track **temp;
|
||||||
AVStream *st = ctx->streams[i];
|
AVStream *st = ctx->streams[i];
|
||||||
|
|
||||||
if (st->codec->bit_rate == 0) {
|
if (st->codecpar->bit_rate == 0) {
|
||||||
fprintf(stderr, "Skipping track %d in %s as it has zero bitrate\n",
|
fprintf(stderr, "Skipping track %d in %s as it has zero bitrate\n",
|
||||||
st->id, file);
|
st->id, file);
|
||||||
continue;
|
continue;
|
||||||
@ -548,12 +548,12 @@ static int handle_file(struct Tracks *tracks, const char *file, int split,
|
|||||||
if ((ptr = strrchr(file, '/')))
|
if ((ptr = strrchr(file, '/')))
|
||||||
track->name = ptr + 1;
|
track->name = ptr + 1;
|
||||||
|
|
||||||
track->bitrate = st->codec->bit_rate;
|
track->bitrate = st->codecpar->bit_rate;
|
||||||
track->track_id = st->id;
|
track->track_id = st->id;
|
||||||
track->timescale = st->time_base.den;
|
track->timescale = st->time_base.den;
|
||||||
track->duration = st->duration;
|
track->duration = st->duration;
|
||||||
track->is_audio = st->codec->codec_type == AVMEDIA_TYPE_AUDIO;
|
track->is_audio = st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO;
|
||||||
track->is_video = st->codec->codec_type == AVMEDIA_TYPE_VIDEO;
|
track->is_video = st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO;
|
||||||
|
|
||||||
if (!track->is_audio && !track->is_video) {
|
if (!track->is_audio && !track->is_video) {
|
||||||
fprintf(stderr,
|
fprintf(stderr,
|
||||||
@ -571,30 +571,30 @@ static int handle_file(struct Tracks *tracks, const char *file, int split,
|
|||||||
if (tracks->audio_track < 0)
|
if (tracks->audio_track < 0)
|
||||||
tracks->audio_track = tracks->nb_tracks;
|
tracks->audio_track = tracks->nb_tracks;
|
||||||
tracks->nb_audio_tracks++;
|
tracks->nb_audio_tracks++;
|
||||||
track->channels = st->codec->channels;
|
track->channels = st->codecpar->channels;
|
||||||
track->sample_rate = st->codec->sample_rate;
|
track->sample_rate = st->codecpar->sample_rate;
|
||||||
if (st->codec->codec_id == AV_CODEC_ID_AAC) {
|
if (st->codecpar->codec_id == AV_CODEC_ID_AAC) {
|
||||||
track->fourcc = "AACL";
|
track->fourcc = "AACL";
|
||||||
track->tag = 255;
|
track->tag = 255;
|
||||||
track->blocksize = 4;
|
track->blocksize = 4;
|
||||||
} else if (st->codec->codec_id == AV_CODEC_ID_WMAPRO) {
|
} else if (st->codecpar->codec_id == AV_CODEC_ID_WMAPRO) {
|
||||||
track->fourcc = "WMAP";
|
track->fourcc = "WMAP";
|
||||||
track->tag = st->codec->codec_tag;
|
track->tag = st->codecpar->codec_tag;
|
||||||
track->blocksize = st->codec->block_align;
|
track->blocksize = st->codecpar->block_align;
|
||||||
}
|
}
|
||||||
get_private_data(track, st->codec);
|
get_private_data(track, st->codecpar);
|
||||||
}
|
}
|
||||||
if (track->is_video) {
|
if (track->is_video) {
|
||||||
if (tracks->video_track < 0)
|
if (tracks->video_track < 0)
|
||||||
tracks->video_track = tracks->nb_tracks;
|
tracks->video_track = tracks->nb_tracks;
|
||||||
tracks->nb_video_tracks++;
|
tracks->nb_video_tracks++;
|
||||||
track->width = st->codec->width;
|
track->width = st->codecpar->width;
|
||||||
track->height = st->codec->height;
|
track->height = st->codecpar->height;
|
||||||
if (st->codec->codec_id == AV_CODEC_ID_H264)
|
if (st->codecpar->codec_id == AV_CODEC_ID_H264)
|
||||||
track->fourcc = "H264";
|
track->fourcc = "H264";
|
||||||
else if (st->codec->codec_id == AV_CODEC_ID_VC1)
|
else if (st->codecpar->codec_id == AV_CODEC_ID_VC1)
|
||||||
track->fourcc = "WVC1";
|
track->fourcc = "WVC1";
|
||||||
get_video_private_data(track, st->codec);
|
get_video_private_data(track, st->codecpar);
|
||||||
}
|
}
|
||||||
|
|
||||||
tracks->nb_tracks++;
|
tracks->nb_tracks++;
|
||||||
|
@ -52,22 +52,23 @@ struct Tracks {
|
|||||||
int multiple_tracks_per_file;
|
int multiple_tracks_per_file;
|
||||||
};
|
};
|
||||||
|
|
||||||
static void set_codec_str(AVCodecContext *codec, char *str, int size)
|
static void set_codec_str(AVCodecParameters *codecpar, char *str, int size)
|
||||||
{
|
{
|
||||||
switch (codec->codec_id) {
|
switch (codecpar->codec_id) {
|
||||||
case AV_CODEC_ID_H264:
|
case AV_CODEC_ID_H264:
|
||||||
snprintf(str, size, "avc1");
|
snprintf(str, size, "avc1");
|
||||||
if (codec->extradata_size >= 4 && codec->extradata[0] == 1) {
|
if (codecpar->extradata_size >= 4 && codecpar->extradata[0] == 1) {
|
||||||
av_strlcatf(str, size, ".%02x%02x%02x",
|
av_strlcatf(str, size, ".%02x%02x%02x",
|
||||||
codec->extradata[1], codec->extradata[2], codec->extradata[3]);
|
codecpar->extradata[1], codecpar->extradata[2],
|
||||||
|
codecpar->extradata[3]);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case AV_CODEC_ID_AAC:
|
case AV_CODEC_ID_AAC:
|
||||||
snprintf(str, size, "mp4a.40"); // 0x40 is the mp4 object type for AAC
|
snprintf(str, size, "mp4a.40"); // 0x40 is the mp4 object type for AAC
|
||||||
if (codec->extradata_size >= 2) {
|
if (codecpar->extradata_size >= 2) {
|
||||||
int aot = codec->extradata[0] >> 3;
|
int aot = codecpar->extradata[0] >> 3;
|
||||||
if (aot == 31)
|
if (aot == 31)
|
||||||
aot = ((AV_RB16(codec->extradata) >> 5) & 0x3f) + 32;
|
aot = ((AV_RB16(codecpar->extradata) >> 5) & 0x3f) + 32;
|
||||||
av_strlcatf(str, size, ".%d", aot);
|
av_strlcatf(str, size, ".%d", aot);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@ -145,7 +146,7 @@ static int handle_file(struct Tracks *tracks, const char *file)
|
|||||||
struct Track **temp;
|
struct Track **temp;
|
||||||
AVStream *st = ctx->streams[i];
|
AVStream *st = ctx->streams[i];
|
||||||
|
|
||||||
if (st->codec->bit_rate == 0) {
|
if (st->codecpar->bit_rate == 0) {
|
||||||
fprintf(stderr, "Skipping track %d in %s as it has zero bitrate\n",
|
fprintf(stderr, "Skipping track %d in %s as it has zero bitrate\n",
|
||||||
st->id, file);
|
st->id, file);
|
||||||
continue;
|
continue;
|
||||||
@ -170,12 +171,12 @@ static int handle_file(struct Tracks *tracks, const char *file)
|
|||||||
if ((ptr = strrchr(file, '/')))
|
if ((ptr = strrchr(file, '/')))
|
||||||
track->name = ptr + 1;
|
track->name = ptr + 1;
|
||||||
|
|
||||||
track->bitrate = st->codec->bit_rate;
|
track->bitrate = st->codecpar->bit_rate;
|
||||||
track->track_id = st->id;
|
track->track_id = st->id;
|
||||||
track->timescale = st->time_base.den;
|
track->timescale = st->time_base.den;
|
||||||
track->duration = st->duration;
|
track->duration = st->duration;
|
||||||
track->is_audio = st->codec->codec_type == AVMEDIA_TYPE_AUDIO;
|
track->is_audio = st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO;
|
||||||
track->is_video = st->codec->codec_type == AVMEDIA_TYPE_VIDEO;
|
track->is_video = st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO;
|
||||||
|
|
||||||
if (!track->is_audio && !track->is_video) {
|
if (!track->is_audio && !track->is_video) {
|
||||||
fprintf(stderr,
|
fprintf(stderr,
|
||||||
@ -190,14 +191,14 @@ static int handle_file(struct Tracks *tracks, const char *file)
|
|||||||
track->timescale, AV_ROUND_UP));
|
track->timescale, AV_ROUND_UP));
|
||||||
|
|
||||||
if (track->is_audio) {
|
if (track->is_audio) {
|
||||||
track->channels = st->codec->channels;
|
track->channels = st->codecpar->channels;
|
||||||
track->sample_rate = st->codec->sample_rate;
|
track->sample_rate = st->codecpar->sample_rate;
|
||||||
}
|
}
|
||||||
if (track->is_video) {
|
if (track->is_video) {
|
||||||
track->width = st->codec->width;
|
track->width = st->codecpar->width;
|
||||||
track->height = st->codec->height;
|
track->height = st->codecpar->height;
|
||||||
}
|
}
|
||||||
set_codec_str(st->codec, track->codec_str, sizeof(track->codec_str));
|
set_codec_str(st->codecpar, track->codec_str, sizeof(track->codec_str));
|
||||||
|
|
||||||
tracks->nb_tracks++;
|
tracks->nb_tracks++;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user