X-Git-Url: http://rtime.felk.cvut.cz/gitweb/frescor/ffmpeg.git/blobdiff_plain/26795a0c3fc45d6ba86695acd851fcf8ab781737..HEAD:/ffplay.c diff --git a/ffplay.c b/ffplay.c index 413225e9c..cc12b4a97 100644 --- a/ffplay.c +++ b/ffplay.c @@ -135,9 +135,8 @@ typedef struct VideoState { uint8_t *audio_buf; unsigned int audio_buf_size; /* in bytes */ int audio_buf_index; /* in bytes */ + AVPacket audio_pkt_temp; AVPacket audio_pkt; - uint8_t *audio_pkt_data; - int audio_pkt_size; enum SampleFormat audio_src_fmt; AVAudioConvert *reformat_ctx; @@ -1227,7 +1226,6 @@ static int queue_picture(VideoState *is, AVFrame *src_frame, double pts) { VideoPicture *vp; int dst_pix_fmt; - AVPicture pict; static struct SwsContext *img_convert_ctx; /* wait until we have space to put a new picture */ @@ -1270,10 +1268,13 @@ static int queue_picture(VideoState *is, AVFrame *src_frame, double pts) /* if the frame is not skipped, then display it */ if (vp->bmp) { + AVPicture pict; + /* get a pointer on the bitmap */ SDL_LockYUVOverlay (vp->bmp); dst_pix_fmt = PIX_FMT_YUV420P; + memset(&pict,0,sizeof(AVPicture)); pict.data[0] = vp->bmp->pixels[0]; pict.data[1] = vp->bmp->pixels[2]; pict.data[2] = vp->bmp->pixels[1]; @@ -1370,9 +1371,9 @@ static int video_thread(void *arg) /* NOTE: ipts is the PTS of the _first_ picture beginning in this packet, if any */ is->video_st->codec->reordered_opaque= pkt->pts; - len1 = avcodec_decode_video(is->video_st->codec, + len1 = avcodec_decode_video2(is->video_st->codec, frame, &got_picture, - pkt->data, pkt->size); + pkt); if( (decoder_reorder_pts || pkt->dts == AV_NOPTS_VALUE) && frame->reordered_opaque != AV_NOPTS_VALUE) @@ -1438,9 +1439,9 @@ static int subtitle_thread(void *arg) if (pkt->pts != AV_NOPTS_VALUE) pts = av_q2d(is->subtitle_st->time_base)*pkt->pts; - len1 = avcodec_decode_subtitle(is->subtitle_st->codec, + len1 = avcodec_decode_subtitle2(is->subtitle_st->codec, &sp->sub, &got_subtitle, - pkt->data, pkt->size); + pkt); // if (len1 < 0) // break; if (got_subtitle && sp->sub.format == 0) { @@ -1575,6 +1576,7 @@ static int synchronize_audio(VideoState *is, short *samples, /* decode one audio frame and returns its uncompressed size */ static int audio_decode_frame(VideoState *is, double *pts_ptr) { + AVPacket *pkt_temp = &is->audio_pkt_temp; AVPacket *pkt = &is->audio_pkt; AVCodecContext *dec= is->audio_st->codec; int n, len1, data_size; @@ -1582,19 +1584,19 @@ static int audio_decode_frame(VideoState *is, double *pts_ptr) for(;;) { /* NOTE: the audio packet can contain several frames */ - while (is->audio_pkt_size > 0) { + while (pkt_temp->size > 0) { data_size = sizeof(is->audio_buf1); - len1 = avcodec_decode_audio2(dec, + len1 = avcodec_decode_audio3(dec, (int16_t *)is->audio_buf1, &data_size, - is->audio_pkt_data, is->audio_pkt_size); + pkt_temp); if (len1 < 0) { /* if error, we skip the frame */ - is->audio_pkt_size = 0; + pkt_temp->size = 0; break; } - is->audio_pkt_data += len1; - is->audio_pkt_size -= len1; + pkt_temp->data += len1; + pkt_temp->size -= len1; if (data_size <= 0) continue; @@ -1664,8 +1666,8 @@ static int audio_decode_frame(VideoState *is, double *pts_ptr) continue; } - is->audio_pkt_data = pkt->data; - is->audio_pkt_size = pkt->size; + pkt_temp->data = pkt->data; + pkt_temp->size = pkt->size; /* if update the audio clock with the pts */ if (pkt->pts != AV_NOPTS_VALUE) { @@ -1917,6 +1919,7 @@ static int decode_thread(void *arg) int err, i, ret, video_index, audio_index, subtitle_index; AVPacket pkt1, *pkt = &pkt1; AVFormatParameters params, *ap = ¶ms; + int eof=0; video_index = -1; audio_index = -1; @@ -2060,6 +2063,7 @@ static int decode_thread(void *arg) } } is->seek_req = 0; + eof= 0; } /* if the queue are full, no need to read more */ @@ -2070,21 +2074,25 @@ static int decode_thread(void *arg) SDL_Delay(10); continue; } - if(url_feof(ic->pb)) { - av_init_packet(pkt); - pkt->data=NULL; - pkt->size=0; - pkt->stream_index= is->video_stream; - packet_queue_put(&is->videoq, pkt); + if(url_feof(ic->pb) || eof) { + if(is->video_stream >= 0){ + av_init_packet(pkt); + pkt->data=NULL; + pkt->size=0; + pkt->stream_index= is->video_stream; + packet_queue_put(&is->videoq, pkt); + } + SDL_Delay(10); continue; } ret = av_read_frame(ic, pkt); if (ret < 0) { - if (ret != AVERROR_EOF && url_ferror(ic->pb) == 0) { - SDL_Delay(100); /* wait for user event */ - continue; - } else + if (ret == AVERROR_EOF) + eof=1; + if (url_ferror(ic->pb)) break; + SDL_Delay(100); /* wait for user event */ + continue; } if (pkt->stream_index == is->audio_stream) { packet_queue_put(&is->audioq, pkt);