Gentoo Websites Logo
Go to: Gentoo Home Documentation Forums Lists Bugs Planet Store Wiki Get Gentoo!
View | Details | Raw Unified | Return to bug 410435 | Differences between
and this patch

Collapse All | Expand All

(-)file_not_specified_in_diff (-5 / +177 lines)
Line  Link Here
1) Swap U and V planes to VdpVideoSurfacePutBitsYCbCr to fix blue-tinged
1) Swap U and V planes to VdpVideoSurfacePutBitsYCbCr to fix blue-tinged
1
   videos.
1
   videos.
2
.
2
.
3
2) Disable VdpPresentationQueueSetBackgroundColor, so that Flash doesn't
3
2) Disable VdpPresentationQueueSetBackgroundColor, so that Flash doesn't
4
   set the background to pure black or pure white, which would cause the
4
   set the background to pure black or pure white, which would cause the
5
   VDPAU image to bleed through to other parts of the desktop with those
5
   VDPAU image to bleed through to other parts of the desktop with those
6
   very common colors.
6
   very common colors.
7
.
7
.
8
These workarounds are only enabled when running under Flash player, and
8
These workarounds are only enabled when running under Flash player, and
9
may be individually controlled via /etc/vdpau_wrapper.cfg, should they
9
may be individually controlled via /etc/vdpau_wrapper.cfg, should they
10
ever need to be disabled.
10
ever need to be disabled.
11
.
11
.
12
Note that this code stores the VDPAU backend function pointers as global
12
Note that this code stores the VDPAU backend function pointers as global
13
variables, which is technically incorrect. However, the likelihood of
13
variables, which is technically incorrect. However, the likelihood of
14
any known VDPAU implementation ever returning different values for these
14
any known VDPAU implementation ever returning different values for these
15
pointers within a single process is zero. If this becomes a problem, a
15
pointers within a single process is zero. If this becomes a problem, a
16
has table of VdpDevice to the stored pointers should be implemented.
16
has table of VdpDevice to the stored pointers should be implemented.
17
.
17
.
18
Signed-off-by: Stephen Warren <swarren@wwwdotorg.org>
18
Signed-off-by: Stephen Warren <swarren@wwwdotorg.org>
19
-- libvdpau-0.4.1.orig/src/Makefile.am
19
++ libvdpau-0.4.1/src/Makefile.am
Lines 1-6 Link Here
1
AM_CFLAGS = \
1
AM_CFLAGS = \
2
    -I$(top_srcdir)/include \
2
    -I$(top_srcdir)/include \
3
    -DVDPAU_MODULEDIR="\"$(moduledir)\"" \
3
    -DVDPAU_MODULEDIR="\"$(moduledir)\"" \
4
    -DVDPAU_SYSCONFDIR="\"$(sysconfdir)\"" \
4
    $(X11_CFLAGS) \
5
    $(X11_CFLAGS) \
5
    $(XEXT_CFLAGS)
6
    $(XEXT_CFLAGS)
6
7
Lines 27-29 libvdpauincludedir = $(includedir)/vdpau Link Here
27
libvdpauinclude_HEADERS = \
28
libvdpauinclude_HEADERS = \
28
    $(top_srcdir)/include/vdpau/vdpau.h \
29
    $(top_srcdir)/include/vdpau/vdpau.h \
29
    $(top_srcdir)/include/vdpau/vdpau_x11.h
30
    $(top_srcdir)/include/vdpau/vdpau_x11.h
30
-- libvdpau-0.4.1.orig/src/vdpau_wrapper.c
31
32
libvdpausysconfdir=$(sysconfdir)
33
libvdpausysconf_DATA = vdpau_wrapper.cfg
34
++ libvdpau-0.4.1/src/vdpau_wrapper.c
Lines 222-227 static void _vdp_close_driver(void) Link Here
222
    _vdp_imp_device_create_x11_proc = NULL;
222
    _vdp_imp_device_create_x11_proc = NULL;
223
}
223
}
224
224
225
static VdpGetProcAddress * _imp_get_proc_address;
226
static VdpVideoSurfacePutBitsYCbCr * _imp_vid_put_bits_y_cb_cr;
227
static VdpPresentationQueueSetBackgroundColor * _imp_pq_set_bg_color;
228
static int _inited_fixes;
229
static int _running_under_flash;
230
static int _enable_flash_uv_swap = 1;
231
static int _disable_flash_pq_bg_color = 1;
232
233
static VdpStatus vid_put_bits_y_cb_cr_swapped(
234
    VdpVideoSurface      surface,
235
    VdpYCbCrFormat       source_ycbcr_format,
236
    void const * const * source_data,
237
    uint32_t const *     source_pitches
238
)
239
{
240
    void const * data_reordered[3];
241
    void const * const * data;
242
243
    if (source_ycbcr_format == VDP_YCBCR_FORMAT_YV12) {
244
        data_reordered[0] = source_data[0];
245
        data_reordered[1] = source_data[2];
246
        data_reordered[2] = source_data[1];
247
        /*
248
         * source_pitches[1] and source_pitches[2] should be equal,
249
         * so no need to re-order.
250
         */
251
        data = data_reordered;
252
    }
253
    else {
254
        data = source_data;
255
    }
256
    
257
    return _imp_vid_put_bits_y_cb_cr(
258
        surface,
259
        source_ycbcr_format,
260
        data,
261
        source_pitches
262
    );
263
}
264
265
static VdpStatus pq_set_bg_color_noop(
266
    VdpPresentationQueue presentation_queue,
267
    VdpColor * const     background_color
268
)
269
{
270
    return VDP_STATUS_OK;
271
}
272
273
static VdpStatus vdp_wrapper_get_proc_address(
274
    VdpDevice device,
275
    VdpFuncId function_id,
276
    /* output parameters follow */
277
    void * *  function_pointer
278
)
279
{
280
    VdpStatus status;
281
282
    status = _imp_get_proc_address(device, function_id, function_pointer);
283
    if (status != VDP_STATUS_OK) {
284
        return status;
285
    }
286
287
    if (_running_under_flash) {
288
        switch (function_id) {
289
        case VDP_FUNC_ID_VIDEO_SURFACE_PUT_BITS_Y_CB_CR:
290
            if (_enable_flash_uv_swap) {
291
                _imp_vid_put_bits_y_cb_cr = *function_pointer;
292
                *function_pointer = vid_put_bits_y_cb_cr_swapped;
293
            }
294
            break;
295
        case VDP_FUNC_ID_PRESENTATION_QUEUE_SET_BACKGROUND_COLOR:
296
            if (_disable_flash_pq_bg_color) {
297
                _imp_pq_set_bg_color = *function_pointer;
298
                *function_pointer = pq_set_bg_color_noop;
299
            }
300
            break;
301
        default:
302
            break;
303
        }
304
    }
305
306
    return VDP_STATUS_OK;
307
}
308
309
static void init_running_under_flash(void)
310
{
311
    FILE *fp;
312
    char buffer[1024];
313
    int ret, i;
314
315
    fp = fopen("/proc/self/cmdline", "r");
316
    if (!fp) {
317
        return;
318
    }
319
    ret = fread(buffer, 1, sizeof(buffer) - 1, fp);
320
    fclose(fp);
321
    if (ret < 0) {
322
        return;
323
    }
324
    /*
325
     * Sometimes the file contains null between arguments. Wipe these out so
326
     * strstr doesn't stop early.
327
     */
328
    for (i = 0; i < ret; i++) {
329
        if (buffer[i] == '\0') {
330
            buffer[i] = 'x';
331
        }
332
    }
333
    buffer[ret] = '\0';
334
335
    if (strstr(buffer, "libflashplayer") != NULL) {
336
        _running_under_flash = 1;
337
    }
338
}
339
340
void init_config(void)
341
{
342
    FILE *fp;
343
    char buffer[1024];
344
    int ret;
345
346
    fp = fopen(VDPAU_SYSCONFDIR "/vdpau_wrapper.cfg", "r");
347
    if (!fp) {
348
        return;
349
    }
350
351
    while (fgets(buffer, sizeof(buffer), fp) != NULL) {
352
        char * equals = strchr(buffer, '=');
353
        char * param;
354
355
        if (equals == NULL) {
356
            continue;
357
        }
358
359
        *equals = '\0';
360
        param = equals + 1;
361
362
        if (!strcmp(buffer, "enable_flash_uv_swap")) {
363
            _enable_flash_uv_swap = atoi(param);
364
        }
365
        else if (!strcmp(buffer, "disable_flash_pq_bg_color")) {
366
            _disable_flash_pq_bg_color = atoi(param);
367
        }
368
    }
369
}
370
371
void init_fixes(void)
372
{
373
    if (_inited_fixes) {
374
        return;
375
    }
376
    _inited_fixes = 1;
377
378
    init_running_under_flash();
379
    init_config();
380
}
381
225
VdpStatus vdp_device_create_x11(
382
VdpStatus vdp_device_create_x11(
226
    Display *             display,
383
    Display *             display,
227
    int                   screen,
384
    int                   screen,
Lines 232-237 VdpStatus vdp_device_create_x11( Link Here
232
{
389
{
233
    VdpStatus status;
390
    VdpStatus status;
234
391
392
    init_fixes();
393
235
    if (!_vdp_imp_device_create_x11_proc) {
394
    if (!_vdp_imp_device_create_x11_proc) {
236
        status = _vdp_open_driver(display, screen);
395
        status = _vdp_open_driver(display, screen);
237
        if (status != VDP_STATUS_OK) {
396
        if (status != VDP_STATUS_OK) {
Lines 240-249 VdpStatus vdp_device_create_x11( Link Here
240
        }
399
        }
241
    }
400
    }
242
401
243
    return _vdp_imp_device_create_x11_proc(
402
    status = _vdp_imp_device_create_x11_proc(
244
        display,
403
        display,
245
        screen,
404
        screen,
246
        device,
405
        device,
247
        get_proc_address
406
        &_imp_get_proc_address
248
    );
407
    );
408
    if (status != VDP_STATUS_OK) {
409
        return status;
410
    }
411
412
    *get_proc_address = vdp_wrapper_get_proc_address;
413
414
    return VDP_STATUS_OK;
249
}
415
}
250
-- /dev/null
416
++ libvdpau-0.4.1/src/vdpau_wrapper.cfg
Line 0 Link Here
1
enable_flash_uv_swap=1
2
disable_flash_pq_bg_color=1

Return to bug 410435