changeset 947:929f84cc63c3 libavformat

stsd fix by (Baptiste COUDURIER )baptiste.coudurier smartjog com)
author michael
date Sat, 11 Feb 2006 21:43:21 +0000
parents 1214ae47de2b
children 1e766711e6c8
files mov.c
diffstat 1 files changed, 19 insertions(+), 12 deletions(-) [+]
line wrap: on
line diff
--- a/mov.c	Sat Feb 11 20:51:26 2006 +0000
+++ b/mov.c	Sat Feb 11 21:43:21 2006 +0000
@@ -831,17 +831,21 @@
     if((uint64_t)atom.size > (1<<30))
         return -1;
 
-    // pass all frma atom to codec, needed at least for QDM2
-    av_free(st->codec->extradata);
-    st->codec->extradata_size = atom.size;
-    st->codec->extradata = (uint8_t*) av_mallocz(st->codec->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE);
+    if (st->codec->codec_id == CODEC_ID_QDM2) {
+        // pass all frma atom to codec, needed at least for QDM2
+        av_free(st->codec->extradata);
+        st->codec->extradata_size = atom.size;
+        st->codec->extradata = (uint8_t*) av_mallocz(st->codec->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE);
 
-    if (st->codec->extradata) {
-        get_buffer(pb, st->codec->extradata, atom.size);
-        //av_log(NULL, AV_LOG_DEBUG, "Reading frma %Ld  %s\n", atom.size, (char*)st->codec->extradata);
-    } else
+        if (st->codec->extradata) {
+            get_buffer(pb, st->codec->extradata, atom.size);
+            //av_log(NULL, AV_LOG_DEBUG, "Reading frma %Ld  %s\n", atom.size, (char*)st->codec->extradata);
+        } else
+            url_fskip(pb, atom.size);
+    } else if (atom.size > 8) { /* to read frma, esds atoms */
+        mov_read_default(c, pb, atom);
+    } else if (atom.size > 0)
         url_fskip(pb, atom.size);
-
     return 0;
 }
 
@@ -944,6 +948,7 @@
 
     while(entries--) { //Parsing Sample description table
         enum CodecID id;
+        offset_t start_pos = url_ftell(pb);
         int size = get_be32(pb); /* size */
         format = get_le32(pb); /* data format */
 
@@ -1006,7 +1011,6 @@
             st->codec->time_base.den      = 25;
             st->codec->time_base.num = 1;
 */
-            size -= (16+8*4+2+32+2*2);
 #if 0
             while (size >= 8) {
                 MOV_atom_t a;
@@ -1147,8 +1151,11 @@
             } else
                 st->codec->palctrl = NULL;
 
-            a.size = size;
-            mov_read_default(c, pb, a);
+            a.size = size - (url_ftell(pb) - start_pos);
+            if (a.size > 8)
+                mov_read_default(c, pb, a);
+            else if (a.size > 0)
+                url_fskip(pb, a.size);
 #endif
         } else {
             st->codec->codec_id = codec_get_id(mov_audio_tags, format);