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;
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) {
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 */
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;
/* 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++) {
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++) {