summaryrefslogtreecommitdiff
path: root/ffplay.c
diff options
context:
space:
mode:
authorMarton Balint <cus@passwd.hu>2012-09-01 17:10:35 +0200
committerMarton Balint <cus@passwd.hu>2012-09-11 22:15:37 +0200
commit99b01e458c268cf18ac0981e644e0f835957498a (patch)
treeebf27711cee8e72fb6e358d770cf84b1780e98f9 /ffplay.c
parent255c7bb1837cd0cdc454108df9d3fc79cf363bb5 (diff)
ffplay: simplify picture allocation
This also makes sure the aspect ratio of the picture is set before allocating the picture, this way video_open can calculate with the correct aspect ratio even for the first frame. Signed-off-by: Marton Balint <cus@passwd.hu>
Diffstat (limited to 'ffplay.c')
-rw-r--r--ffplay.c35
1 files changed, 13 insertions, 22 deletions
diff --git a/ffplay.c b/ffplay.c
index 45e23c4407..1c79e2492d 100644
--- a/ffplay.c
+++ b/ffplay.c
@@ -241,11 +241,6 @@ typedef struct VideoState {
SDL_cond *continue_read_thread;
} VideoState;
-typedef struct AllocEventProps {
- VideoState *is;
- AVFrame *frame;
-} AllocEventProps;
-
/* options specified by the user */
static AVInputFormat *file_iformat;
static const char *input_filename;
@@ -1328,10 +1323,8 @@ display:
/* allocate a picture (needs to do that in main thread to avoid
potential locking problems */
-static void alloc_picture(AllocEventProps *event_props)
+static void alloc_picture(VideoState *is)
{
- VideoState *is = event_props->is;
- AVFrame *frame = event_props->frame;
VideoPicture *vp;
vp = &is->pictq[is->pictq_windex];
@@ -1343,10 +1336,7 @@ static void alloc_picture(AllocEventProps *event_props)
avfilter_unref_bufferp(&vp->picref);
#endif
- vp->width = frame->width;
- vp->height = frame->height;
-
- video_open(event_props->is, 0);
+ video_open(is, 0);
vp->bmp = SDL_CreateYUVOverlay(vp->width, vp->height,
SDL_YV12_OVERLAY,
@@ -1406,24 +1396,27 @@ static int queue_picture(VideoState *is, AVFrame *src_frame, double pts1, int64_
vp = &is->pictq[is->pictq_windex];
+#if CONFIG_AVFILTER
+ vp->sample_aspect_ratio = ((AVFilterBufferRef *)src_frame->opaque)->video->sample_aspect_ratio;
+#else
+ vp->sample_aspect_ratio = av_guess_sample_aspect_ratio(is->ic, is->video_st, src_frame);
+#endif
+
/* alloc or resize hardware picture buffer */
- if (!vp->bmp || vp->reallocate ||
+ if (!vp->bmp || vp->reallocate || !vp->allocated ||
vp->width != src_frame->width ||
vp->height != src_frame->height) {
SDL_Event event;
- AllocEventProps event_props;
-
- event_props.frame = src_frame;
- event_props.is = is;
vp->allocated = 0;
vp->reallocate = 0;
+ vp->width = src_frame->width;
+ vp->height = src_frame->height;
/* the allocation must be done in the main thread to avoid
- locking problems. We wait in this block for the event to complete,
- so we can pass a pointer to event_props to it. */
+ locking problems. */
event.type = FF_ALLOC_EVENT;
- event.user.data1 = &event_props;
+ event.user.data1 = is;
SDL_PushEvent(&event);
/* wait until the picture is allocated */
@@ -1466,7 +1459,6 @@ static int queue_picture(VideoState *is, AVFrame *src_frame, double pts1, int64_
// FIXME use direct rendering
av_picture_copy(&pict, (AVPicture *)src_frame,
src_frame->format, vp->width, vp->height);
- vp->sample_aspect_ratio = vp->picref->video->sample_aspect_ratio;
#else
sws_flags = av_get_int(sws_opts, "sws_flags", NULL);
is->img_convert_ctx = sws_getCachedContext(is->img_convert_ctx,
@@ -1478,7 +1470,6 @@ static int queue_picture(VideoState *is, AVFrame *src_frame, double pts1, int64_
}
sws_scale(is->img_convert_ctx, src_frame->data, src_frame->linesize,
0, vp->height, pict.data, pict.linesize);
- vp->sample_aspect_ratio = av_guess_sample_aspect_ratio(is->ic, is->video_st, src_frame);
#endif
/* update the bitmap content */
SDL_UnlockYUVOverlay(vp->bmp);