| Index: source/patched-ffmpeg-mt/ffplay.c
|
| ===================================================================
|
| --- source/patched-ffmpeg-mt/ffplay.c (revision 59334)
|
| +++ source/patched-ffmpeg-mt/ffplay.c (working copy)
|
| @@ -19,6 +19,8 @@
|
| * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
| */
|
|
|
| +#define _XOPEN_SOURCE 600
|
| +
|
| #include "config.h"
|
| #include <inttypes.h>
|
| #include <math.h>
|
| @@ -26,6 +28,7 @@
|
| #include "libavutil/avstring.h"
|
| #include "libavutil/colorspace.h"
|
| #include "libavutil/pixdesc.h"
|
| +#include "libavcore/imgutils.h"
|
| #include "libavcore/parseutils.h"
|
| #include "libavformat/avformat.h"
|
| #include "libavdevice/avdevice.h"
|
| @@ -694,10 +697,10 @@
|
| vp = &is->pictq[is->pictq_rindex];
|
| if (vp->bmp) {
|
| #if CONFIG_AVFILTER
|
| - if (vp->picref->pixel_aspect.num == 0)
|
| + if (vp->picref->video->pixel_aspect.num == 0)
|
| aspect_ratio = 0;
|
| else
|
| - aspect_ratio = av_q2d(vp->picref->pixel_aspect);
|
| + aspect_ratio = av_q2d(vp->picref->video->pixel_aspect);
|
| #else
|
|
|
| /* XXX: use variable in the frame */
|
| @@ -1290,6 +1293,60 @@
|
| }
|
| }
|
|
|
| +static void stream_close(VideoState *is)
|
| +{
|
| + VideoPicture *vp;
|
| + int i;
|
| + /* XXX: use a special url_shutdown call to abort parse cleanly */
|
| + is->abort_request = 1;
|
| + SDL_WaitThread(is->parse_tid, NULL);
|
| + SDL_WaitThread(is->refresh_tid, NULL);
|
| +
|
| + /* free all pictures */
|
| + for(i=0;i<VIDEO_PICTURE_QUEUE_SIZE; i++) {
|
| + vp = &is->pictq[i];
|
| +#if CONFIG_AVFILTER
|
| + if (vp->picref) {
|
| + avfilter_unref_buffer(vp->picref);
|
| + vp->picref = NULL;
|
| + }
|
| +#endif
|
| + if (vp->bmp) {
|
| + SDL_FreeYUVOverlay(vp->bmp);
|
| + vp->bmp = NULL;
|
| + }
|
| + }
|
| + SDL_DestroyMutex(is->pictq_mutex);
|
| + SDL_DestroyCond(is->pictq_cond);
|
| + SDL_DestroyMutex(is->subpq_mutex);
|
| + SDL_DestroyCond(is->subpq_cond);
|
| +#if !CONFIG_AVFILTER
|
| + if (is->img_convert_ctx)
|
| + sws_freeContext(is->img_convert_ctx);
|
| +#endif
|
| + av_free(is);
|
| +}
|
| +
|
| +static void do_exit(void)
|
| +{
|
| + int i;
|
| + if (cur_stream) {
|
| + stream_close(cur_stream);
|
| + cur_stream = NULL;
|
| + }
|
| + for (i = 0; i < AVMEDIA_TYPE_NB; i++)
|
| + av_free(avcodec_opts[i]);
|
| + av_free(avformat_opts);
|
| + av_free(sws_opts);
|
| +#if CONFIG_AVFILTER
|
| + avfilter_uninit();
|
| +#endif
|
| + if (show_status)
|
| + printf("\n");
|
| + SDL_Quit();
|
| + exit(0);
|
| +}
|
| +
|
| /* allocate a picture (needs to do that in main thread to avoid
|
| potential locking problems */
|
| static void alloc_picture(void *opaque)
|
| @@ -1319,6 +1376,14 @@
|
| vp->bmp = SDL_CreateYUVOverlay(vp->width, vp->height,
|
| SDL_YV12_OVERLAY,
|
| screen);
|
| + if (!vp->bmp || vp->bmp->pitches[0] < vp->width) {
|
| + /* SDL allocates a buffer smaller than requested if the video
|
| + * overlay hardware is unable to support the requested size. */
|
| + fprintf(stderr, "Error: the video system does not support an image\n"
|
| + "size of %dx%d pixels. Try using -lowres or -vf \"scale=w:h\"\n"
|
| + "to reduce the image size.\n", vp->width, vp->height );
|
| + do_exit();
|
| + }
|
|
|
| SDL_LockMutex(is->pictq_mutex);
|
| vp->allocated = 1;
|
| @@ -1582,8 +1647,8 @@
|
| if(!(ref = avfilter_get_video_buffer(ctx->outputs[0], perms, w, h)))
|
| return -1;
|
|
|
| - ref->w = codec->width;
|
| - ref->h = codec->height;
|
| + ref->video->w = codec->width;
|
| + ref->video->h = codec->height;
|
| for(i = 0; i < 4; i ++) {
|
| unsigned hshift = (i == 1 || i == 2) ? av_pix_fmt_descriptors[ref->format].log2_chroma_w : 0;
|
| unsigned vshift = (i == 1 || i == 2) ? av_pix_fmt_descriptors[ref->format].log2_chroma_h : 0;
|
| @@ -1616,7 +1681,7 @@
|
| return codec->get_buffer(codec, pic);
|
| }
|
|
|
| - if ((codec->width != ref->w) || (codec->height != ref->h) ||
|
| + if ((codec->width != ref->video->w) || (codec->height != ref->video->h) ||
|
| (codec->pix_fmt != ref->format)) {
|
| av_log(codec, AV_LOG_ERROR, "Picture properties changed.\n");
|
| return -1;
|
| @@ -1670,14 +1735,15 @@
|
| picref = avfilter_ref_buffer(priv->frame->opaque, ~0);
|
| } else {
|
| picref = avfilter_get_video_buffer(link, AV_PERM_WRITE, link->w, link->h);
|
| - av_picture_copy((AVPicture *)&picref->data, (AVPicture *)priv->frame,
|
| - picref->format, link->w, link->h);
|
| + av_image_copy(picref->data, picref->linesize,
|
| + priv->frame->data, priv->frame->linesize,
|
| + picref->format, link->w, link->h);
|
| }
|
| av_free_packet(&pkt);
|
|
|
| picref->pts = pts;
|
| picref->pos = pkt.pos;
|
| - picref->pixel_aspect = priv->is->video_st->codec->sample_aspect_ratio;
|
| + picref->video->pixel_aspect = priv->is->video_st->codec->sample_aspect_ratio;
|
| avfilter_start_frame(link, picref);
|
| avfilter_draw_slice(link, 0, link->h, 1);
|
| avfilter_end_frame(link);
|
| @@ -1790,8 +1856,8 @@
|
| snprintf(sws_flags_str, sizeof(sws_flags_str), "flags=%d", sws_flags);
|
| graph->scale_sws_opts = av_strdup(sws_flags_str);
|
|
|
| - if(!(filt_src = avfilter_open(&input_filter, "src"))) goto the_end;
|
| - if(!(filt_out = avfilter_open(&output_filter, "out"))) goto the_end;
|
| + if (avfilter_open(&filt_src, &input_filter, "src") < 0) goto the_end;
|
| + if (avfilter_open(&filt_out, &output_filter, "out") < 0) goto the_end;
|
|
|
| if(avfilter_init_filter(filt_src, NULL, is)) goto the_end;
|
| if(avfilter_init_filter(filt_out, NULL, frame)) goto the_end;
|
| @@ -2658,40 +2724,6 @@
|
| return is;
|
| }
|
|
|
| -static void stream_close(VideoState *is)
|
| -{
|
| - VideoPicture *vp;
|
| - int i;
|
| - /* XXX: use a special url_shutdown call to abort parse cleanly */
|
| - is->abort_request = 1;
|
| - SDL_WaitThread(is->parse_tid, NULL);
|
| - SDL_WaitThread(is->refresh_tid, NULL);
|
| -
|
| - /* free all pictures */
|
| - for(i=0;i<VIDEO_PICTURE_QUEUE_SIZE; i++) {
|
| - vp = &is->pictq[i];
|
| -#if CONFIG_AVFILTER
|
| - if (vp->picref) {
|
| - avfilter_unref_buffer(vp->picref);
|
| - vp->picref = NULL;
|
| - }
|
| -#endif
|
| - if (vp->bmp) {
|
| - SDL_FreeYUVOverlay(vp->bmp);
|
| - vp->bmp = NULL;
|
| - }
|
| - }
|
| - SDL_DestroyMutex(is->pictq_mutex);
|
| - SDL_DestroyCond(is->pictq_cond);
|
| - SDL_DestroyMutex(is->subpq_mutex);
|
| - SDL_DestroyCond(is->subpq_cond);
|
| -#if !CONFIG_AVFILTER
|
| - if (is->img_convert_ctx)
|
| - sws_freeContext(is->img_convert_ctx);
|
| -#endif
|
| - av_free(is);
|
| -}
|
| -
|
| static void stream_cycle_channel(VideoState *is, int codec_type)
|
| {
|
| AVFormatContext *ic = is->ic;
|
| @@ -2769,26 +2801,6 @@
|
| step = 1;
|
| }
|
|
|
| -static void do_exit(void)
|
| -{
|
| - int i;
|
| - if (cur_stream) {
|
| - stream_close(cur_stream);
|
| - cur_stream = NULL;
|
| - }
|
| - for (i = 0; i < AVMEDIA_TYPE_NB; i++)
|
| - av_free(avcodec_opts[i]);
|
| - av_free(avformat_opts);
|
| - av_free(sws_opts);
|
| -#if CONFIG_AVFILTER
|
| - avfilter_uninit();
|
| -#endif
|
| - if (show_status)
|
| - printf("\n");
|
| - SDL_Quit();
|
| - exit(0);
|
| -}
|
| -
|
| static void toggle_audio_display(void)
|
| {
|
| if (cur_stream) {
|
|
|