diff options
Diffstat (limited to 'libmpcodecs')
-rw-r--r-- | libmpcodecs/ad_ffmpeg.c | 15 |
1 files changed, 13 insertions, 2 deletions
diff --git a/libmpcodecs/ad_ffmpeg.c b/libmpcodecs/ad_ffmpeg.c index fa005b4a15..068a32a307 100644 --- a/libmpcodecs/ad_ffmpeg.c +++ b/libmpcodecs/ad_ffmpeg.c @@ -167,7 +167,17 @@ static int decode_audio(sh_audio_t *sh_audio,unsigned char *buf,int minlen,int m int len2=maxlen; double pts; int x=ds_get_packet_pts(sh_audio->ds,&start, &pts); - if(x<=0) break; // error + if(x<=0) { + start = NULL; + x = 0; + ds_parse(sh_audio->ds, &start, &x, MP_NOPTS_VALUE, 0); + if (x <= 0) + break; // error + } else { + int in_size = x; + int consumed = ds_parse(sh_audio->ds, &start, &x, pts, 0); + sh_audio->ds->buffer_pos -= in_size - consumed; + } av_init_packet(&pkt); pkt.data = start; pkt.size = x; @@ -178,7 +188,8 @@ static int decode_audio(sh_audio_t *sh_audio,unsigned char *buf,int minlen,int m y=avcodec_decode_audio3(sh_audio->context,(int16_t*)buf,&len2,&pkt); //printf("return:%d samples_out:%d bitstream_in:%d sample_sum:%d\n", y, len2, x, len); fflush(stdout); if(y<0){ mp_msg(MSGT_DECAUDIO,MSGL_V,"lavc_audio: error\n");break; } - if(y<x) sh_audio->ds->buffer_pos+=y-x; // put back data (HACK!) + if(!sh_audio->needs_parsing && y<x) + sh_audio->ds->buffer_pos+=y-x; // put back data (HACK!) if(len2>0){ if (((AVCodecContext *)sh_audio->context)->channels >= 5) { int samplesize = av_get_bits_per_sample_format(((AVCodecContext *) |