]> git.sesse.net Git - ffmpeg/blobdiff - libavformat/mov.c
set bit rate for asf format, patch by Zuxy Meng, zuxy meng gmail com
[ffmpeg] / libavformat / mov.c
index 63a9e75194073874ad0ff87f362992280fe1d86c..ce8afbca77803bb4c38e780afbf86e5288b2ae7c 100644 (file)
@@ -168,7 +168,8 @@ typedef struct MOVStreamContext {
     int time_rate;
     long current_sample;
     MOV_esds_t esds;
-    AVRational sample_size_v1;
+    unsigned int bytes_per_frame;
+    unsigned int samples_per_frame;
     int dv_audio_container;
 } MOVStreamContext;
 
@@ -381,7 +382,7 @@ static int mov_read_esds(MOVContext *c, ByteIOContext *pb, MOV_atom_t atom)
         sc->esds.max_bitrate = get_be32(pb);
         sc->esds.avg_bitrate = get_be32(pb);
 
-        st->codec->codec_id= codec_get_id(ff_mov_obj_type, sc->esds.object_type_id);
+        st->codec->codec_id= codec_get_id(ff_mp4_obj_type, sc->esds.object_type_id);
         dprintf(c->fc, "esds object type id %d\n", sc->esds.object_type_id);
         len = mov_mp4_read_descr(c, pb, &tag);
         if (tag == MP4DecSpecificDescrTag) {
@@ -843,9 +844,9 @@ static int mov_read_stsd(MOVContext *c, ByteIOContext *pb, MOV_atom_t atom)
             dprintf(c->fc, "version =%d, isom =%d\n",version,c->isom);
             if(!c->isom) {
                 if(version==1) {
-                    sc->sample_size_v1.den = get_be32(pb); /* samples per packet */
+                    sc->samples_per_frame = get_be32(pb);
                     get_be32(pb); /* bytes per packet */
-                    sc->sample_size_v1.num = get_be32(pb); /* bytes per frame */
+                    sc->bytes_per_frame = get_be32(pb);
                     get_be32(pb); /* bytes per sample */
                 } else if(version==2) {
                     get_be32(pb); /* sizeof struct only */
@@ -925,6 +926,7 @@ static int mov_read_stsd(MOVContext *c, ByteIOContext *pb, MOV_atom_t atom)
         st->codec->channels= 1; /* really needed */
         break;
     case CODEC_ID_MP2:
+    case CODEC_ID_MP3:
         st->codec->codec_type = CODEC_TYPE_AUDIO; /* force type after stsd for m1a hdlr */
         st->need_parsing = 1;
         break;
@@ -1415,8 +1417,8 @@ static void mov_build_index(MOVContext *mov, AVStream *st)
             /* get chunk size */
             if (sc->sample_size > 1 || st->codec->codec_id == CODEC_ID_PCM_U8 || st->codec->codec_id == CODEC_ID_PCM_S8)
                 chunk_size = chunk_samples * sc->sample_size;
-            else if (sc->sample_size_v1.den > 0 && (chunk_samples * sc->sample_size_v1.num % sc->sample_size_v1.den == 0))
-                chunk_size = chunk_samples * sc->sample_size_v1.num / sc->sample_size_v1.den;
+            else if (sc->samples_per_frame > 0 && (chunk_samples * sc->bytes_per_frame % sc->samples_per_frame == 0))
+                chunk_size = chunk_samples * sc->bytes_per_frame / sc->samples_per_frame;
             else { /* workaround to find nearest next chunk offset */
                 chunk_size = INT_MAX;
                 for (j = 0; j < mov->total_streams; j++) {
@@ -1502,24 +1504,28 @@ static int mov_read_header(AVFormatContext *s, AVFormatParameters *ap)
 
     for(i=0; i<mov->total_streams; i++) {
         MOVStreamContext *sc = mov->streams[i];
+        AVStream *st = s->streams[i];
         /* sanity checks */
         if(!sc->stts_count || !sc->chunk_count || !sc->sample_to_chunk_sz ||
            (!sc->sample_size && !sc->sample_count)){
             av_log(s, AV_LOG_ERROR, "missing mandatory atoms, broken header\n");
-            return -1;
+            continue;
         }
         if(!sc->time_rate)
             sc->time_rate=1;
         if(!sc->time_scale)
             sc->time_scale= mov->time_scale;
-        av_set_pts_info(s->streams[i], 64, sc->time_rate, sc->time_scale);
+        av_set_pts_info(st, 64, sc->time_rate, sc->time_scale);
+
+        if (st->codec->codec_type == CODEC_TYPE_AUDIO && sc->stts_count == 1)
+            st->codec->frame_size = sc->stts_data[0].duration;
 
-        if(s->streams[i]->duration != AV_NOPTS_VALUE){
-            assert(s->streams[i]->duration % sc->time_rate == 0);
-            s->streams[i]->duration /= sc->time_rate;
+        if(st->duration != AV_NOPTS_VALUE){
+            assert(st->duration % sc->time_rate == 0);
+            st->duration /= sc->time_rate;
         }
         sc->ffindex = i;
-        mov_build_index(mov, s->streams[i]);
+        mov_build_index(mov, st);
     }
 
     for(i=0; i<mov->total_streams; i++) {