summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGwenole Beauchesne <gwenole.beauchesne@intel.com>2012-02-24 15:56:17 +0100
committerGwenole Beauchesne <gwenole.beauchesne@intel.com>2012-02-24 16:00:39 +0100
commit13351f02abb5223bac2e6ce65b82e0645f8e5227 (patch)
treef07f3eb3744ef3a0558355b678756ce2f34d58a2
parent2630695e15ca57ec96bf39a125951a8509ce05bf (diff)
Append MPEG-2 start codes, if necessary.
GStreamer/VA may submit slice data buffers without the start code prefixes. However, VDPAU require them, so we reconstruct the 4 missing bytes. i.e. 0x00 0x00 0x01 <slice_no + 1> Signed-off-by: Gwenole Beauchesne <gwenole.beauchesne@intel.com>
-rw-r--r--src/vdpau_decode.c40
1 files changed, 40 insertions, 0 deletions
diff --git a/src/vdpau_decode.c b/src/vdpau_decode.c
index dee3993..b9f1419 100644
--- a/src/vdpau_decode.c
+++ b/src/vdpau_decode.c
@@ -418,6 +418,42 @@ translate_nothing(
return 1;
}
+static int
+translate_VASliceDataBuffer_MPEG2(
+ vdpau_driver_data_t *driver_data,
+ object_context_p obj_context,
+ object_buffer_p obj_buffer
+)
+{
+ static const uint8_t start_code_prefix[3] = { 0x00, 0x00, 0x01 };
+ VASliceParameterBufferMPEG2 * const slice_params = obj_context->last_slice_params;
+ uint8_t *slice_header;
+ unsigned int i;
+
+ /* Check we have the start code */
+ for (i = 0; i < obj_context->last_slice_params_count; i++) {
+ VASliceParameterBufferMPEG2 * const slice_param = &slice_params[i];
+ uint8_t * const buf = (uint8_t *)obj_buffer->buffer_data + slice_param->slice_data_offset;
+ if (memcmp(buf, start_code_prefix, sizeof(start_code_prefix)) != 0) {
+ if (append_VdpBitstreamBuffer(obj_context,
+ start_code_prefix,
+ sizeof(start_code_prefix)) < 0)
+ return 0;
+ slice_header = alloc_gen_slice_data(obj_context, 1);
+ if (!slice_header)
+ return 0;
+ slice_header[0] = slice_param->slice_vertical_position + 1;
+ if (append_VdpBitstreamBuffer(obj_context, slice_header, 1) < 0)
+ return 0;
+ }
+ if (append_VdpBitstreamBuffer(obj_context,
+ buf,
+ slice_param->slice_data_size) < 0)
+ return 0;
+ }
+ return 1;
+}
+
// Translate VASliceDataBuffer
static int
translate_VASliceDataBuffer(
@@ -450,6 +486,10 @@ translate_VASliceDataBuffer(
return 1;
}
+ if (obj_context->vdp_codec == VDP_CODEC_MPEG2)
+ return translate_VASliceDataBuffer_MPEG2(driver_data,
+ obj_context, obj_buffer);
+
#if USE_VDPAU_MPEG4
if (obj_context->vdp_codec == VDP_CODEC_MPEG4 &&
obj_context->vdp_bitstream_buffers_count == 0) {