diff options
author | Michael Niedermayer <michaelni@gmx.at> | 2011-08-21 15:27:02 +0200 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2011-08-21 15:27:02 +0200 |
commit | ff96098084542c3ef98b360f70583999433d13a7 (patch) | |
tree | 620b6e7702ddbc0fb1ccc3525299feb0781abfca | |
parent | 34c997599e14b4ef5f84aa324fdea7ae03d7a2ba (diff) | |
parent | ccb919e34b1276db5cfcd903e405e47ccb932d58 (diff) | |
download | ffmpeg-ff96098084542c3ef98b360f70583999433d13a7.tar.gz |
Merge remote-tracking branch 'qatar/master'
* qatar/master:
WavPack demuxer: do not rely on index when timestamp is not in indexed range.
WavPack demuxer: store position of the first block in index.
WavPack decoder: implement flush function
avconv: Separate initialization from the main transcode loop.
Conflicts:
avconv.c
Merged-by: Michael Niedermayer <michaelni@gmx.at>
-rw-r--r-- | avconv.c | 66 | ||||
-rw-r--r-- | libavcodec/wavpack.c | 10 | ||||
-rw-r--r-- | libavformat/wv.c | 7 |
3 files changed, 54 insertions, 29 deletions
@@ -1918,28 +1918,18 @@ static int init_input_stream(int ist_index, OutputStream *output_streams, int nb return 0; } -/* - * The following code is the main loop of the file converter - */ -static int transcode(OutputFile *output_files, - int nb_output_files, - InputFile *input_files, - int nb_input_files) +static int transcode_init(OutputFile *output_files, + int nb_output_files, + InputFile *input_files, + int nb_input_files) { - int ret = 0, i, step; - AVFormatContext *is, *os; + int ret = 0, i; + AVFormatContext *os; AVCodecContext *codec, *icodec; OutputStream *ost; InputStream *ist; char error[1024]; - int key; int want_sdp = 1; - uint8_t *no_packet; - int no_packet_count=0; - int64_t timer_start; - - if (!(no_packet = av_mallocz(nb_input_files))) - exit_program(1); if (rate_emu) for (i = 0; i < nb_input_streams; i++) @@ -1951,8 +1941,7 @@ static int transcode(OutputFile *output_files, if (!os->nb_streams && !(os->oformat->flags & AVFMT_NOSTREAMS)) { av_dump_format(os, i, os->filename, 1); fprintf(stderr, "Output file #%d does not contain any stream\n", i); - ret = AVERROR(EINVAL); - goto fail; + return AVERROR(EINVAL); } } @@ -1973,8 +1962,7 @@ static int transcode(OutputFile *output_files, uint64_t extra_size = (uint64_t)icodec->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE; if (extra_size > INT_MAX) { - ret = AVERROR(EINVAL); - goto fail; + return AVERROR(EINVAL); } /* if stream_copy is selected, no need to decode or encode */ @@ -1993,8 +1981,7 @@ static int transcode(OutputFile *output_files, codec->rc_buffer_size = icodec->rc_buffer_size; codec->extradata= av_mallocz(extra_size); if (!codec->extradata) { - ret = AVERROR(ENOMEM); - goto fail; + return AVERROR(ENOMEM); } memcpy(codec->extradata, icodec->extradata, icodec->extradata_size); codec->extradata_size= icodec->extradata_size; @@ -2061,8 +2048,7 @@ static int transcode(OutputFile *output_files, case AVMEDIA_TYPE_AUDIO: ost->fifo= av_fifo_alloc(1024); if (!ost->fifo) { - ret = AVERROR(ENOMEM); - goto fail; + return AVERROR(ENOMEM); } ost->reformat_pair = MAKE_SFMT_PAIR(AV_SAMPLE_FMT_NONE,AV_SAMPLE_FMT_NONE); if (!codec->sample_rate) { @@ -2182,8 +2168,7 @@ static int transcode(OutputFile *output_files, if (!bit_buffer) { fprintf(stderr, "Cannot allocate %d bytes output buffer\n", bit_buffer_size); - ret = AVERROR(ENOMEM); - goto fail; + return AVERROR(ENOMEM); } /* open each encoder */ @@ -2270,13 +2255,40 @@ static int transcode(OutputFile *output_files, if (ret) { fprintf(stderr, "%s\n", error); - goto fail; + return ret; } if (want_sdp) { print_sdp(output_files, nb_output_files); } + return 0; +} + +/* + * The following code is the main loop of the file converter + */ +static int transcode(OutputFile *output_files, + int nb_output_files, + InputFile *input_files, + int nb_input_files) +{ + int ret, i; + AVFormatContext *is, *os; + OutputStream *ost; + InputStream *ist; + uint8_t *no_packet; + int no_packet_count=0; + int64_t timer_start; + int key; + + if (!(no_packet = av_mallocz(nb_input_files))) + exit_program(1); + + ret = transcode_init(output_files, nb_output_files, input_files, nb_input_files); + if (ret < 0) + goto fail; + if (!using_stdin) { if(verbose >= 0) fprintf(stderr, "Press [q] to stop, [?] for help\n"); diff --git a/libavcodec/wavpack.c b/libavcodec/wavpack.c index ba974bd089..ca52d0ac74 100644 --- a/libavcodec/wavpack.c +++ b/libavcodec/wavpack.c @@ -1189,6 +1189,15 @@ static int wavpack_decode_frame(AVCodecContext *avctx, return s->samples_left > 0 ? 0 : avpkt->size; } +static void wavpack_decode_flush(AVCodecContext *avctx) +{ + WavpackContext *s = avctx->priv_data; + int i; + + for (i = 0; i < s->fdec_num; i++) + s->fdec[i]->samples_left = 0; +} + AVCodec ff_wavpack_decoder = { .name = "wavpack", .type = AVMEDIA_TYPE_AUDIO, @@ -1197,6 +1206,7 @@ AVCodec ff_wavpack_decoder = { .init = wavpack_decode_init, .close = wavpack_decode_end, .decode = wavpack_decode_frame, + .flush = wavpack_decode_flush, .capabilities = CODEC_CAP_SUBFRAMES, .long_name = NULL_IF_CONFIG_SMALL("WavPack"), }; diff --git a/libavformat/wv.c b/libavformat/wv.c index ec59c26521..e995e51bb9 100644 --- a/libavformat/wv.c +++ b/libavformat/wv.c @@ -250,6 +250,7 @@ static int wv_read_packet(AVFormatContext *s, WVContext *wc = s->priv_data; int ret; int size, ver, off; + int64_t pos; if (url_feof(s->pb)) return AVERROR(EIO); @@ -258,6 +259,7 @@ static int wv_read_packet(AVFormatContext *s, return -1; } + pos = wc->pos; off = wc->multichannel ? 4 : 0; if(av_new_packet(pkt, wc->blksize + WV_EXTRA_SIZE + off) < 0) return AVERROR(ENOMEM); @@ -314,7 +316,7 @@ static int wv_read_packet(AVFormatContext *s, pkt->stream_index = 0; wc->block_parsed = 1; pkt->pts = wc->soff; - av_add_index_entry(s->streams[0], wc->pos, pkt->pts, 0, 0, AVINDEX_KEYFRAME); + av_add_index_entry(s->streams[0], pos, pkt->pts, 0, 0, AVINDEX_KEYFRAME); return 0; } @@ -328,7 +330,8 @@ static int wv_read_seek(AVFormatContext *s, int stream_index, int64_t timestamp, int64_t pos, pts; /* if found, seek there */ - if (index >= 0){ + if (index >= 0 && + timestamp <= st->index_entries[st->nb_index_entries - 1].timestamp) { wc->block_parsed = 1; avio_seek(s->pb, st->index_entries[index].pos, SEEK_SET); return 0; |