GstAllocator *allocator;
GstAllocationParams params;
gboolean update_allocator;
+ GstBuffer *test_buffer;
+ GstVideoFrame vframe;
+ gint chroma_stride;
+ gboolean chroma_stride_acceptable;
+ gboolean pool_was_active;
/* Set allocation parameters to guarantee 16-byte aligned output buffers */
if (gst_query_get_n_allocation_params (query) > 0) {
gst_query_set_nth_allocation_pool (query, 0, pool, size, min, max);
+ /* Confirm that stride is acceptable to libmpeg2 */
+ chroma_stride_acceptable = FALSE;
+ pool_was_active = gst_buffer_pool_is_active (pool);
+
+ if (!gst_buffer_pool_set_active (pool, TRUE))
+ goto pool_not_activated;
+
+ if (gst_buffer_pool_acquire_buffer (pool, &test_buffer, NULL) != GST_FLOW_OK)
+ goto buffer_not_acquired;
+
+ if (!gst_video_frame_map (&vframe, &dec->decoded_info, test_buffer,
+ GST_MAP_READ | GST_MAP_WRITE))
+ goto buffer_not_mapped;
+
+ if (GST_VIDEO_FRAME_N_PLANES (&vframe) != 3)
+ goto too_few_planes;
+
+ chroma_stride = GST_VIDEO_FRAME_PLANE_STRIDE (&vframe, 0) >> 1;
+ chroma_stride_acceptable =
+ GST_VIDEO_FRAME_PLANE_STRIDE (&vframe, 1) == chroma_stride &&
+ GST_VIDEO_FRAME_PLANE_STRIDE (&vframe, 2) == chroma_stride;
+
+too_few_planes:
+ gst_video_frame_unmap (&vframe);
+
+buffer_not_mapped:
+ g_object_unref (test_buffer);
+
+buffer_not_acquired:
+ gst_buffer_pool_set_active (pool, pool_was_active);
+
+pool_not_activated:
+ if (!chroma_stride_acceptable)
+ gst_query_set_nth_allocation_pool (query, 0, NULL, size, min, max);
+
gst_object_unref (pool);
gst_video_codec_state_unref (state);
* ones we did */
mpeg2_set_buf (mpeg2dec->decoder, buf,
GINT_TO_POINTER (frame->system_frame_number + 1));
+ mpeg2_stride (mpeg2dec->decoder, GST_VIDEO_FRAME_PLANE_STRIDE (&vframe, 0));
gst_mpeg2dec_save_buffer (mpeg2dec, frame->system_frame_number, &vframe);
beach: