Commit 4a9988bc authored by bcoudurier's avatar bcoudurier

allocate tracks instead of using MAX_STREAMS

git-svn-id: file:///var/local/repositories/ffmpeg/trunk@18140 9553f0bf-9b14-0410-a0b8-cfaf0461ba5b
parent 5e106907
...@@ -81,7 +81,7 @@ typedef struct MOVMuxContext { ...@@ -81,7 +81,7 @@ typedef struct MOVMuxContext {
int64_t mdat_pos; int64_t mdat_pos;
uint64_t mdat_size; uint64_t mdat_size;
long timescale; long timescale;
MOVTrack tracks[MAX_STREAMS]; MOVTrack *tracks;
} MOVMuxContext; } MOVMuxContext;
//FIXME support 64 bit variant with wide placeholders //FIXME support 64 bit variant with wide placeholders
...@@ -1664,6 +1664,10 @@ static int mov_write_header(AVFormatContext *s) ...@@ -1664,6 +1664,10 @@ static int mov_write_header(AVFormatContext *s)
} }
} }
mov->tracks = av_mallocz(s->nb_streams*sizeof(*mov->tracks));
if (!mov->tracks)
return AVERROR(ENOMEM);
for(i=0; i<s->nb_streams; i++){ for(i=0; i<s->nb_streams; i++){
AVStream *st= s->streams[i]; AVStream *st= s->streams[i];
MOVTrack *track= &mov->tracks[i]; MOVTrack *track= &mov->tracks[i];
...@@ -1678,7 +1682,7 @@ static int mov_write_header(AVFormatContext *s) ...@@ -1678,7 +1682,7 @@ static int mov_write_header(AVFormatContext *s)
if (!track->tag) { if (!track->tag) {
av_log(s, AV_LOG_ERROR, "track %d: could not find tag, " av_log(s, AV_LOG_ERROR, "track %d: could not find tag, "
"codec not currently supported in container\n", i); "codec not currently supported in container\n", i);
return -1; goto error;
} }
if(st->codec->codec_type == CODEC_TYPE_VIDEO){ if(st->codec->codec_type == CODEC_TYPE_VIDEO){
if (track->tag == MKTAG('m','x','3','p') || track->tag == MKTAG('m','x','3','n') || if (track->tag == MKTAG('m','x','3','p') || track->tag == MKTAG('m','x','3','n') ||
...@@ -1686,7 +1690,7 @@ static int mov_write_header(AVFormatContext *s) ...@@ -1686,7 +1690,7 @@ static int mov_write_header(AVFormatContext *s)
track->tag == MKTAG('m','x','5','p') || track->tag == MKTAG('m','x','5','n')) { track->tag == MKTAG('m','x','5','p') || track->tag == MKTAG('m','x','5','n')) {
if (st->codec->width != 720 || (st->codec->height != 608 && st->codec->height != 512)) { if (st->codec->width != 720 || (st->codec->height != 608 && st->codec->height != 512)) {
av_log(s, AV_LOG_ERROR, "D-10/IMX must use 720x608 or 720x512 video resolution\n"); av_log(s, AV_LOG_ERROR, "D-10/IMX must use 720x608 or 720x512 video resolution\n");
return -1; goto error;
} }
track->height = track->tag>>24 == 'n' ? 486 : 576; track->height = track->tag>>24 == 'n' ? 486 : 576;
} }
...@@ -1702,7 +1706,7 @@ static int mov_write_header(AVFormatContext *s) ...@@ -1702,7 +1706,7 @@ static int mov_write_header(AVFormatContext *s)
av_set_pts_info(st, 64, 1, st->codec->sample_rate); av_set_pts_info(st, 64, 1, st->codec->sample_rate);
if(!st->codec->frame_size && !av_get_bits_per_sample(st->codec->codec_id)) { if(!st->codec->frame_size && !av_get_bits_per_sample(st->codec->codec_id)) {
av_log(s, AV_LOG_ERROR, "track %d: codec frame size is not set\n", i); av_log(s, AV_LOG_ERROR, "track %d: codec frame size is not set\n", i);
return -1; goto error;
}else if(st->codec->frame_size > 1){ /* assume compressed audio */ }else if(st->codec->frame_size > 1){ /* assume compressed audio */
track->audio_vbr = 1; track->audio_vbr = 1;
}else{ }else{
...@@ -1713,7 +1717,7 @@ static int mov_write_header(AVFormatContext *s) ...@@ -1713,7 +1717,7 @@ static int mov_write_header(AVFormatContext *s)
track->enc->codec_id == CODEC_ID_MP3 && track->enc->sample_rate < 16000){ track->enc->codec_id == CODEC_ID_MP3 && track->enc->sample_rate < 16000){
av_log(s, AV_LOG_ERROR, "track %d: muxing mp3 at %dhz is not supported\n", av_log(s, AV_LOG_ERROR, "track %d: muxing mp3 at %dhz is not supported\n",
i, track->enc->sample_rate); i, track->enc->sample_rate);
return -1; goto error;
} }
}else if(st->codec->codec_type == CODEC_TYPE_SUBTITLE){ }else if(st->codec->codec_type == CODEC_TYPE_SUBTITLE){
track->timescale = st->codec->time_base.den; track->timescale = st->codec->time_base.den;
...@@ -1730,6 +1734,9 @@ static int mov_write_header(AVFormatContext *s) ...@@ -1730,6 +1734,9 @@ static int mov_write_header(AVFormatContext *s)
put_flush_packet(pb); put_flush_packet(pb);
return 0; return 0;
error:
av_freep(&mov->tracks);
return -1;
} }
static int mov_write_packet(AVFormatContext *s, AVPacket *pkt) static int mov_write_packet(AVFormatContext *s, AVPacket *pkt)
...@@ -1852,6 +1859,8 @@ static int mov_write_trailer(AVFormatContext *s) ...@@ -1852,6 +1859,8 @@ static int mov_write_trailer(AVFormatContext *s)
put_flush_packet(pb); put_flush_packet(pb);
av_freep(&mov->tracks);
return res; return res;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment