aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarton Balint <cus@passwd.hu>2012-12-07 00:44:17 +0100
committerMarton Balint <cus@passwd.hu>2012-12-25 13:54:07 +0100
commitcf0c63d99ae47b838b439f365994e599d056b351 (patch)
tree2810e13000504bbaef11b5f0e42579dda59ecc11
parent1be8d0fbda0a0c2a8cdfcf117cd7670488c868bb (diff)
downloadffmpeg-cf0c63d99ae47b838b439f365994e599d056b351.tar.gz
ffplay: fix greenish line on the right edge with some xv sizes
If the XV image linesize was different from the width, SDL would create an overlay wider than the actually requested one. This causes a greenish line on the right, because the rightmost texel is blended with unset data. This patch introduces a function which duplicates the rightmost texel to the unset space, that way the blending will be done with duplicated border texels. Signed-off-by: Marton Balint <cus@passwd.hu>
-rw-r--r--ffplay.c20
1 files changed, 20 insertions, 0 deletions
diff --git a/ffplay.c b/ffplay.c
index b69b503692..38673b5de1 100644
--- a/ffplay.c
+++ b/ffplay.c
@@ -1478,6 +1478,24 @@ static void alloc_picture(VideoState *is)
SDL_UnlockMutex(is->pictq_mutex);
}
+static void duplicate_right_border_pixels(SDL_Overlay *bmp) {
+ int i, width, height;
+ Uint8 *p, *maxp;
+ for (i = 0; i < 3; i++) {
+ width = bmp->w;
+ height = bmp->h;
+ if (i > 0) {
+ width >>= 1;
+ height >>= 1;
+ }
+ if (bmp->pitches[i] > width) {
+ maxp = bmp->pixels[i] + bmp->pitches[i] * height - 1;
+ for (p = bmp->pixels[i] + width - 1; p < maxp; p += bmp->pitches[i])
+ *(p+1) = *p;
+ }
+ }
+}
+
static int queue_picture(VideoState *is, AVFrame *src_frame, double pts1, int64_t pos, int serial)
{
VideoPicture *vp;
@@ -1593,6 +1611,8 @@ 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);
#endif
+ /* workaround SDL PITCH_WORKAROUND */
+ duplicate_right_border_pixels(vp->bmp);
/* update the bitmap content */
SDL_UnlockYUVOverlay(vp->bmp);