[vlc-commits] avcodec: inline ffmpeg_NewPictBuf()
Rémi Denis-Courmont
git at videolan.org
Sun Sep 27 21:57:47 CEST 2015
vlc | branch: master | Rémi Denis-Courmont <remi at remlab.net> | Sun Sep 27 16:52:48 2015 +0300| [233351e95fbbca08c85111b0c584874101b63be1] | committer: Rémi Denis-Courmont
avcodec: inline ffmpeg_NewPictBuf()
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=233351e95fbbca08c85111b0c584874101b63be1
---
modules/codec/avcodec/video.c | 45 +++++++++++++++++++++++------------------
1 file changed, 25 insertions(+), 20 deletions(-)
diff --git a/modules/codec/avcodec/video.c b/modules/codec/avcodec/video.c
index c8841e4..89b1cb3 100644
--- a/modules/codec/avcodec/video.c
+++ b/modules/codec/avcodec/video.c
@@ -199,17 +199,6 @@ static int lavc_UpdateVideoFormat( decoder_t *p_dec, AVCodecContext *p_context,
return decoder_UpdateVideoFormat( p_dec );
}
-/* Returns a new picture buffer */
-static inline picture_t *ffmpeg_NewPictBuf( decoder_t *p_dec,
- AVCodecContext *p_context )
-{
- bool hwaccel = p_dec->p_sys->p_va != NULL;
-
- if (lavc_UpdateVideoFormat(p_dec, p_context, hwaccel))
- return NULL;
- return decoder_NewPicture( p_dec );
-}
-
/**
* Copies a picture from the libavcodec-allocate buffer to a picture_t.
* This is used when not in direct rendering mode.
@@ -772,10 +761,13 @@ static picture_t *DecodeVideo( decoder_t *p_dec, block_t **pp_block )
picture_t *p_pic = frame->opaque;
if( p_pic == NULL )
- {
- /* Get a new picture */
- if( p_sys->p_va == NULL )
- p_pic = ffmpeg_NewPictBuf( p_dec, p_context );
+ { /* When direct rendering is not used, get_format() and get_buffer()
+ * might not be called. The output video format must be set here
+ * then picture buffer can be allocated. */
+ if (p_sys->p_va == NULL
+ && lavc_UpdateVideoFormat(p_dec, p_context, false) == 0)
+ p_pic = decoder_NewPicture(p_dec);
+
if( !p_pic )
{
av_frame_free(&frame);
@@ -1052,14 +1044,27 @@ static int lavc_GetFrame(struct AVCodecContext *ctx, AVFrame *frame, int flags)
frame->opaque = NULL;
wait_mt(sys);
- if (sys->p_va == NULL && !sys->b_direct_rendering)
+ if (sys->p_va == NULL)
{
- post_mt(sys);
- return avcodec_default_get_buffer2(ctx, frame, flags);
+ if (!sys->b_direct_rendering)
+ {
+ post_mt(sys);
+ return avcodec_default_get_buffer2(ctx, frame, flags);
+ }
+
+ /* Most unaccelerated decoders do not call get_format(), so we need to
+ * update the output video format here. The MT semaphore must be held
+ * to protect p_dec->fmt_out. */
+ if (lavc_UpdateVideoFormat(dec, ctx, false))
+ {
+ post_mt(sys);
+ return -1;
+ }
}
- /* The semaphore protects updates to fmt_out */
- pic = ffmpeg_NewPictBuf(dec, ctx);
+ /* FIXME: The core forces an extra output format update here, so the
+ * semaphore is still needed. */
+ pic = decoder_NewPicture(dec);
post_mt(sys);
if (pic == NULL)
return -1;
More information about the vlc-commits
mailing list