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>
This commit is contained in:
commit
ff96098084
66
avconv.c
66
avconv.c
@ -1918,28 +1918,18 @@ static int init_input_stream(int ist_index, OutputStream *output_streams, int nb
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
static int transcode_init(OutputFile *output_files,
|
||||||
* The following code is the main loop of the file converter
|
int nb_output_files,
|
||||||
*/
|
InputFile *input_files,
|
||||||
static int transcode(OutputFile *output_files,
|
int nb_input_files)
|
||||||
int nb_output_files,
|
|
||||||
InputFile *input_files,
|
|
||||||
int nb_input_files)
|
|
||||||
{
|
{
|
||||||
int ret = 0, i, step;
|
int ret = 0, i;
|
||||||
AVFormatContext *is, *os;
|
AVFormatContext *os;
|
||||||
AVCodecContext *codec, *icodec;
|
AVCodecContext *codec, *icodec;
|
||||||
OutputStream *ost;
|
OutputStream *ost;
|
||||||
InputStream *ist;
|
InputStream *ist;
|
||||||
char error[1024];
|
char error[1024];
|
||||||
int key;
|
|
||||||
int want_sdp = 1;
|
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)
|
if (rate_emu)
|
||||||
for (i = 0; i < nb_input_streams; i++)
|
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)) {
|
if (!os->nb_streams && !(os->oformat->flags & AVFMT_NOSTREAMS)) {
|
||||||
av_dump_format(os, i, os->filename, 1);
|
av_dump_format(os, i, os->filename, 1);
|
||||||
fprintf(stderr, "Output file #%d does not contain any stream\n", i);
|
fprintf(stderr, "Output file #%d does not contain any stream\n", i);
|
||||||
ret = AVERROR(EINVAL);
|
return AVERROR(EINVAL);
|
||||||
goto fail;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1973,8 +1962,7 @@ static int transcode(OutputFile *output_files,
|
|||||||
uint64_t extra_size = (uint64_t)icodec->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE;
|
uint64_t extra_size = (uint64_t)icodec->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE;
|
||||||
|
|
||||||
if (extra_size > INT_MAX) {
|
if (extra_size > INT_MAX) {
|
||||||
ret = AVERROR(EINVAL);
|
return AVERROR(EINVAL);
|
||||||
goto fail;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* if stream_copy is selected, no need to decode or encode */
|
/* 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->rc_buffer_size = icodec->rc_buffer_size;
|
||||||
codec->extradata= av_mallocz(extra_size);
|
codec->extradata= av_mallocz(extra_size);
|
||||||
if (!codec->extradata) {
|
if (!codec->extradata) {
|
||||||
ret = AVERROR(ENOMEM);
|
return AVERROR(ENOMEM);
|
||||||
goto fail;
|
|
||||||
}
|
}
|
||||||
memcpy(codec->extradata, icodec->extradata, icodec->extradata_size);
|
memcpy(codec->extradata, icodec->extradata, icodec->extradata_size);
|
||||||
codec->extradata_size= icodec->extradata_size;
|
codec->extradata_size= icodec->extradata_size;
|
||||||
@ -2061,8 +2048,7 @@ static int transcode(OutputFile *output_files,
|
|||||||
case AVMEDIA_TYPE_AUDIO:
|
case AVMEDIA_TYPE_AUDIO:
|
||||||
ost->fifo= av_fifo_alloc(1024);
|
ost->fifo= av_fifo_alloc(1024);
|
||||||
if (!ost->fifo) {
|
if (!ost->fifo) {
|
||||||
ret = AVERROR(ENOMEM);
|
return AVERROR(ENOMEM);
|
||||||
goto fail;
|
|
||||||
}
|
}
|
||||||
ost->reformat_pair = MAKE_SFMT_PAIR(AV_SAMPLE_FMT_NONE,AV_SAMPLE_FMT_NONE);
|
ost->reformat_pair = MAKE_SFMT_PAIR(AV_SAMPLE_FMT_NONE,AV_SAMPLE_FMT_NONE);
|
||||||
if (!codec->sample_rate) {
|
if (!codec->sample_rate) {
|
||||||
@ -2182,8 +2168,7 @@ static int transcode(OutputFile *output_files,
|
|||||||
if (!bit_buffer) {
|
if (!bit_buffer) {
|
||||||
fprintf(stderr, "Cannot allocate %d bytes output buffer\n",
|
fprintf(stderr, "Cannot allocate %d bytes output buffer\n",
|
||||||
bit_buffer_size);
|
bit_buffer_size);
|
||||||
ret = AVERROR(ENOMEM);
|
return AVERROR(ENOMEM);
|
||||||
goto fail;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* open each encoder */
|
/* open each encoder */
|
||||||
@ -2270,13 +2255,40 @@ static int transcode(OutputFile *output_files,
|
|||||||
|
|
||||||
if (ret) {
|
if (ret) {
|
||||||
fprintf(stderr, "%s\n", error);
|
fprintf(stderr, "%s\n", error);
|
||||||
goto fail;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (want_sdp) {
|
if (want_sdp) {
|
||||||
print_sdp(output_files, nb_output_files);
|
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 (!using_stdin) {
|
||||||
if(verbose >= 0)
|
if(verbose >= 0)
|
||||||
fprintf(stderr, "Press [q] to stop, [?] for help\n");
|
fprintf(stderr, "Press [q] to stop, [?] for help\n");
|
||||||
|
@ -1189,6 +1189,15 @@ static int wavpack_decode_frame(AVCodecContext *avctx,
|
|||||||
return s->samples_left > 0 ? 0 : avpkt->size;
|
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 = {
|
AVCodec ff_wavpack_decoder = {
|
||||||
.name = "wavpack",
|
.name = "wavpack",
|
||||||
.type = AVMEDIA_TYPE_AUDIO,
|
.type = AVMEDIA_TYPE_AUDIO,
|
||||||
@ -1197,6 +1206,7 @@ AVCodec ff_wavpack_decoder = {
|
|||||||
.init = wavpack_decode_init,
|
.init = wavpack_decode_init,
|
||||||
.close = wavpack_decode_end,
|
.close = wavpack_decode_end,
|
||||||
.decode = wavpack_decode_frame,
|
.decode = wavpack_decode_frame,
|
||||||
|
.flush = wavpack_decode_flush,
|
||||||
.capabilities = CODEC_CAP_SUBFRAMES,
|
.capabilities = CODEC_CAP_SUBFRAMES,
|
||||||
.long_name = NULL_IF_CONFIG_SMALL("WavPack"),
|
.long_name = NULL_IF_CONFIG_SMALL("WavPack"),
|
||||||
};
|
};
|
||||||
|
@ -250,6 +250,7 @@ static int wv_read_packet(AVFormatContext *s,
|
|||||||
WVContext *wc = s->priv_data;
|
WVContext *wc = s->priv_data;
|
||||||
int ret;
|
int ret;
|
||||||
int size, ver, off;
|
int size, ver, off;
|
||||||
|
int64_t pos;
|
||||||
|
|
||||||
if (url_feof(s->pb))
|
if (url_feof(s->pb))
|
||||||
return AVERROR(EIO);
|
return AVERROR(EIO);
|
||||||
@ -258,6 +259,7 @@ static int wv_read_packet(AVFormatContext *s,
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pos = wc->pos;
|
||||||
off = wc->multichannel ? 4 : 0;
|
off = wc->multichannel ? 4 : 0;
|
||||||
if(av_new_packet(pkt, wc->blksize + WV_EXTRA_SIZE + off) < 0)
|
if(av_new_packet(pkt, wc->blksize + WV_EXTRA_SIZE + off) < 0)
|
||||||
return AVERROR(ENOMEM);
|
return AVERROR(ENOMEM);
|
||||||
@ -314,7 +316,7 @@ static int wv_read_packet(AVFormatContext *s,
|
|||||||
pkt->stream_index = 0;
|
pkt->stream_index = 0;
|
||||||
wc->block_parsed = 1;
|
wc->block_parsed = 1;
|
||||||
pkt->pts = wc->soff;
|
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;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -328,7 +330,8 @@ static int wv_read_seek(AVFormatContext *s, int stream_index, int64_t timestamp,
|
|||||||
int64_t pos, pts;
|
int64_t pos, pts;
|
||||||
|
|
||||||
/* if found, seek there */
|
/* if found, seek there */
|
||||||
if (index >= 0){
|
if (index >= 0 &&
|
||||||
|
timestamp <= st->index_entries[st->nb_index_entries - 1].timestamp) {
|
||||||
wc->block_parsed = 1;
|
wc->block_parsed = 1;
|
||||||
avio_seek(s->pb, st->index_entries[index].pos, SEEK_SET);
|
avio_seek(s->pb, st->index_entries[index].pos, SEEK_SET);
|
||||||
return 0;
|
return 0;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user