]> rtime.felk.cvut.cz Git - frescor/ffmpeg.git/commitdiff
Support Electronic Arts files containing MP3 audio.
authorpross <pross@9553f0bf-9b14-0410-a0b8-cfaf0461ba5b>
Mon, 18 Aug 2008 12:39:57 +0000 (12:39 +0000)
committerpross <pross@9553f0bf-9b14-0410-a0b8-cfaf0461ba5b>
Mon, 18 Aug 2008 12:39:57 +0000 (12:39 +0000)
git-svn-id: file:///var/local/repositories/ffmpeg/trunk@14824 9553f0bf-9b14-0410-a0b8-cfaf0461ba5b

libavformat/electronicarts.c

index 7bc42805dba90fdcc10fd780b7535b37f5b8b862..2e627792c3c9ce65446ef3d64cc61a9f3dc0665c 100644 (file)
@@ -185,6 +185,7 @@ static int process_audio_header_elements(AVFormatContext *s)
         switch (revision2) {
         case  8: ea->audio_codec = CODEC_ID_PCM_S16LE_PLANAR; break;
         case 10: ea->audio_codec = CODEC_ID_ADPCM_EA_R2; break;
+        case 16: ea->audio_codec = CODEC_ID_MP3; break;
         case -1: break;
         default:
             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;
     unsigned int chunk_type, chunk_size;
     int key = 0;
+    int num_samples;
 
     while (!packet_read) {
         chunk_type = get_le32(pb);
@@ -448,8 +450,10 @@ static int ea_read_packet(AVFormatContext *s,
             if (!ea->audio_codec) {
                 url_fskip(pb, chunk_size);
                 break;
-            } else if (ea->audio_codec == CODEC_ID_PCM_S16LE_PLANAR) {
-                url_fskip(pb, 12);  /* planar header */
+            } else if (ea->audio_codec == CODEC_ID_PCM_S16LE_PLANAR ||
+                       ea->audio_codec == CODEC_ID_MP3) {
+                num_samples = get_le32(pb);
+                url_fskip(pb, 8);
                 chunk_size -= 12;
             }
             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->num_channels;
                         break;
+                    case CODEC_ID_PCM_S16LE_PLANAR:
+                    case CODEC_ID_MP3:
+                        ea->audio_frame_counter += num_samples;
+                        break;
                     default:
                         ea->audio_frame_counter += chunk_size /
                             (ea->bytes * ea->num_channels);