Add old patches to FFmpeg:
[vaapi:mplayer.git] / patches / 0001-Add-GMA500-workaround-for-H.264-DPB.-This-is-disable.patch
1 From 4a7fb021726e30b94fdc6cf323ceb1f5ebb81ce0 Mon Sep 17 00:00:00 2001
2 From: Gwenole Beauchesne <gbeauchesne@splitted-desktop.com>
3 Date: Mon, 28 Dec 2009 08:52:56 +0000
4 Subject: [PATCH] Add GMA500 workaround for H.264 DPB. This is disabled by default. Enable with GMA500_WORKAROUND=yes environment variable.
5
6 ---
7  ffmpeg/libavcodec/vaapi_h264.c |   66 ++++++++++++++++++++++++++++++++++++++++
8  1 files changed, 66 insertions(+), 0 deletions(-)
9
10 diff --git a/ffmpeg/libavcodec/vaapi_h264.c b/ffmpeg/libavcodec/vaapi_h264.c
11 index 29f3a81..739bce7 100644
12 --- a/ffmpeg/libavcodec/vaapi_h264.c
13 +++ b/ffmpeg/libavcodec/vaapi_h264.c
14 @@ -28,6 +28,60 @@
15   *  structures for H.264 decoding.
16   */
17  
18 +/** Parses ENV environment variable expecting "yes" | "no" values. */
19 +static int getenv_yesno(const char *env, int *pval)
20 +{
21 +    int val;
22 +    const char *env_str;
23 +
24 +    env_str = getenv(env);
25 +    if (!env_str)
26 +        return -1;
27 +
28 +    if (strcmp(env_str, "1") == 0 || strcmp(env_str, "yes") == 0)
29 +        val = 1;
30 +    else if (strcmp(env_str, "0") == 0 || strcmp(env_str, "no") == 0)
31 +        val = 0;
32 +    else
33 +        return -1;
34 +
35 +    if (pval)
36 +        *pval = val;
37 +    return 0;
38 +}
39 +
40 +/**
41 + * Use old GMA500 workaround for DPB. It requires other pictures than
42 + * those marked as "used for reference".
43 + */
44 +static int get_use_gma500_workaround(struct vaapi_context *vactx)
45 +{
46 +    int gma500_workaround_env;
47 +    const char *vendor_string;
48 +
49 +    if (getenv_yesno("GMA500_WORKAROUND", &gma500_workaround_env) < 0)
50 +        return 0;
51 +    if (!gma500_workaround_env)
52 +        return 0;
53 +
54 +    vendor_string = vaQueryVendorString(vactx->display);
55 +    if (vendor_string && strstr(vendor_string, "Intel")) {
56 +        if (strstr(vendor_string, "GMA500"))
57 +            return 1;
58 +        if (strstr(vendor_string, "Embedded Graphics Driver"))
59 +            return 1;
60 +    }
61 +    return 0;
62 +}
63 +
64 +static inline int use_gma500_workaround(struct vaapi_context *vactx)
65 +{
66 +    static int gma500_workaround = -1;
67 +    if (gma500_workaround < 0)
68 +        gma500_workaround = get_use_gma500_workaround(vactx);
69 +    return gma500_workaround;
70 +}
71 +
72  /**
73   * Initialize an empty VA API picture.
74   *
75 @@ -123,6 +177,7 @@ static int fill_vaapi_ReferenceFrames(VAPictureParameterBufferH264 *pic_param,
76  {
77      DPB dpb;
78      int i;
79 +    unsigned int list;
80  
81      dpb.size     = 0;
82      dpb.max_size = FF_ARRAY_ELEMS(pic_param->ReferenceFrames);
83 @@ -130,6 +185,17 @@ static int fill_vaapi_ReferenceFrames(VAPictureParameterBufferH264 *pic_param,
84      for (i = 0; i < dpb.max_size; i++)
85          init_vaapi_pic(&dpb.va_pics[i]);
86  
87 +    if (use_gma500_workaround(h->s.avctx->hwaccel_context)) {
88 +        /* XXX: this is really wrong */
89 +        for (list = 0; list < h->list_count; list++)
90 +            for (i = 0; i < (int)h->ref_count[list]; i++) {
91 +                Picture * const pic = &h->ref_list[list][i];
92 +                if (pic->reference && dpb_add(&dpb, pic) < 0)
93 +                    return -1;
94 +            }
95 +        return 0;
96 +    }
97 +
98      for (i = 0; i < h->short_ref_count; i++) {
99          Picture * const pic = h->short_ref[i];
100          if (pic && pic->reference && dpb_add(&dpb, pic) < 0)
101 -- 
102 1.5.4.3
103