1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
|
diff --git a/omx/gstomxvideodec.c b/omx/gstomxvideodec.c
index c5b69ab..647ac88 100644
--- a/omx/gstomxvideodec.c
+++ b/omx/gstomxvideodec.c
@@ -581,7 +581,7 @@ gst_omx_buffer_pool_free_buffer (GstBufferPool * bpool, GstBuffer * buffer)
#ifdef HAVE_MMNGRBUF
static GstBuffer *
gst_omx_buffer_pool_request_videosink_buffer_creation (GstOMXBufferPool * pool,
- gint dmabuf_fd[GST_VIDEO_MAX_PLANES], gint stride[GST_VIDEO_MAX_PLANES])
+ gint dmabuf_fd[GST_VIDEO_MAX_PLANES], gpointer plane_buf[GST_VIDEO_MAX_PLANES], gint stride[GST_VIDEO_MAX_PLANES])
{
GstQuery *query;
GValue val = { 0, };
@@ -590,6 +590,7 @@ gst_omx_buffer_pool_request_videosink_buffer_creation (GstOMXBufferPool * pool,
GstBuffer *buffer;
GArray *dmabuf_array;
GArray *stride_array;
+ GArray *planebuf_array;
gint n_planes;
gint i;
@@ -598,11 +599,13 @@ gst_omx_buffer_pool_request_videosink_buffer_creation (GstOMXBufferPool * pool,
dmabuf_array = g_array_new (FALSE, FALSE, sizeof (gint));
stride_array = g_array_new (FALSE, FALSE, sizeof (gint));
+ planebuf_array = g_array_new (FALSE, FALSE, sizeof (gpointer));
n_planes = GST_VIDEO_INFO_N_PLANES (&pool->video_info);
for (i = 0; i < n_planes; i++) {
g_array_append_val (dmabuf_array, dmabuf_fd[i]);
g_array_append_val (stride_array, stride[i]);
+ g_array_append_val (planebuf_array, plane_buf[i]);
}
structure = gst_structure_new ("videosink_buffer_creation_request",
@@ -610,6 +613,7 @@ gst_omx_buffer_pool_request_videosink_buffer_creation (GstOMXBufferPool * pool,
"height", G_TYPE_INT, pool->port->port_def.format.video.nFrameHeight,
"stride", G_TYPE_ARRAY, stride_array,
"dmabuf", G_TYPE_ARRAY, dmabuf_array,
+ "planebuf", G_TYPE_ARRAY, planebuf_array,
"allocator", G_TYPE_POINTER, &val,
"format", G_TYPE_STRING,
gst_video_format_to_string (pool->video_info.finfo->format),
@@ -704,6 +708,7 @@ gst_omx_buffer_pool_acquire_buffer (GstBufferPool * bpool,
gint i;
gint dmabuf_fd[GST_VIDEO_MAX_PLANES];
gint plane_size[GST_VIDEO_MAX_PLANES];
+ gpointer plane_buf[GST_VIDEO_MAX_PLANES];
guint phys_addr;
OMXR_MC_VIDEO_DECODERESULTTYPE *decode_res =
(OMXR_MC_VIDEO_DECODERESULTTYPE *) omx_buf->
@@ -730,6 +735,7 @@ gst_omx_buffer_pool_acquire_buffer (GstBufferPool * bpool,
plane_size[0] = vmeta->stride[0] *
GST_VIDEO_INFO_COMP_HEIGHT (&pool->video_info, 0);
+ plane_buf[0] = omx_buf->omx_buf->pBuffer;
/* Export dmabuf file descriptors from second and subsequent planes */
n_planes = GST_VIDEO_INFO_N_PLANES (&pool->video_info);
@@ -737,6 +743,7 @@ gst_omx_buffer_pool_acquire_buffer (GstBufferPool * bpool,
phys_addr = (guint) decode_res->pvPhysImageAddressY + vmeta->offset[i];
plane_size[i] = vmeta->stride[i] *
GST_VIDEO_INFO_COMP_HEIGHT (&pool->video_info, i);
+ plane_buf[i] = omx_buf->omx_buf->pBuffer + vmeta->offset[i];
if (!gst_omx_buffer_pool_export_dmabuf (pool, phys_addr, plane_size[i],
page_size, &vdbuf_data->id_export[i], &dmabuf_fd[i])) {
@@ -747,7 +754,7 @@ gst_omx_buffer_pool_acquire_buffer (GstBufferPool * bpool,
if (pool->vsink_buf_req_supported)
new_buf = gst_omx_buffer_pool_request_videosink_buffer_creation (pool,
- dmabuf_fd, vmeta->stride);
+ dmabuf_fd, plane_buf, vmeta->stride);
else {
GstVideoMeta *new_meta;
@@ -1947,6 +1954,8 @@ gst_omx_video_dec_loop (GstOMXVideoDec * self)
goto caps_failed;
}
+ /* ...force clearing of reconfiguration flag to prevent subsequent buffers allocation */
+ gst_pad_check_reconfigure(GST_VIDEO_DECODER_SRC_PAD(self));
gst_video_codec_state_unref (state);
GST_VIDEO_DECODER_STREAM_UNLOCK (self);
|