mirror of
				https://gitlab.freedesktop.org/pipewire/pipewire.git
				synced 2025-11-03 09:01:54 -05:00 
			
		
		
		
	module-looback: improve data copy between streams
First go over all the input and collect pointers and the size that we need to copy. Then go over all destinations and copy the source or clear the buffer memory. This fixes the problem where extra planes in the destination would get a 0 size, which would make the converter produce 0 output. It also ensure that the output size is consistent.
This commit is contained in:
		
							parent
							
								
									4062077472
								
							
						
					
					
						commit
						7a76e55c36
					
				
					 1 changed files with 24 additions and 22 deletions
				
			
		| 
						 | 
					@ -189,33 +189,35 @@ static void capture_process(void *d)
 | 
				
			||||||
		pw_log_debug("out of playback buffers: %m");
 | 
							pw_log_debug("out of playback buffers: %m");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (in != NULL && out != NULL) {
 | 
						if (in != NULL && out != NULL) {
 | 
				
			||||||
 | 
							uint32_t outsize = UINT32_MAX;
 | 
				
			||||||
		for (i = 0; i < out->buffer->n_datas; i++) {
 | 
					 | 
				
			||||||
			struct spa_data *ds, *dd;
 | 
					 | 
				
			||||||
			uint32_t outsize = 0;
 | 
					 | 
				
			||||||
		int32_t stride = 0;
 | 
							int32_t stride = 0;
 | 
				
			||||||
 | 
							struct spa_data *d;
 | 
				
			||||||
 | 
							const void *src[in->buffer->n_datas];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			dd = &out->buffer->datas[i];
 | 
							for (i = 0; i < in->buffer->n_datas; i++) {
 | 
				
			||||||
 | 
					 | 
				
			||||||
			if (i < in->buffer->n_datas) {
 | 
					 | 
				
			||||||
			uint32_t offs, size;
 | 
								uint32_t offs, size;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				ds = &in->buffer->datas[i];
 | 
								d = &in->buffer->datas[i];
 | 
				
			||||||
 | 
								offs = SPA_MIN(d->chunk->offset, d->maxsize);
 | 
				
			||||||
 | 
								size = SPA_MIN(d->chunk->size, d->maxsize - offs);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				offs = SPA_MIN(ds->chunk->offset, ds->maxsize);
 | 
								src[i] = SPA_PTROFF(d->data, offs, void);
 | 
				
			||||||
				size = SPA_MIN(ds->chunk->size, ds->maxsize - offs);
 | 
								outsize = SPA_MIN(outsize, size);
 | 
				
			||||||
				stride = SPA_MAX(stride, stride);
 | 
								stride = SPA_MAX(stride, d->chunk->stride);
 | 
				
			||||||
 | 
					 | 
				
			||||||
				memcpy(dd->data,
 | 
					 | 
				
			||||||
					SPA_PTROFF(ds->data, offs, void), size);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
				outsize = SPA_MAX(outsize, size);
 | 
					 | 
				
			||||||
			} else {
 | 
					 | 
				
			||||||
				memset(dd->data, 0, outsize);
 | 
					 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
			dd->chunk->offset = 0;
 | 
							for (i = 0; i < out->buffer->n_datas; i++) {
 | 
				
			||||||
			dd->chunk->size = outsize;
 | 
								d = &out->buffer->datas[i];
 | 
				
			||||||
			dd->chunk->stride = stride;
 | 
					
 | 
				
			||||||
 | 
								outsize = SPA_MIN(outsize, d->maxsize);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								if (i < in->buffer->n_datas)
 | 
				
			||||||
 | 
									memcpy(d->data, src[i], outsize);
 | 
				
			||||||
 | 
								else
 | 
				
			||||||
 | 
									memset(d->data, 0, outsize);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								d->chunk->offset = 0;
 | 
				
			||||||
 | 
								d->chunk->size = outsize;
 | 
				
			||||||
 | 
								d->chunk->stride = stride;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue