summaryrefslogtreecommitdiff
path: root/ffplay.c
diff options
context:
space:
mode:
authorMarton Balint <cus@passwd.hu>2017-08-05 22:15:10 +0200
committerMarton Balint <cus@passwd.hu>2017-08-10 22:08:40 +0200
commit493f637d1e933ebdd9f63528a7782d3617c442cb (patch)
tree0f5f75fac8a611365082f106d3bf0db0648a01f8 /ffplay.c
parentf3571048669bf876681499f49e9df492f05f73c6 (diff)
ffplay: add support for rendering yuv images with negative line size
Signed-off-by: Marton Balint <cus@passwd.hu>
Diffstat (limited to 'ffplay.c')
-rw-r--r--ffplay.c15
1 files changed, 10 insertions, 5 deletions
diff --git a/ffplay.c b/ffplay.c
index 7cc5ab1644..ee3d1628e8 100644
--- a/ffplay.c
+++ b/ffplay.c
@@ -859,13 +859,18 @@ 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");
+ if (frame->linesize[0] > 0 && frame->linesize[1] > 0 && frame->linesize[2] > 0) {
+ ret = SDL_UpdateYUVTexture(tex, NULL, frame->data[0], frame->linesize[0],
+ frame->data[1], frame->linesize[1],
+ frame->data[2], frame->linesize[2]);
+ } else if (frame->linesize[0] < 0 && frame->linesize[1] < 0 && frame->linesize[2] < 0) {
+ ret = SDL_UpdateYUVTexture(tex, NULL, frame->data[0] + frame->linesize[0] * (frame->height - 1), -frame->linesize[0],
+ frame->data[1] + frame->linesize[1] * (AV_CEIL_RSHIFT(frame->height, 1) - 1), -frame->linesize[1],
+ frame->data[2] + frame->linesize[2] * (AV_CEIL_RSHIFT(frame->height, 1) - 1), -frame->linesize[2]);
+ } else {
+ av_log(NULL, AV_LOG_ERROR, "Mixed negative and positive linesizes are not supported.\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:
if (frame->linesize[0] < 0) {