mirror of
				https://gitlab.freedesktop.org/pipewire/pipewire.git
				synced 2025-11-03 09:01:54 -05:00 
			
		
		
		
	gst: support VideoCrop meta
Convert the VideoCrop metadata to GStreamer metadata.
This commit is contained in:
		
							parent
							
								
									6fd373ac83
								
							
						
					
					
						commit
						5f40bc6d4e
					
				
					 4 changed files with 42 additions and 6 deletions
				
			
		| 
						 | 
					@ -33,6 +33,8 @@
 | 
				
			||||||
#include <gst/allocators/gstfdmemory.h>
 | 
					#include <gst/allocators/gstfdmemory.h>
 | 
				
			||||||
#include <gst/allocators/gstdmabuf.h>
 | 
					#include <gst/allocators/gstdmabuf.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <gst/video/gstvideometa.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "gstpipewirepool.h"
 | 
					#include "gstpipewirepool.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
GST_DEBUG_CATEGORY_STATIC (gst_pipewire_pool_debug_category);
 | 
					GST_DEBUG_CATEGORY_STATIC (gst_pipewire_pool_debug_category);
 | 
				
			||||||
| 
						 | 
					@ -115,6 +117,9 @@ void gst_pipewire_pool_wrap_buffer (GstPipeWirePool *pool, struct pw_buffer *b)
 | 
				
			||||||
  data->flags = GST_BUFFER_FLAGS (buf);
 | 
					  data->flags = GST_BUFFER_FLAGS (buf);
 | 
				
			||||||
  data->b = b;
 | 
					  data->b = b;
 | 
				
			||||||
  data->buf = buf;
 | 
					  data->buf = buf;
 | 
				
			||||||
 | 
					  data->crop = spa_buffer_find_meta_data (b->buffer, SPA_META_VideoCrop, sizeof(*data->crop));
 | 
				
			||||||
 | 
					  if (data->crop)
 | 
				
			||||||
 | 
						  gst_buffer_add_video_crop_meta(buf);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  gst_mini_object_set_qdata (GST_MINI_OBJECT_CAST (buf),
 | 
					  gst_mini_object_set_qdata (GST_MINI_OBJECT_CAST (buf),
 | 
				
			||||||
                             pool_data_quark,
 | 
					                             pool_data_quark,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -57,6 +57,7 @@ struct _GstPipeWirePoolData {
 | 
				
			||||||
  struct pw_buffer *b;
 | 
					  struct pw_buffer *b;
 | 
				
			||||||
  GstBuffer *buf;
 | 
					  GstBuffer *buf;
 | 
				
			||||||
  gboolean queued;
 | 
					  gboolean queued;
 | 
				
			||||||
 | 
					  struct spa_meta_region *crop;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct _GstPipeWirePool {
 | 
					struct _GstPipeWirePool {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -47,6 +47,8 @@
 | 
				
			||||||
#include <spa/pod/builder.h>
 | 
					#include <spa/pod/builder.h>
 | 
				
			||||||
#include <spa/utils/result.h>
 | 
					#include <spa/utils/result.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <gst/video/video.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "gstpipewireformat.h"
 | 
					#include "gstpipewireformat.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
GST_DEBUG_CATEGORY_STATIC (pipewire_sink_debug);
 | 
					GST_DEBUG_CATEGORY_STATIC (pipewire_sink_debug);
 | 
				
			||||||
| 
						 | 
					@ -225,7 +227,7 @@ pool_activated (GstPipeWirePool *pool, GstPipeWireSink *sink)
 | 
				
			||||||
  guint size;
 | 
					  guint size;
 | 
				
			||||||
  guint min_buffers;
 | 
					  guint min_buffers;
 | 
				
			||||||
  guint max_buffers;
 | 
					  guint max_buffers;
 | 
				
			||||||
  const struct spa_pod *port_params[2];
 | 
					  const struct spa_pod *port_params[3];
 | 
				
			||||||
  struct spa_pod_builder b = { NULL };
 | 
					  struct spa_pod_builder b = { NULL };
 | 
				
			||||||
  uint8_t buffer[1024];
 | 
					  uint8_t buffer[1024];
 | 
				
			||||||
  struct spa_pod_frame f;
 | 
					  struct spa_pod_frame f;
 | 
				
			||||||
| 
						 | 
					@ -246,8 +248,8 @@ pool_activated (GstPipeWirePool *pool, GstPipeWireSink *sink)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  spa_pod_builder_add (&b,
 | 
					  spa_pod_builder_add (&b,
 | 
				
			||||||
      SPA_PARAM_BUFFERS_stride,  SPA_POD_CHOICE_RANGE_Int(0, 0, INT32_MAX),
 | 
					      SPA_PARAM_BUFFERS_stride,  SPA_POD_CHOICE_RANGE_Int(0, 0, INT32_MAX),
 | 
				
			||||||
      SPA_PARAM_BUFFERS_buffers, SPA_POD_CHOICE_RANGE_Int(min_buffers, min_buffers,
 | 
					      SPA_PARAM_BUFFERS_buffers, SPA_POD_CHOICE_RANGE_Int(SPA_MAX(4u, min_buffers),
 | 
				
			||||||
                                               max_buffers ? max_buffers : INT32_MAX),
 | 
						      SPA_MAX(2u, min_buffers), max_buffers ? max_buffers : INT32_MAX),
 | 
				
			||||||
      SPA_PARAM_BUFFERS_align,   SPA_POD_Int(16),
 | 
					      SPA_PARAM_BUFFERS_align,   SPA_POD_Int(16),
 | 
				
			||||||
      0);
 | 
					      0);
 | 
				
			||||||
  port_params[0] = spa_pod_builder_pop (&b, &f);
 | 
					  port_params[0] = spa_pod_builder_pop (&b, &f);
 | 
				
			||||||
| 
						 | 
					@ -257,9 +259,13 @@ pool_activated (GstPipeWirePool *pool, GstPipeWireSink *sink)
 | 
				
			||||||
      SPA_PARAM_META_type, SPA_POD_Int(SPA_META_Header),
 | 
					      SPA_PARAM_META_type, SPA_POD_Int(SPA_META_Header),
 | 
				
			||||||
      SPA_PARAM_META_size, SPA_POD_Int(sizeof (struct spa_meta_header)));
 | 
					      SPA_PARAM_META_size, SPA_POD_Int(sizeof (struct spa_meta_header)));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  port_params[2] = spa_pod_builder_add_object (&b,
 | 
				
			||||||
 | 
					      SPA_TYPE_OBJECT_ParamMeta, SPA_PARAM_Meta,
 | 
				
			||||||
 | 
					      SPA_PARAM_META_type, SPA_POD_Int(SPA_META_VideoCrop),
 | 
				
			||||||
 | 
					      SPA_PARAM_META_size, SPA_POD_Int(sizeof (struct spa_meta_region)));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  pw_thread_loop_lock (sink->core->loop);
 | 
					  pw_thread_loop_lock (sink->core->loop);
 | 
				
			||||||
  pw_stream_update_params (sink->stream, port_params, 2);
 | 
					  pw_stream_update_params (sink->stream, port_params, 3);
 | 
				
			||||||
  pw_thread_loop_unlock (sink->core->loop);
 | 
					  pw_thread_loop_unlock (sink->core->loop);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -423,6 +429,15 @@ do_send_buffer (GstPipeWireSink *pwsink, GstBuffer *buffer)
 | 
				
			||||||
    data->header->pts = GST_BUFFER_PTS (buffer);
 | 
					    data->header->pts = GST_BUFFER_PTS (buffer);
 | 
				
			||||||
    data->header->dts_offset = GST_BUFFER_DTS (buffer);
 | 
					    data->header->dts_offset = GST_BUFFER_DTS (buffer);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					  if (data->crop) {
 | 
				
			||||||
 | 
					    GstVideoCropMeta *meta = gst_buffer_get_video_crop_meta (buffer);
 | 
				
			||||||
 | 
					    if (meta) {
 | 
				
			||||||
 | 
					      data->crop->region.position.x = meta->x;
 | 
				
			||||||
 | 
					      data->crop->region.position.y = meta->y;
 | 
				
			||||||
 | 
					      data->crop->region.size.width = meta->width;
 | 
				
			||||||
 | 
					      data->crop->region.size.height = meta->width;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
  for (i = 0; i < b->n_datas; i++) {
 | 
					  for (i = 0; i < b->n_datas; i++) {
 | 
				
			||||||
    struct spa_data *d = &b->datas[i];
 | 
					    struct spa_data *d = &b->datas[i];
 | 
				
			||||||
    GstMemory *mem = gst_buffer_peek_memory (buffer, i);
 | 
					    GstMemory *mem = gst_buffer_peek_memory (buffer, i);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -452,6 +452,7 @@ static GstBuffer *dequeue_buffer(GstPipeWireSrc *pwsrc)
 | 
				
			||||||
  GstBuffer *buf;
 | 
					  GstBuffer *buf;
 | 
				
			||||||
  GstPipeWirePoolData *data;
 | 
					  GstPipeWirePoolData *data;
 | 
				
			||||||
  struct spa_meta_header *h;
 | 
					  struct spa_meta_header *h;
 | 
				
			||||||
 | 
					  struct spa_meta_region *crop;
 | 
				
			||||||
  guint i;
 | 
					  guint i;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  b = pw_stream_dequeue_buffer (pwsrc->stream);
 | 
					  b = pw_stream_dequeue_buffer (pwsrc->stream);
 | 
				
			||||||
| 
						 | 
					@ -482,6 +483,16 @@ static GstBuffer *dequeue_buffer(GstPipeWireSrc *pwsrc)
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    GST_BUFFER_OFFSET (buf) = h->seq;
 | 
					    GST_BUFFER_OFFSET (buf) = h->seq;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					  crop = data->crop;
 | 
				
			||||||
 | 
					  if (crop) {
 | 
				
			||||||
 | 
					    GstVideoCropMeta *meta = gst_buffer_get_video_crop_meta(buf);
 | 
				
			||||||
 | 
					    if (meta) {
 | 
				
			||||||
 | 
					      meta->x = crop->region.position.x;
 | 
				
			||||||
 | 
					      meta->y = crop->region.position.y;
 | 
				
			||||||
 | 
					      meta->width = crop->region.size.width;
 | 
				
			||||||
 | 
					      meta->height = crop->region.size.height;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
  for (i = 0; i < b->buffer->n_datas; i++) {
 | 
					  for (i = 0; i < b->buffer->n_datas; i++) {
 | 
				
			||||||
    struct spa_data *d = &b->buffer->datas[i];
 | 
					    struct spa_data *d = &b->buffer->datas[i];
 | 
				
			||||||
    GstMemory *mem = gst_buffer_peek_memory (buf, i);
 | 
					    GstMemory *mem = gst_buffer_peek_memory (buf, i);
 | 
				
			||||||
| 
						 | 
					@ -753,7 +764,7 @@ on_param_changed (void *data, uint32_t id,
 | 
				
			||||||
  gst_caps_unref (caps);
 | 
					  gst_caps_unref (caps);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if (res) {
 | 
					  if (res) {
 | 
				
			||||||
    const struct spa_pod *params[2];
 | 
					    const struct spa_pod *params[3];
 | 
				
			||||||
    struct spa_pod_builder b = { NULL };
 | 
					    struct spa_pod_builder b = { NULL };
 | 
				
			||||||
    uint8_t buffer[512];
 | 
					    uint8_t buffer[512];
 | 
				
			||||||
    uint32_t buffers = CLAMP (16, pwsrc->min_buffers, pwsrc->max_buffers);
 | 
					    uint32_t buffers = CLAMP (16, pwsrc->min_buffers, pwsrc->max_buffers);
 | 
				
			||||||
| 
						 | 
					@ -773,9 +784,13 @@ on_param_changed (void *data, uint32_t id,
 | 
				
			||||||
        SPA_TYPE_OBJECT_ParamMeta, SPA_PARAM_Meta,
 | 
					        SPA_TYPE_OBJECT_ParamMeta, SPA_PARAM_Meta,
 | 
				
			||||||
        SPA_PARAM_META_type, SPA_POD_Id(SPA_META_Header),
 | 
					        SPA_PARAM_META_type, SPA_POD_Id(SPA_META_Header),
 | 
				
			||||||
        SPA_PARAM_META_size, SPA_POD_Int(sizeof (struct spa_meta_header)));
 | 
					        SPA_PARAM_META_size, SPA_POD_Int(sizeof (struct spa_meta_header)));
 | 
				
			||||||
 | 
					    params[2] = spa_pod_builder_add_object (&b,
 | 
				
			||||||
 | 
					        SPA_TYPE_OBJECT_ParamMeta, SPA_PARAM_Meta,
 | 
				
			||||||
 | 
					        SPA_PARAM_META_type, SPA_POD_Id(SPA_META_VideoCrop),
 | 
				
			||||||
 | 
					        SPA_PARAM_META_size, SPA_POD_Int(sizeof (struct spa_meta_region)));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    GST_DEBUG_OBJECT (pwsrc, "doing finish format");
 | 
					    GST_DEBUG_OBJECT (pwsrc, "doing finish format");
 | 
				
			||||||
    pw_stream_update_params (pwsrc->stream, params, 2);
 | 
					    pw_stream_update_params (pwsrc->stream, params, 3);
 | 
				
			||||||
  } else {
 | 
					  } else {
 | 
				
			||||||
    GST_WARNING_OBJECT (pwsrc, "finish format with error");
 | 
					    GST_WARNING_OBJECT (pwsrc, "finish format with error");
 | 
				
			||||||
    pw_stream_set_error (pwsrc->stream, -EINVAL, "unhandled format");
 | 
					    pw_stream_set_error (pwsrc->stream, -EINVAL, "unhandled format");
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue