mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2024-12-23 12:43:46 +02:00
segafilm: add support for videos with cri adx adpcm
Signed-off-by: Ronald S. Bultje <rsbultje@gmail.com>
This commit is contained in:
parent
99fecc64b0
commit
84d098d943
@ -111,7 +111,9 @@ static int film_read_header(AVFormatContext *s,
|
||||
film->audio_samplerate = AV_RB16(&scratch[24]);
|
||||
film->audio_channels = scratch[21];
|
||||
film->audio_bits = scratch[22];
|
||||
if (film->audio_bits == 8)
|
||||
if (scratch[23] == 2)
|
||||
film->audio_type = CODEC_ID_ADPCM_ADX;
|
||||
else if (film->audio_bits == 8)
|
||||
film->audio_type = CODEC_ID_PCM_S8;
|
||||
else if (film->audio_bits == 16)
|
||||
film->audio_type = CODEC_ID_PCM_S16BE;
|
||||
@ -149,14 +151,21 @@ static int film_read_header(AVFormatContext *s,
|
||||
st->codec->codec_id = film->audio_type;
|
||||
st->codec->codec_tag = 1;
|
||||
st->codec->channels = film->audio_channels;
|
||||
st->codec->bits_per_coded_sample = film->audio_bits;
|
||||
st->codec->sample_rate = film->audio_samplerate;
|
||||
st->codec->bit_rate = st->codec->channels * st->codec->sample_rate *
|
||||
st->codec->bits_per_coded_sample;
|
||||
|
||||
if (film->audio_type == CODEC_ID_ADPCM_ADX) {
|
||||
st->codec->bits_per_coded_sample = 18 * 8 / 32;
|
||||
st->codec->block_align = st->codec->channels * 18;
|
||||
} else {
|
||||
st->codec->bits_per_coded_sample = film->audio_bits;
|
||||
st->codec->block_align = st->codec->channels *
|
||||
st->codec->bits_per_coded_sample / 8;
|
||||
}
|
||||
|
||||
st->codec->bit_rate = st->codec->channels * st->codec->sample_rate *
|
||||
st->codec->bits_per_coded_sample;
|
||||
}
|
||||
|
||||
/* load the sample table */
|
||||
if (avio_read(pb, scratch, 16) != 16)
|
||||
return AVERROR(EIO);
|
||||
@ -187,6 +196,10 @@ static int film_read_header(AVFormatContext *s,
|
||||
film->sample_table[i].pts *= film->base_clock;
|
||||
film->sample_table[i].pts /= film->audio_samplerate;
|
||||
|
||||
if (film->audio_type == CODEC_ID_ADPCM_ADX)
|
||||
audio_frame_counter += (film->sample_table[i].sample_size * 32 /
|
||||
(18 * film->audio_channels));
|
||||
else
|
||||
audio_frame_counter += (film->sample_table[i].sample_size /
|
||||
(film->audio_channels * film->audio_bits / 8));
|
||||
} else {
|
||||
@ -227,7 +240,8 @@ static int film_read_packet(AVFormatContext *s,
|
||||
return AVERROR(ENOMEM);
|
||||
avio_read(pb, pkt->data, sample->sample_size);
|
||||
} else if ((sample->stream == film->audio_stream_index) &&
|
||||
(film->audio_channels == 2)) {
|
||||
(film->audio_channels == 2) &&
|
||||
(film->audio_type != CODEC_ID_ADPCM_ADX)) {
|
||||
/* stereo PCM needs to be interleaved */
|
||||
|
||||
if (av_new_packet(pkt, sample->sample_size))
|
||||
|
Loading…
Reference in New Issue
Block a user