mirror of https://git.ffmpeg.org/ffmpeg.git
avplay: flush audio decoder with empty packets at EOF if the decoder has
CODEC_CAP_DELAY set.
This commit is contained in:
parent
1993c6849c
commit
59df4b82a5
29
avplay.c
29
avplay.c
|
@ -2008,10 +2008,15 @@ static int audio_decode_frame(VideoState *is, double *pts_ptr)
|
|||
AVCodecContext *dec= is->audio_st->codec;
|
||||
int n, len1, data_size;
|
||||
double pts;
|
||||
int new_packet = 0;
|
||||
int flush_complete = 0;
|
||||
|
||||
for(;;) {
|
||||
/* NOTE: the audio packet can contain several frames */
|
||||
while (pkt_temp->size > 0) {
|
||||
while (pkt_temp->size > 0 || (!pkt_temp->data && new_packet)) {
|
||||
if (flush_complete)
|
||||
break;
|
||||
new_packet = 0;
|
||||
data_size = sizeof(is->audio_buf1);
|
||||
len1 = avcodec_decode_audio3(dec,
|
||||
(int16_t *)is->audio_buf1, &data_size,
|
||||
|
@ -2024,8 +2029,13 @@ static int audio_decode_frame(VideoState *is, double *pts_ptr)
|
|||
|
||||
pkt_temp->data += len1;
|
||||
pkt_temp->size -= len1;
|
||||
if (data_size <= 0)
|
||||
|
||||
if (data_size <= 0) {
|
||||
/* stop sending empty packets if the decoder is finished */
|
||||
if (!pkt_temp->data && dec->codec->capabilities & CODEC_CAP_DELAY)
|
||||
flush_complete = 1;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (dec->sample_fmt != is->audio_src_fmt) {
|
||||
if (is->reformat_ctx)
|
||||
|
@ -2086,12 +2096,11 @@ static int audio_decode_frame(VideoState *is, double *pts_ptr)
|
|||
}
|
||||
|
||||
/* read next packet */
|
||||
if (packet_queue_get(&is->audioq, pkt, 1) < 0)
|
||||
if ((new_packet = packet_queue_get(&is->audioq, pkt, 1)) < 0)
|
||||
return -1;
|
||||
if(pkt->data == flush_pkt.data){
|
||||
|
||||
if (pkt->data == flush_pkt.data)
|
||||
avcodec_flush_buffers(dec);
|
||||
continue;
|
||||
}
|
||||
|
||||
pkt_temp->data = pkt->data;
|
||||
pkt_temp->size = pkt->size;
|
||||
|
@ -2508,6 +2517,14 @@ static int decode_thread(void *arg)
|
|||
pkt->stream_index= is->video_stream;
|
||||
packet_queue_put(&is->videoq, pkt);
|
||||
}
|
||||
if (is->audio_stream >= 0 &&
|
||||
is->audio_st->codec->codec->capabilities & CODEC_CAP_DELAY) {
|
||||
av_init_packet(pkt);
|
||||
pkt->data = NULL;
|
||||
pkt->size = 0;
|
||||
pkt->stream_index = is->audio_stream;
|
||||
packet_queue_put(&is->audioq, pkt);
|
||||
}
|
||||
SDL_Delay(10);
|
||||
if(is->audioq.size + is->videoq.size + is->subtitleq.size ==0){
|
||||
if(loop!=1 && (!loop || --loop)){
|
||||
|
|
Loading…
Reference in New Issue