diff mbox

[FFmpeg-devel] ffplay: add support for negative RGBA linesize

Message ID 1479166900-20049-1-git-send-email-cus@passwd.hu
State Accepted
Commit 58af48f1c3cc98afc1f25d494f197148801cf210
Headers show

Commit Message

Marton Balint Nov. 14, 2016, 11:41 p.m. UTC
This fixes the crash reported in ticket #5947.

Signed-off-by: Marton Balint <cus@passwd.hu>
---
 ffplay.c | 14 ++++++++++++--
 1 file changed, 12 insertions(+), 2 deletions(-)

Comments

Marton Balint Nov. 20, 2016, 11 p.m. UTC | #1
On Tue, 15 Nov 2016, Marton Balint wrote:

> This fixes the crash reported in ticket #5947.
>
> Signed-off-by: Marton Balint <cus@passwd.hu>
> ---
> ffplay.c | 14 ++++++++++++--
> 1 file changed, 12 insertions(+), 2 deletions(-)
>

Applied.

Regards,
Marton
diff mbox

Patch

diff --git a/ffplay.c b/ffplay.c
index 79dc768..12502f2 100644
--- a/ffplay.c
+++ b/ffplay.c
@@ -165,6 +165,7 @@  typedef struct Frame {
     int format;
     AVRational sar;
     int uploaded;
+    int flip_v;
 } Frame;
 
 typedef struct FrameQueue {
@@ -861,12 +862,20 @@  static int upload_texture(SDL_Texture *tex, AVFrame *frame, struct SwsContext **
     int ret = 0;
     switch (frame->format) {
         case AV_PIX_FMT_YUV420P:
+            if (frame->linesize[0] < 0 || frame->linesize[1] < 0 || frame->linesize[2] < 0) {
+                av_log(NULL, AV_LOG_ERROR, "Negative linesize is not supported for YUV.\n");
+                return -1;
+            }
             ret = SDL_UpdateYUVTexture(tex, NULL, frame->data[0], frame->linesize[0],
                                                   frame->data[1], frame->linesize[1],
                                                   frame->data[2], frame->linesize[2]);
             break;
         case AV_PIX_FMT_BGRA:
-            ret = SDL_UpdateTexture(tex, NULL, frame->data[0], frame->linesize[0]);
+            if (frame->linesize[0] < 0) {
+                ret = SDL_UpdateTexture(tex, NULL, frame->data[0] + frame->linesize[0] * (frame->height - 1), -frame->linesize[0]);
+            } else {
+                ret = SDL_UpdateTexture(tex, NULL, frame->data[0], frame->linesize[0]);
+            }
             break;
         default:
             /* This should only happen if we are not using avfilter... */
@@ -949,9 +958,10 @@  static void video_image_display(VideoState *is)
             if (upload_texture(vp->bmp, vp->frame, &is->img_convert_ctx) < 0)
                 return;
             vp->uploaded = 1;
+            vp->flip_v = vp->frame->linesize[0] < 0;
         }
 
-        SDL_RenderCopy(renderer, vp->bmp, NULL, &rect);
+        SDL_RenderCopyEx(renderer, vp->bmp, NULL, &rect, 0, NULL, vp->flip_v ? SDL_FLIP_VERTICAL : 0);
         if (sp) {
 #if USE_ONEPASS_SUBTITLE_RENDER
             SDL_RenderCopy(renderer, is->sub_texture, NULL, &rect);