Support Electronic Arts files containing MP3 audio.

Originally committed as revision 14824 to svn://svn.ffmpeg.org/ffmpeg/trunk
pull/126/head
Peter Ross 17 years ago
parent 97ceb75218
commit fc7ed9a6f6
  1. 12
      libavformat/electronicarts.c

@ -185,6 +185,7 @@ static int process_audio_header_elements(AVFormatContext *s)
switch (revision2) { switch (revision2) {
case 8: ea->audio_codec = CODEC_ID_PCM_S16LE_PLANAR; break; case 8: ea->audio_codec = CODEC_ID_PCM_S16LE_PLANAR; break;
case 10: ea->audio_codec = CODEC_ID_ADPCM_EA_R2; break; case 10: ea->audio_codec = CODEC_ID_ADPCM_EA_R2; break;
case 16: ea->audio_codec = CODEC_ID_MP3; break;
case -1: break; case -1: break;
default: default:
av_log(s, AV_LOG_ERROR, "unsupported stream type; revision2=%i\n", revision2); av_log(s, AV_LOG_ERROR, "unsupported stream type; revision2=%i\n", revision2);
@ -430,6 +431,7 @@ static int ea_read_packet(AVFormatContext *s,
int packet_read = 0; int packet_read = 0;
unsigned int chunk_type, chunk_size; unsigned int chunk_type, chunk_size;
int key = 0; int key = 0;
int num_samples;
while (!packet_read) { while (!packet_read) {
chunk_type = get_le32(pb); chunk_type = get_le32(pb);
@ -448,8 +450,10 @@ static int ea_read_packet(AVFormatContext *s,
if (!ea->audio_codec) { if (!ea->audio_codec) {
url_fskip(pb, chunk_size); url_fskip(pb, chunk_size);
break; break;
} else if (ea->audio_codec == CODEC_ID_PCM_S16LE_PLANAR) { } else if (ea->audio_codec == CODEC_ID_PCM_S16LE_PLANAR ||
url_fskip(pb, 12); /* planar header */ ea->audio_codec == CODEC_ID_MP3) {
num_samples = get_le32(pb);
url_fskip(pb, 8);
chunk_size -= 12; chunk_size -= 12;
} }
ret = av_get_packet(pb, pkt, chunk_size); ret = av_get_packet(pb, pkt, chunk_size);
@ -468,6 +472,10 @@ static int ea_read_packet(AVFormatContext *s,
ea->audio_frame_counter += ((chunk_size - 12) * 2) / ea->audio_frame_counter += ((chunk_size - 12) * 2) /
ea->num_channels; ea->num_channels;
break; break;
case CODEC_ID_PCM_S16LE_PLANAR:
case CODEC_ID_MP3:
ea->audio_frame_counter += num_samples;
break;
default: default:
ea->audio_frame_counter += chunk_size / ea->audio_frame_counter += chunk_size /
(ea->bytes * ea->num_channels); (ea->bytes * ea->num_channels);

Loading…
Cancel
Save