[07/13] st/va: get mjpeg slice header

Submitted by Zhang, Boyuan on Aug. 16, 2018, 4:06 p.m.

Details

Message ID 1534435591-22542-7-git-send-email-boyuan.zhang@amd.com
State New
Headers show
Series "Series without cover letter" ( rev: 1 ) in Mesa

Not browsing as part of any series.

Commit Message

Zhang, Boyuan Aug. 16, 2018, 4:06 p.m.
From: Boyuan Zhang <boyuan.zhang@amd.com>

Move the previous get_mjpeg_slice_header function from radeon/vcn to st/va.

Signed-off-by: Boyuan Zhang <boyuan.zhang@amd.com>
---
 src/gallium/state_trackers/va/picture.c       |   3 +
 src/gallium/state_trackers/va/picture_mjpeg.c | 132 ++++++++++++++++++++++++++
 src/gallium/state_trackers/va/va_private.h    |   3 +
 3 files changed, 138 insertions(+)

Patch hide | download patch | download mbox

diff --git a/src/gallium/state_trackers/va/picture.c b/src/gallium/state_trackers/va/picture.c
index f2e9ba8..d326ed4 100644
--- a/src/gallium/state_trackers/va/picture.c
+++ b/src/gallium/state_trackers/va/picture.c
@@ -293,6 +293,9 @@  handleVASliceDataBufferType(vlVaContext *context, vlVaBuffer *buf)
       sizes[num_buffers++] = context->mpeg4.start_code_size;
       break;
    case PIPE_VIDEO_FORMAT_JPEG:
+      vlVaGetJpegSliceHeader(context);
+      buffers[num_buffers] = (void *)context->mjpeg.slice_header;
+      sizes[num_buffers++] = context->mjpeg.slice_header_size;
       break;
    default:
       break;
diff --git a/src/gallium/state_trackers/va/picture_mjpeg.c b/src/gallium/state_trackers/va/picture_mjpeg.c
index 396b743..f1292ea 100644
--- a/src/gallium/state_trackers/va/picture_mjpeg.c
+++ b/src/gallium/state_trackers/va/picture_mjpeg.c
@@ -114,3 +114,135 @@  void vlVaHandleSliceParameterBufferMJPEG(vlVaContext *context, vlVaBuffer *buf)
    context->desc.mjpeg.slice_parameter.restart_interval = mjpeg->restart_interval;
    context->desc.mjpeg.slice_parameter.num_mcus = mjpeg->num_mcus;
 }
+
+void vlVaGetJpegSliceHeader(vlVaContext *context)
+{
+   int size = 0, saved_size, len_pos, i;
+   uint16_t *bs;
+   uint8_t *p = context->mjpeg.slice_header;
+
+   /* SOI */
+   p[size++] = 0xff;
+   p[size++] = 0xd8;
+
+   /* DQT */
+   p[size++] = 0xff;
+   p[size++] = 0xdb;
+
+   len_pos = size++;
+   size++;
+
+   for (i = 0; i < 4; ++i) {
+      if (context->desc.mjpeg.quantization_table.load_quantiser_table[i] == 0)
+         continue;
+
+      p[size++] = i;
+      memcpy((p + size), &context->desc.mjpeg.quantization_table.quantiser_table[i], 64);
+      size += 64;
+   }
+
+   bs = (uint16_t*)&p[len_pos];
+   *bs = util_bswap16(size - 4);
+
+   saved_size = size;
+
+   /* DHT */
+   p[size++] = 0xff;
+   p[size++] = 0xc4;
+
+   len_pos = size++;
+   size++;
+
+   for (i = 0; i < 2; ++i) {
+      if (context->desc.mjpeg.huffman_table.load_huffman_table[i] == 0)
+         continue;
+
+      p[size++] = 0x00 | i;
+      memcpy((p + size), &context->desc.mjpeg.huffman_table.table[i].num_dc_codes, 16);
+      size += 16;
+      memcpy((p + size), &context->desc.mjpeg.huffman_table.table[i].dc_values, 12);
+      size += 12;
+   }
+
+   for (i = 0; i < 2; ++i) {
+      if (context->desc.mjpeg.huffman_table.load_huffman_table[i] == 0)
+         continue;
+
+      p[size++] = 0x10 | i;
+      memcpy((p + size), &context->desc.mjpeg.huffman_table.table[i].num_ac_codes, 16);
+      size += 16;
+      memcpy((p + size), &context->desc.mjpeg.huffman_table.table[i].ac_values, 162);
+      size += 162;
+   }
+
+   bs = (uint16_t*)&p[len_pos];
+   *bs = util_bswap16(size - saved_size - 2);
+
+   saved_size = size;
+
+   /* DRI */
+   if (context->desc.mjpeg.slice_parameter.restart_interval) {
+      p[size++] = 0xff;
+      p[size++] = 0xdd;
+      p[size++] = 0x00;
+      p[size++] = 0x04;
+      bs = (uint16_t*)&p[size++];
+      *bs = util_bswap16(context->desc.mjpeg.slice_parameter.restart_interval);
+      saved_size = ++size;
+   }
+
+   /* SOF */
+   p[size++] = 0xff;
+   p[size++] = 0xc0;
+
+   len_pos = size++;
+   size++;
+
+   p[size++] = 0x08;
+
+   bs = (uint16_t*)&p[size++];
+   *bs = util_bswap16(context->desc.mjpeg.picture_parameter.picture_height);
+   size++;
+
+   bs = (uint16_t*)&p[size++];
+   *bs = util_bswap16(context->desc.mjpeg.picture_parameter.picture_width);
+   size++;
+
+   p[size++] = context->desc.mjpeg.picture_parameter.num_components;
+
+   for (i = 0; i < context->desc.mjpeg.picture_parameter.num_components; ++i) {
+      p[size++] = context->desc.mjpeg.picture_parameter.components[i].component_id;
+      p[size++] = context->desc.mjpeg.picture_parameter.components[i].h_sampling_factor << 4 |
+                 context->desc.mjpeg.picture_parameter.components[i].v_sampling_factor;
+      p[size++] = context->desc.mjpeg.picture_parameter.components[i].quantiser_table_selector;
+   }
+
+   bs = (uint16_t*)&p[len_pos];
+   *bs = util_bswap16(size - saved_size - 2);
+
+   saved_size = size;
+
+   /* SOS */
+   p[size++] = 0xff;
+   p[size++] = 0xda;
+
+   len_pos = size++;
+   size++;
+
+   p[size++] = context->desc.mjpeg.slice_parameter.num_components;
+
+   for (i = 0; i < context->desc.mjpeg.slice_parameter.num_components; ++i) {
+      p[size++] = context->desc.mjpeg.slice_parameter.components[i].component_selector;
+      p[size++] = context->desc.mjpeg.slice_parameter.components[i].dc_table_selector << 4 |
+                 context->desc.mjpeg.slice_parameter.components[i].ac_table_selector;
+   }
+
+   p[size++] = 0x00;
+   p[size++] = 0x3f;
+   p[size++] = 0x00;
+
+   bs = (uint16_t*)&p[len_pos];
+   *bs = util_bswap16(size - saved_size - 2);
+
+   context->mjpeg.slice_header_size = size;
+}
diff --git a/src/gallium/state_trackers/va/va_private.h b/src/gallium/state_trackers/va/va_private.h
index 4396abb..a40dd79 100644
--- a/src/gallium/state_trackers/va/va_private.h
+++ b/src/gallium/state_trackers/va/va_private.h
@@ -285,6 +285,8 @@  typedef struct {
 
    struct {
       unsigned sampling_factor;
+      uint8_t slice_header[1488];
+      unsigned int slice_header_size;
    } mjpeg;
 
    struct vl_deint_filter *deint;
@@ -421,6 +423,7 @@  void vlVaHandlePictureParameterBufferMPEG4(vlVaDriver *drv, vlVaContext *context
 void vlVaHandleIQMatrixBufferMPEG4(vlVaContext *context, vlVaBuffer *buf);
 void vlVaHandleSliceParameterBufferMPEG4(vlVaContext *context, vlVaBuffer *buf);
 void vlVaDecoderFixMPEG4Startcode(vlVaContext *context);
+void vlVaGetJpegSliceHeader(vlVaContext *context);
 void vlVaHandlePictureParameterBufferHEVC(vlVaDriver *drv, vlVaContext *context, vlVaBuffer *buf);
 void vlVaHandleIQMatrixBufferHEVC(vlVaContext *context, vlVaBuffer *buf);
 void vlVaHandleSliceParameterBufferHEVC(vlVaContext *context, vlVaBuffer *buf);

Comments

On 08/16/2018 12:06 PM, boyuan.zhang@amd.com wrote:
> From: Boyuan Zhang <boyuan.zhang@amd.com>
>
> Move the previous get_mjpeg_slice_header function from radeon/vcn to st/va.
>
> Signed-off-by: Boyuan Zhang <boyuan.zhang@amd.com>
> ---
>   src/gallium/state_trackers/va/picture.c       |   3 +
>   src/gallium/state_trackers/va/picture_mjpeg.c | 132 ++++++++++++++++++++++++++
>   src/gallium/state_trackers/va/va_private.h    |   3 +
>   3 files changed, 138 insertions(+)
>
> diff --git a/src/gallium/state_trackers/va/picture.c b/src/gallium/state_trackers/va/picture.c
> index f2e9ba8..d326ed4 100644
> --- a/src/gallium/state_trackers/va/picture.c
> +++ b/src/gallium/state_trackers/va/picture.c
> @@ -293,6 +293,9 @@ handleVASliceDataBufferType(vlVaContext *context, vlVaBuffer *buf)
>         sizes[num_buffers++] = context->mpeg4.start_code_size;
>         break;
>      case PIPE_VIDEO_FORMAT_JPEG:
> +      vlVaGetJpegSliceHeader(context);
> +      buffers[num_buffers] = (void *)context->mjpeg.slice_header;
> +      sizes[num_buffers++] = context->mjpeg.slice_header_size;
>         break;
>      default:
>         break;
> diff --git a/src/gallium/state_trackers/va/picture_mjpeg.c b/src/gallium/state_trackers/va/picture_mjpeg.c
> index 396b743..f1292ea 100644
> --- a/src/gallium/state_trackers/va/picture_mjpeg.c
> +++ b/src/gallium/state_trackers/va/picture_mjpeg.c
> @@ -114,3 +114,135 @@ void vlVaHandleSliceParameterBufferMJPEG(vlVaContext *context, vlVaBuffer *buf)
>      context->desc.mjpeg.slice_parameter.restart_interval = mjpeg->restart_interval;
>      context->desc.mjpeg.slice_parameter.num_mcus = mjpeg->num_mcus;
>   }
> +
> +void vlVaGetJpegSliceHeader(vlVaContext *context)
> +{
> +   int size = 0, saved_size, len_pos, i;
> +   uint16_t *bs;
> +   uint8_t *p = context->mjpeg.slice_header;
> +
> +   /* SOI */
> +   p[size++] = 0xff;
> +   p[size++] = 0xd8;
> +
> +   /* DQT */
> +   p[size++] = 0xff;
> +   p[size++] = 0xdb;
> +
> +   len_pos = size++;
> +   size++;
> +
> +   for (i = 0; i < 4; ++i) {
> +      if (context->desc.mjpeg.quantization_table.load_quantiser_table[i] == 0)
> +         continue;
> +
> +      p[size++] = i;
> +      memcpy((p + size), &context->desc.mjpeg.quantization_table.quantiser_table[i], 64);
> +      size += 64;
> +   }
> +
> +   bs = (uint16_t*)&p[len_pos];
> +   *bs = util_bswap16(size - 4);
> +
> +   saved_size = size;
> +
> +   /* DHT */
> +   p[size++] = 0xff;
> +   p[size++] = 0xc4;
> +
> +   len_pos = size++;
> +   size++;
> +
> +   for (i = 0; i < 2; ++i) {
> +      if (context->desc.mjpeg.huffman_table.load_huffman_table[i] == 0)
> +         continue;
> +
> +      p[size++] = 0x00 | i;
> +      memcpy((p + size), &context->desc.mjpeg.huffman_table.table[i].num_dc_codes, 16);
> +      size += 16;
> +      memcpy((p + size), &context->desc.mjpeg.huffman_table.table[i].dc_values, 12);
> +      size += 12;
> +   }
> +
> +   for (i = 0; i < 2; ++i) {
> +      if (context->desc.mjpeg.huffman_table.load_huffman_table[i] == 0)
> +         continue;
> +
> +      p[size++] = 0x10 | i;
> +      memcpy((p + size), &context->desc.mjpeg.huffman_table.table[i].num_ac_codes, 16);
> +      size += 16;
> +      memcpy((p + size), &context->desc.mjpeg.huffman_table.table[i].ac_values, 162);
> +      size += 162;
> +   }
> +
> +   bs = (uint16_t*)&p[len_pos];
> +   *bs = util_bswap16(size - saved_size - 2);
> +
> +   saved_size = size;
> +
> +   /* DRI */
> +   if (context->desc.mjpeg.slice_parameter.restart_interval) {
> +      p[size++] = 0xff;
> +      p[size++] = 0xdd;
> +      p[size++] = 0x00;
> +      p[size++] = 0x04;
> +      bs = (uint16_t*)&p[size++];
> +      *bs = util_bswap16(context->desc.mjpeg.slice_parameter.restart_interval);
> +      saved_size = ++size;
> +   }
> +
> +   /* SOF */
> +   p[size++] = 0xff;
> +   p[size++] = 0xc0;
> +
> +   len_pos = size++;
> +   size++;
> +
> +   p[size++] = 0x08;
> +
> +   bs = (uint16_t*)&p[size++];
> +   *bs = util_bswap16(context->desc.mjpeg.picture_parameter.picture_height);
> +   size++;
> +
> +   bs = (uint16_t*)&p[size++];
> +   *bs = util_bswap16(context->desc.mjpeg.picture_parameter.picture_width);
> +   size++;
> +
> +   p[size++] = context->desc.mjpeg.picture_parameter.num_components;
> +
> +   for (i = 0; i < context->desc.mjpeg.picture_parameter.num_components; ++i) {
> +      p[size++] = context->desc.mjpeg.picture_parameter.components[i].component_id;
> +      p[size++] = context->desc.mjpeg.picture_parameter.components[i].h_sampling_factor << 4 |
> +                 context->desc.mjpeg.picture_parameter.components[i].v_sampling_factor;
> +      p[size++] = context->desc.mjpeg.picture_parameter.components[i].quantiser_table_selector;
> +   }
> +
> +   bs = (uint16_t*)&p[len_pos];
> +   *bs = util_bswap16(size - saved_size - 2);
> +
> +   saved_size = size;
> +
> +   /* SOS */
> +   p[size++] = 0xff;
> +   p[size++] = 0xda;
> +
> +   len_pos = size++;
> +   size++;
> +
> +   p[size++] = context->desc.mjpeg.slice_parameter.num_components;
> +
> +   for (i = 0; i < context->desc.mjpeg.slice_parameter.num_components; ++i) {
> +      p[size++] = context->desc.mjpeg.slice_parameter.components[i].component_selector;
> +      p[size++] = context->desc.mjpeg.slice_parameter.components[i].dc_table_selector << 4 |
> +                 context->desc.mjpeg.slice_parameter.components[i].ac_table_selector;
> +   }
> +
> +   p[size++] = 0x00;
> +   p[size++] = 0x3f;
> +   p[size++] = 0x00;
> +
> +   bs = (uint16_t*)&p[len_pos];
> +   *bs = util_bswap16(size - saved_size - 2);
> +
> +   context->mjpeg.slice_header_size = size;
> +}
> diff --git a/src/gallium/state_trackers/va/va_private.h b/src/gallium/state_trackers/va/va_private.h
> index 4396abb..a40dd79 100644
> --- a/src/gallium/state_trackers/va/va_private.h
> +++ b/src/gallium/state_trackers/va/va_private.h
> @@ -285,6 +285,8 @@ typedef struct {
>   
>      struct {
>         unsigned sampling_factor;
> +      uint8_t slice_header[1488];
Can this number cover the largest case number for all being parsed markers?
It would be better if we can list the largest size for the marker in 
Macro, and then add them together.

Regards,
Leo


> +      unsigned int slice_header_size;
>      } mjpeg;
>   
>      struct vl_deint_filter *deint;
> @@ -421,6 +423,7 @@ void vlVaHandlePictureParameterBufferMPEG4(vlVaDriver *drv, vlVaContext *context
>   void vlVaHandleIQMatrixBufferMPEG4(vlVaContext *context, vlVaBuffer *buf);
>   void vlVaHandleSliceParameterBufferMPEG4(vlVaContext *context, vlVaBuffer *buf);
>   void vlVaDecoderFixMPEG4Startcode(vlVaContext *context);
> +void vlVaGetJpegSliceHeader(vlVaContext *context);
>   void vlVaHandlePictureParameterBufferHEVC(vlVaDriver *drv, vlVaContext *context, vlVaBuffer *buf);
>   void vlVaHandleIQMatrixBufferHEVC(vlVaContext *context, vlVaBuffer *buf);
>   void vlVaHandleSliceParameterBufferHEVC(vlVaContext *context, vlVaBuffer *buf);
On 2018-08-16 01:26 PM, Leo Liu wrote:
>
>
> On 08/16/2018 12:06 PM, boyuan.zhang@amd.com wrote:
>> From: Boyuan Zhang <boyuan.zhang@amd.com>
>>
>> Move the previous get_mjpeg_slice_header function from radeon/vcn to 
>> st/va.
>>
>> Signed-off-by: Boyuan Zhang <boyuan.zhang@amd.com>
>> ---
>>   src/gallium/state_trackers/va/picture.c       |   3 +
>>   src/gallium/state_trackers/va/picture_mjpeg.c | 132 
>> ++++++++++++++++++++++++++
>>   src/gallium/state_trackers/va/va_private.h    |   3 +
>>   3 files changed, 138 insertions(+)
>>
>> diff --git a/src/gallium/state_trackers/va/picture.c 
>> b/src/gallium/state_trackers/va/picture.c
>> index f2e9ba8..d326ed4 100644
>> --- a/src/gallium/state_trackers/va/picture.c
>> +++ b/src/gallium/state_trackers/va/picture.c
>> @@ -293,6 +293,9 @@ handleVASliceDataBufferType(vlVaContext *context, 
>> vlVaBuffer *buf)
>>         sizes[num_buffers++] = context->mpeg4.start_code_size;
>>         break;
>>      case PIPE_VIDEO_FORMAT_JPEG:
>> +      vlVaGetJpegSliceHeader(context);
>> +      buffers[num_buffers] = (void *)context->mjpeg.slice_header;
>> +      sizes[num_buffers++] = context->mjpeg.slice_header_size;
>>         break;
>>      default:
>>         break;
>> diff --git a/src/gallium/state_trackers/va/picture_mjpeg.c 
>> b/src/gallium/state_trackers/va/picture_mjpeg.c
>> index 396b743..f1292ea 100644
>> --- a/src/gallium/state_trackers/va/picture_mjpeg.c
>> +++ b/src/gallium/state_trackers/va/picture_mjpeg.c
>> @@ -114,3 +114,135 @@ void 
>> vlVaHandleSliceParameterBufferMJPEG(vlVaContext *context, vlVaBuffer 
>> *buf)
>>      context->desc.mjpeg.slice_parameter.restart_interval = 
>> mjpeg->restart_interval;
>>      context->desc.mjpeg.slice_parameter.num_mcus = mjpeg->num_mcus;
>>   }
>> +
>> +void vlVaGetJpegSliceHeader(vlVaContext *context)
>> +{
>> +   int size = 0, saved_size, len_pos, i;
>> +   uint16_t *bs;
>> +   uint8_t *p = context->mjpeg.slice_header;
>> +
>> +   /* SOI */
>> +   p[size++] = 0xff;
>> +   p[size++] = 0xd8;
>> +
>> +   /* DQT */
>> +   p[size++] = 0xff;
>> +   p[size++] = 0xdb;
>> +
>> +   len_pos = size++;
>> +   size++;
>> +
>> +   for (i = 0; i < 4; ++i) {
>> +      if 
>> (context->desc.mjpeg.quantization_table.load_quantiser_table[i] == 0)
>> +         continue;
>> +
>> +      p[size++] = i;
>> +      memcpy((p + size), 
>> &context->desc.mjpeg.quantization_table.quantiser_table[i], 64);
>> +      size += 64;
>> +   }
>> +
>> +   bs = (uint16_t*)&p[len_pos];
>> +   *bs = util_bswap16(size - 4);
>> +
>> +   saved_size = size;
>> +
>> +   /* DHT */
>> +   p[size++] = 0xff;
>> +   p[size++] = 0xc4;
>> +
>> +   len_pos = size++;
>> +   size++;
>> +
>> +   for (i = 0; i < 2; ++i) {
>> +      if (context->desc.mjpeg.huffman_table.load_huffman_table[i] == 0)
>> +         continue;
>> +
>> +      p[size++] = 0x00 | i;
>> +      memcpy((p + size), 
>> &context->desc.mjpeg.huffman_table.table[i].num_dc_codes, 16);
>> +      size += 16;
>> +      memcpy((p + size), 
>> &context->desc.mjpeg.huffman_table.table[i].dc_values, 12);
>> +      size += 12;
>> +   }
>> +
>> +   for (i = 0; i < 2; ++i) {
>> +      if (context->desc.mjpeg.huffman_table.load_huffman_table[i] == 0)
>> +         continue;
>> +
>> +      p[size++] = 0x10 | i;
>> +      memcpy((p + size), 
>> &context->desc.mjpeg.huffman_table.table[i].num_ac_codes, 16);
>> +      size += 16;
>> +      memcpy((p + size), 
>> &context->desc.mjpeg.huffman_table.table[i].ac_values, 162);
>> +      size += 162;
>> +   }
>> +
>> +   bs = (uint16_t*)&p[len_pos];
>> +   *bs = util_bswap16(size - saved_size - 2);
>> +
>> +   saved_size = size;
>> +
>> +   /* DRI */
>> +   if (context->desc.mjpeg.slice_parameter.restart_interval) {
>> +      p[size++] = 0xff;
>> +      p[size++] = 0xdd;
>> +      p[size++] = 0x00;
>> +      p[size++] = 0x04;
>> +      bs = (uint16_t*)&p[size++];
>> +      *bs = 
>> util_bswap16(context->desc.mjpeg.slice_parameter.restart_interval);
>> +      saved_size = ++size;
>> +   }
>> +
>> +   /* SOF */
>> +   p[size++] = 0xff;
>> +   p[size++] = 0xc0;
>> +
>> +   len_pos = size++;
>> +   size++;
>> +
>> +   p[size++] = 0x08;
>> +
>> +   bs = (uint16_t*)&p[size++];
>> +   *bs = 
>> util_bswap16(context->desc.mjpeg.picture_parameter.picture_height);
>> +   size++;
>> +
>> +   bs = (uint16_t*)&p[size++];
>> +   *bs = 
>> util_bswap16(context->desc.mjpeg.picture_parameter.picture_width);
>> +   size++;
>> +
>> +   p[size++] = context->desc.mjpeg.picture_parameter.num_components;
>> +
>> +   for (i = 0; i < 
>> context->desc.mjpeg.picture_parameter.num_components; ++i) {
>> +      p[size++] = 
>> context->desc.mjpeg.picture_parameter.components[i].component_id;
>> +      p[size++] = 
>> context->desc.mjpeg.picture_parameter.components[i].h_sampling_factor 
>> << 4 |
>> + context->desc.mjpeg.picture_parameter.components[i].v_sampling_factor;
>> +      p[size++] = 
>> context->desc.mjpeg.picture_parameter.components[i].quantiser_table_selector;
>> +   }
>> +
>> +   bs = (uint16_t*)&p[len_pos];
>> +   *bs = util_bswap16(size - saved_size - 2);
>> +
>> +   saved_size = size;
>> +
>> +   /* SOS */
>> +   p[size++] = 0xff;
>> +   p[size++] = 0xda;
>> +
>> +   len_pos = size++;
>> +   size++;
>> +
>> +   p[size++] = context->desc.mjpeg.slice_parameter.num_components;
>> +
>> +   for (i = 0; i < 
>> context->desc.mjpeg.slice_parameter.num_components; ++i) {
>> +      p[size++] = 
>> context->desc.mjpeg.slice_parameter.components[i].component_selector;
>> +      p[size++] = 
>> context->desc.mjpeg.slice_parameter.components[i].dc_table_selector 
>> << 4 |
>> + context->desc.mjpeg.slice_parameter.components[i].ac_table_selector;
>> +   }
>> +
>> +   p[size++] = 0x00;
>> +   p[size++] = 0x3f;
>> +   p[size++] = 0x00;
>> +
>> +   bs = (uint16_t*)&p[len_pos];
>> +   *bs = util_bswap16(size - saved_size - 2);
>> +
>> +   context->mjpeg.slice_header_size = size;
>> +}
>> diff --git a/src/gallium/state_trackers/va/va_private.h 
>> b/src/gallium/state_trackers/va/va_private.h
>> index 4396abb..a40dd79 100644
>> --- a/src/gallium/state_trackers/va/va_private.h
>> +++ b/src/gallium/state_trackers/va/va_private.h
>> @@ -285,6 +285,8 @@ typedef struct {
>>        struct {
>>         unsigned sampling_factor;
>> +      uint8_t slice_header[1488];
> Can this number cover the largest case number for all being parsed 
> markers?
> It would be better if we can list the largest size for the marker in 
> Macro, and then add them together.
>
> Regards,
> Leo

Yes, Using Macro for the calculation is more clear. Please see the new 
Patch#7 just sent.

Regards,
Boyuan

>
>
>> +      unsigned int slice_header_size;
>>      } mjpeg;
>>        struct vl_deint_filter *deint;
>> @@ -421,6 +423,7 @@ void 
>> vlVaHandlePictureParameterBufferMPEG4(vlVaDriver *drv, vlVaContext 
>> *context
>>   void vlVaHandleIQMatrixBufferMPEG4(vlVaContext *context, vlVaBuffer 
>> *buf);
>>   void vlVaHandleSliceParameterBufferMPEG4(vlVaContext *context, 
>> vlVaBuffer *buf);
>>   void vlVaDecoderFixMPEG4Startcode(vlVaContext *context);
>> +void vlVaGetJpegSliceHeader(vlVaContext *context);
>>   void vlVaHandlePictureParameterBufferHEVC(vlVaDriver *drv, 
>> vlVaContext *context, vlVaBuffer *buf);
>>   void vlVaHandleIQMatrixBufferHEVC(vlVaContext *context, vlVaBuffer 
>> *buf);
>>   void vlVaHandleSliceParameterBufferHEVC(vlVaContext *context, 
>> vlVaBuffer *buf);
>