mirror of
				https://gitlab.freedesktop.org/pipewire/pipewire.git
				synced 2025-11-03 09:01:54 -05:00 
			
		
		
		
	buffer: add ptr_type to the data
We can give more info about the memory or fd that way and we can also pass other structures as data later if we need to.
This commit is contained in:
		
							parent
							
								
									16d2a3a69c
								
							
						
					
					
						commit
						61caf0e19c
					
				
					 9 changed files with 44 additions and 31 deletions
				
			
		| 
						 | 
					@ -121,7 +121,7 @@ on_sink_event (SpaHandle *handle, SpaEvent *event, void *user_data)
 | 
				
			||||||
      g_debug ("pull ringbuffer %p", buf);
 | 
					      g_debug ("pull ringbuffer %p", buf);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      size = buf->size;
 | 
					      size = buf->size;
 | 
				
			||||||
      data = buf->datas[0].data;
 | 
					      data = buf->datas[0].ptr;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      pinos_ringbuffer_get_read_areas (priv->ringbuffer, areas);
 | 
					      pinos_ringbuffer_get_read_areas (priv->ringbuffer, areas);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -200,9 +200,9 @@ on_source_event (SpaHandle *handle, SpaEvent *event, void *user_data)
 | 
				
			||||||
      pinos_buffer_builder_add_header (&builder, &hdr);
 | 
					      pinos_buffer_builder_add_header (&builder, &hdr);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      if (b->datas[0].type == SPA_DATA_TYPE_FD) {
 | 
					      if (b->datas[0].type == SPA_DATA_TYPE_FD) {
 | 
				
			||||||
        fd = *((int *)b->datas[0].data);
 | 
					        fd = *((int *)b->datas[0].ptr);
 | 
				
			||||||
      } else {
 | 
					      } else {
 | 
				
			||||||
        fd = tmpfile_create (source, b->datas[0].data, b->size);
 | 
					        fd = tmpfile_create (source, b->datas[0].ptr, b->size);
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
      p.fd_index = pinos_buffer_builder_add_fd (&builder, fd);
 | 
					      p.fd_index = pinos_buffer_builder_add_fd (&builder, fd);
 | 
				
			||||||
      p.id = pinos_fd_manager_get_id (priv->fdmanager);
 | 
					      p.id = pinos_fd_manager_get_id (priv->fdmanager);
 | 
				
			||||||
| 
						 | 
					@ -267,7 +267,7 @@ create_pipeline (PinosSpaV4l2Source *this)
 | 
				
			||||||
    g_debug ("got get_props error %d", res);
 | 
					    g_debug ("got get_props error %d", res);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  value.type = SPA_PROP_TYPE_STRING;
 | 
					  value.type = SPA_PROP_TYPE_STRING;
 | 
				
			||||||
  value.value = "/dev/video1";
 | 
					  value.value = "/dev/video0";
 | 
				
			||||||
  value.size = strlen (value.value)+1;
 | 
					  value.size = strlen (value.value)+1;
 | 
				
			||||||
  props->set_prop (props, spa_props_index_for_name (props, "device"), &value);
 | 
					  props->set_prop (props, spa_props_index_for_name (props, "device"), &value);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -70,7 +70,7 @@ typedef struct {
 | 
				
			||||||
} SpaMetaHeader;
 | 
					} SpaMetaHeader;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef struct {
 | 
					typedef struct {
 | 
				
			||||||
  const char *type;
 | 
					  const char *ptr_type;
 | 
				
			||||||
  void       *ptr;
 | 
					  void       *ptr;
 | 
				
			||||||
} SpaMetaPointer;
 | 
					} SpaMetaPointer;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -101,27 +101,34 @@ typedef struct {
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * SpaDataType:
 | 
					 * SpaDataType:
 | 
				
			||||||
 * @SPA_DATA_TYPE_INVALID: invalid data type, is ignored
 | 
					 * @SPA_DATA_TYPE_INVALID: invalid data type, is ignored
 | 
				
			||||||
 * @SPA_DATA_TYPE_MEMPTR: data and size point to memory
 | 
					 * @SPA_DATA_TYPE_MEMPTR: data and size point to memory accassible by the
 | 
				
			||||||
 * @SPA_DATA_TYPE_FD: data points to an int file descriptor
 | 
					 *                        CPU.
 | 
				
			||||||
 | 
					 * @SPA_DATA_TYPE_FD: data points to an int file descriptor that can be
 | 
				
			||||||
 | 
					 *                    mmapped.
 | 
				
			||||||
 | 
					 * @SPA_DATA_TYPE_POINTER: data points to some other datastructure, the
 | 
				
			||||||
 | 
					 *        type can be found in ptr_type
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
typedef enum {
 | 
					typedef enum {
 | 
				
			||||||
  SPA_DATA_TYPE_INVALID               = 0,
 | 
					  SPA_DATA_TYPE_INVALID               = 0,
 | 
				
			||||||
  SPA_DATA_TYPE_MEMPTR,
 | 
					  SPA_DATA_TYPE_MEMPTR,
 | 
				
			||||||
  SPA_DATA_TYPE_FD,
 | 
					  SPA_DATA_TYPE_FD,
 | 
				
			||||||
 | 
					  SPA_DATA_TYPE_POINTER,
 | 
				
			||||||
} SpaDataType;
 | 
					} SpaDataType;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * SpaData:
 | 
					 * SpaData:
 | 
				
			||||||
 * @id: user id
 | 
					 * @id: user id
 | 
				
			||||||
 * @type: the type of data
 | 
					 * @type: the type of data
 | 
				
			||||||
 * @data: pointer to data or fd
 | 
					 * @ptr_type: more info abouut the type of @ptr
 | 
				
			||||||
 | 
					 * @ptr: pointer to data or fd
 | 
				
			||||||
 * @offset: offset of data
 | 
					 * @offset: offset of data
 | 
				
			||||||
 * @size: size of data
 | 
					 * @size: size of data
 | 
				
			||||||
 * @stride: stride of data
 | 
					 * @stride: stride of data if applicable
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
typedef struct {
 | 
					typedef struct {
 | 
				
			||||||
  SpaDataType  type;
 | 
					  SpaDataType  type;
 | 
				
			||||||
  void        *data;
 | 
					  const char  *ptr_type;
 | 
				
			||||||
 | 
					  void        *ptr;
 | 
				
			||||||
  unsigned int offset;
 | 
					  unsigned int offset;
 | 
				
			||||||
  size_t       size;
 | 
					  size_t       size;
 | 
				
			||||||
  size_t       stride;
 | 
					  size_t       stride;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -232,7 +232,8 @@ pull_input (SpaALSASink *this, void *data, snd_pcm_uframes_t frames)
 | 
				
			||||||
  buffer->meta[0].size = sizeof (buffer->header);
 | 
					  buffer->meta[0].size = sizeof (buffer->header);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  buffer->data[0].type = SPA_DATA_TYPE_MEMPTR;
 | 
					  buffer->data[0].type = SPA_DATA_TYPE_MEMPTR;
 | 
				
			||||||
  buffer->data[0].data = data;
 | 
					  buffer->data[0].ptr = data;
 | 
				
			||||||
 | 
					  buffer->data[0].ptr_type = "sysmem";
 | 
				
			||||||
  buffer->data[0].size = frames * sizeof (uint16_t) * 2;
 | 
					  buffer->data[0].size = frames * sizeof (uint16_t) * 2;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  this->event_cb (&this->handle, &event,this->user_data);
 | 
					  this->event_cb (&this->handle, &event,this->user_data);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -548,7 +548,8 @@ pull_port (SpaAudioMixer *this, uint32_t port_id, SpaOutputInfo *info, size_t pu
 | 
				
			||||||
  buffer->meta[0].size = sizeof (buffer->header);
 | 
					  buffer->meta[0].size = sizeof (buffer->header);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  buffer->data[0].type = SPA_DATA_TYPE_MEMPTR;
 | 
					  buffer->data[0].type = SPA_DATA_TYPE_MEMPTR;
 | 
				
			||||||
  buffer->data[0].data = buffer->samples;
 | 
					  buffer->data[0].ptr = buffer->samples;
 | 
				
			||||||
 | 
					  buffer->data[0].ptr_type = "sysmem";
 | 
				
			||||||
  buffer->data[0].size = pull_size;
 | 
					  buffer->data[0].size = pull_size;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  this->event_cb (&this->handle, &event, this->user_data);
 | 
					  this->event_cb (&this->handle, &event, this->user_data);
 | 
				
			||||||
| 
						 | 
					@ -565,11 +566,11 @@ add_port_data (SpaAudioMixer *this, SpaBuffer *out, SpaAudioMixerPort *port)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  while (true) {
 | 
					  while (true) {
 | 
				
			||||||
    if (op == NULL) {
 | 
					    if (op == NULL) {
 | 
				
			||||||
      op = out->datas[oi].data;
 | 
					      op = out->datas[oi].ptr;
 | 
				
			||||||
      os = out->datas[oi].size;
 | 
					      os = out->datas[oi].size;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    if (ip == NULL) {
 | 
					    if (ip == NULL) {
 | 
				
			||||||
      ip = port->buffer->datas[port->buffer_index].data;
 | 
					      ip = port->buffer->datas[port->buffer_index].ptr;
 | 
				
			||||||
      is = port->buffer->datas[port->buffer_index].size;
 | 
					      is = port->buffer->datas[port->buffer_index].size;
 | 
				
			||||||
      ip += port->buffer_offset;
 | 
					      ip += port->buffer_offset;
 | 
				
			||||||
      is -= port->buffer_offset;
 | 
					      is -= port->buffer_offset;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -467,7 +467,7 @@ spa_audiotestsrc_node_port_pull_output (SpaHandle     *handle,
 | 
				
			||||||
      continue;
 | 
					      continue;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ptr = info[i].buffer->datas[0].data;
 | 
					    ptr = info[i].buffer->datas[0].ptr;
 | 
				
			||||||
    size = info[i].buffer->datas[0].size;
 | 
					    size = info[i].buffer->datas[0].size;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    for (j = 0; j < size; j++)
 | 
					    for (j = 0; j < size; j++)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -459,7 +459,7 @@ spa_v4l2_import_buffers (SpaV4l2Source *this, SpaBuffer **buffers, uint32_t n_bu
 | 
				
			||||||
    b->v4l2_buffer.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
 | 
					    b->v4l2_buffer.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
 | 
				
			||||||
    b->v4l2_buffer.memory = state->memtype;
 | 
					    b->v4l2_buffer.memory = state->memtype;
 | 
				
			||||||
    b->v4l2_buffer.index = i;
 | 
					    b->v4l2_buffer.index = i;
 | 
				
			||||||
    b->v4l2_buffer.m.userptr = (unsigned long) b->buffer.datas[0].data;
 | 
					    b->v4l2_buffer.m.userptr = (unsigned long) b->buffer.datas[0].ptr;
 | 
				
			||||||
    b->v4l2_buffer.length = b->buffer.datas[0].size;
 | 
					    b->v4l2_buffer.length = b->buffer.datas[0].size;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    v4l2_buffer_free (b);
 | 
					    v4l2_buffer_free (b);
 | 
				
			||||||
| 
						 | 
					@ -542,13 +542,15 @@ mmap_init (SpaV4l2Source *this)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      b->dmafd = expbuf.fd;
 | 
					      b->dmafd = expbuf.fd;
 | 
				
			||||||
      b->datas[0].type = SPA_DATA_TYPE_FD;
 | 
					      b->datas[0].type = SPA_DATA_TYPE_FD;
 | 
				
			||||||
      b->datas[0].data = &b->dmafd;
 | 
					      b->datas[0].ptr = &b->dmafd;
 | 
				
			||||||
 | 
					      b->datas[0].ptr_type = "dmabuf";
 | 
				
			||||||
      b->datas[0].offset = 0;
 | 
					      b->datas[0].offset = 0;
 | 
				
			||||||
      b->datas[0].size = buf.length;
 | 
					      b->datas[0].size = buf.length;
 | 
				
			||||||
      b->datas[0].stride = state->fmt.fmt.pix.bytesperline;
 | 
					      b->datas[0].stride = state->fmt.fmt.pix.bytesperline;
 | 
				
			||||||
    } else {
 | 
					    } else {
 | 
				
			||||||
      b->datas[0].type = SPA_DATA_TYPE_MEMPTR;
 | 
					      b->datas[0].type = SPA_DATA_TYPE_MEMPTR;
 | 
				
			||||||
      b->datas[0].data = mmap (NULL,
 | 
					      b->datas[0].ptr_type = "sysmem";
 | 
				
			||||||
 | 
					      b->datas[0].ptr = mmap (NULL,
 | 
				
			||||||
                              buf.length,
 | 
					                              buf.length,
 | 
				
			||||||
                              PROT_READ | PROT_WRITE,
 | 
					                              PROT_READ | PROT_WRITE,
 | 
				
			||||||
                              MAP_SHARED,
 | 
					                              MAP_SHARED,
 | 
				
			||||||
| 
						 | 
					@ -557,7 +559,7 @@ mmap_init (SpaV4l2Source *this)
 | 
				
			||||||
      b->datas[0].offset = 0;
 | 
					      b->datas[0].offset = 0;
 | 
				
			||||||
      b->datas[0].size = buf.length;
 | 
					      b->datas[0].size = buf.length;
 | 
				
			||||||
      b->datas[0].stride = state->fmt.fmt.pix.bytesperline;
 | 
					      b->datas[0].stride = state->fmt.fmt.pix.bytesperline;
 | 
				
			||||||
      if (b->datas[0].data == MAP_FAILED) {
 | 
					      if (b->datas[0].ptr == MAP_FAILED) {
 | 
				
			||||||
        perror ("mmap");
 | 
					        perror ("mmap");
 | 
				
			||||||
        continue;
 | 
					        continue;
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
| 
						 | 
					@ -662,7 +664,7 @@ spa_v4l2_stop (SpaV4l2Source *this)
 | 
				
			||||||
    if (state->export_buf) {
 | 
					    if (state->export_buf) {
 | 
				
			||||||
      close (b->dmafd);
 | 
					      close (b->dmafd);
 | 
				
			||||||
    } else {
 | 
					    } else {
 | 
				
			||||||
      munmap (b->datas[0].data, b->datas[0].size);
 | 
					      munmap (b->datas[0].ptr, b->datas[0].size);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  state->have_buffers = false;
 | 
					  state->have_buffers = false;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -520,8 +520,8 @@ spa_volume_node_port_pull_output (SpaHandle      *handle,
 | 
				
			||||||
      di++;
 | 
					      di++;
 | 
				
			||||||
      continue;
 | 
					      continue;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    src = (uint16_t*) ((uint8_t*)sd->data + soff);
 | 
					    src = (uint16_t*) ((uint8_t*)sd->ptr + soff);
 | 
				
			||||||
    dst = (uint16_t*) ((uint8_t*)dd->data + doff);
 | 
					    dst = (uint16_t*) ((uint8_t*)dd->ptr + doff);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    n_bytes = MIN (sd->size - soff, dd->size - doff);
 | 
					    n_bytes = MIN (sd->size - soff, dd->size - doff);
 | 
				
			||||||
    n_samples = n_bytes / sizeof (uint16_t);
 | 
					    n_samples = n_bytes / sizeof (uint16_t);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -126,7 +126,7 @@ on_source_event (SpaHandle *handle, SpaEvent *event, void *user_data)
 | 
				
			||||||
      b = info[0].buffer;
 | 
					      b = info[0].buffer;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      if (b->metas[1].type == SPA_META_TYPE_POINTER &&
 | 
					      if (b->metas[1].type == SPA_META_TYPE_POINTER &&
 | 
				
			||||||
          strcmp (((SpaMetaPointer*)b->metas[1].data)->type, "SDL_Texture") == 0) {
 | 
					          strcmp (((SpaMetaPointer*)b->metas[1].data)->ptr_type, "SDL_Texture") == 0) {
 | 
				
			||||||
        SDL_Texture *texture;
 | 
					        SDL_Texture *texture;
 | 
				
			||||||
        texture = ((SpaMetaPointer*)b->metas[1].data)->ptr;
 | 
					        texture = ((SpaMetaPointer*)b->metas[1].data)->ptr;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -140,7 +140,8 @@ on_source_event (SpaHandle *handle, SpaEvent *event, void *user_data)
 | 
				
			||||||
          fprintf (stderr, "Couldn't lock texture: %s\n", SDL_GetError());
 | 
					          fprintf (stderr, "Couldn't lock texture: %s\n", SDL_GetError());
 | 
				
			||||||
          return;
 | 
					          return;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        b->datas[0].data = sdata;
 | 
					        b->datas[0].ptr = sdata;
 | 
				
			||||||
 | 
					        b->datas[0].ptr_type = "sysmem";
 | 
				
			||||||
        b->datas[0].size = sstride * 240;
 | 
					        b->datas[0].size = sstride * 240;
 | 
				
			||||||
        b->datas[0].stride = sstride;
 | 
					        b->datas[0].stride = sstride;
 | 
				
			||||||
      } else {
 | 
					      } else {
 | 
				
			||||||
| 
						 | 
					@ -148,7 +149,7 @@ on_source_event (SpaHandle *handle, SpaEvent *event, void *user_data)
 | 
				
			||||||
          fprintf (stderr, "Couldn't lock texture: %s\n", SDL_GetError());
 | 
					          fprintf (stderr, "Couldn't lock texture: %s\n", SDL_GetError());
 | 
				
			||||||
          return;
 | 
					          return;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        sdata = b->datas[0].data;
 | 
					        sdata = b->datas[0].ptr;
 | 
				
			||||||
        sstride = b->datas[0].stride;
 | 
					        sstride = b->datas[0].stride;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        for (i = 0; i < 240; i++) {
 | 
					        for (i = 0; i < 240; i++) {
 | 
				
			||||||
| 
						 | 
					@ -257,7 +258,8 @@ alloc_buffers (AppData *data)
 | 
				
			||||||
    b->metas[1].size = sizeof (b->ptr);
 | 
					    b->metas[1].size = sizeof (b->ptr);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    b->datas[0].type = SPA_DATA_TYPE_MEMPTR;
 | 
					    b->datas[0].type = SPA_DATA_TYPE_MEMPTR;
 | 
				
			||||||
    b->datas[0].data = mem;
 | 
					    b->datas[0].ptr = mem;
 | 
				
			||||||
 | 
					    b->datas[0].ptr_type = "sysmem";
 | 
				
			||||||
    b->datas[0].offset = 0;
 | 
					    b->datas[0].offset = 0;
 | 
				
			||||||
    b->datas[0].size = stride * 240;
 | 
					    b->datas[0].size = stride * 240;
 | 
				
			||||||
    b->datas[0].stride = stride;
 | 
					    b->datas[0].stride = stride;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue