mirror of
				https://gitlab.freedesktop.org/pipewire/pipewire.git
				synced 2025-11-03 09:01:54 -05:00 
			
		
		
		
	v4l2: do TRY_FMT on the filter format
Do a TRY_FMT on the filter format before enumerating the sizes with it because some drivers don't check the format anymore. Fixes #294
This commit is contained in:
		
							parent
							
								
									2c8e2f3a36
								
							
						
					
					
						commit
						7a2741c9e1
					
				
					 1 changed files with 17 additions and 0 deletions
				
			
		| 
						 | 
					@ -566,6 +566,8 @@ spa_v4l2_enum_format(struct impl *this, int seq,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	while (port->next_fmtdesc) {
 | 
						while (port->next_fmtdesc) {
 | 
				
			||||||
		if (filter) {
 | 
							if (filter) {
 | 
				
			||||||
 | 
								struct v4l2_format fmt;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			video_format = enum_filter_format(filter_media_type,
 | 
								video_format = enum_filter_format(filter_media_type,
 | 
				
			||||||
					    filter_media_subtype,
 | 
										    filter_media_subtype,
 | 
				
			||||||
					    filter, port->fmtdesc.index);
 | 
										    filter, port->fmtdesc.index);
 | 
				
			||||||
| 
						 | 
					@ -580,6 +582,21 @@ spa_v4l2_enum_format(struct impl *this, int seq,
 | 
				
			||||||
				goto next_fmtdesc;
 | 
									goto next_fmtdesc;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			port->fmtdesc.pixelformat = info->fourcc;
 | 
								port->fmtdesc.pixelformat = info->fourcc;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								fmt.type = port->fmtdesc.type;
 | 
				
			||||||
 | 
								fmt.fmt.pix.pixelformat = info->fourcc;
 | 
				
			||||||
 | 
								fmt.fmt.pix.field = V4L2_FIELD_ANY;
 | 
				
			||||||
 | 
								fmt.fmt.pix.width = 0;
 | 
				
			||||||
 | 
								fmt.fmt.pix.height = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								if ((res = xioctl(dev->fd, VIDIOC_TRY_FMT, &fmt)) < 0) {
 | 
				
			||||||
 | 
									spa_log_error(this->log, "v4l2: '%s' VIDIOC_TRY_FMT: %m",
 | 
				
			||||||
 | 
											this->props.device);
 | 
				
			||||||
 | 
									goto next_fmtdesc;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								if (fmt.fmt.pix.pixelformat != info->fourcc)
 | 
				
			||||||
 | 
									goto next_fmtdesc;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		} else {
 | 
							} else {
 | 
				
			||||||
			if ((res = xioctl(dev->fd, VIDIOC_ENUM_FMT, &port->fmtdesc)) < 0) {
 | 
								if ((res = xioctl(dev->fd, VIDIOC_ENUM_FMT, &port->fmtdesc)) < 0) {
 | 
				
			||||||
				if (errno == EINVAL)
 | 
									if (errno == EINVAL)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue