diff options
author | Gwenole Beauchesne <gwenole.beauchesne@intel.com> | 2012-02-24 15:56:17 +0100 |
---|---|---|
committer | Gwenole Beauchesne <gwenole.beauchesne@intel.com> | 2012-02-24 16:00:39 +0100 |
commit | 13351f02abb5223bac2e6ce65b82e0645f8e5227 (patch) | |
tree | f07f3eb3744ef3a0558355b678756ce2f34d58a2 | |
parent | 2630695e15ca57ec96bf39a125951a8509ce05bf (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.c | 40 |
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) { |