You've already forked FFmpeg
							
							
				mirror of
				https://github.com/FFmpeg/FFmpeg.git
				synced 2025-10-30 23:18:11 +02:00 
			
		
		
		
	lavc/vvc: Fix emulation prevention byte handling
nal->skipped_bytes_pos contains the positions of errors relative to the start of the slice header, whereas the position they were tested against is relative to the start of the slice data, i.e. one byte after the end of the slice header. Patch fixes this by storing the size of the slice header in H266RawSlice and adding it to the position given by the GetBitContext before comparing to skipped_bytes_pos. This fixes AVERROR_INVALIDDATAs for various valid bitstreams, such as the LMCS_B_Dolby_2 conformance bitstream. Signed-off-by: Frank Plowman <post@frankplowman.com>
This commit is contained in:
		
				
					committed by
					
						 James Almer
						James Almer
					
				
			
			
				
	
			
			
			
						parent
						
							bab7f91c36
						
					
				
				
					commit
					0c517fcbe8
				
			| @@ -1155,6 +1155,7 @@ static int cbs_h266_read_nal_unit(CodedBitstreamContext *ctx, | ||||
|                     return err; | ||||
|             } | ||||
|  | ||||
|             slice->header_size = pos / 8; | ||||
|             slice->data_size = len - pos / 8; | ||||
|             slice->data_ref  = av_buffer_ref(unit->data_ref); | ||||
|             if (!slice->data_ref) | ||||
|   | ||||
| @@ -843,6 +843,7 @@ typedef struct H266RawSlice { | ||||
|  | ||||
|     uint8_t     *data; | ||||
|     AVBufferRef *data_ref; | ||||
|     size_t       header_size; | ||||
|     size_t       data_size; | ||||
|     int          data_bit_start; | ||||
| } H266RawSlice; | ||||
|   | ||||
| @@ -451,8 +451,9 @@ static int slices_realloc(VVCFrameContext *fc) | ||||
| } | ||||
|  | ||||
| static void ep_init_cabac_decoder(SliceContext *sc, const int index, | ||||
|     const H2645NAL *nal, GetBitContext *gb) | ||||
|     const H2645NAL *nal, GetBitContext *gb, const CodedBitstreamUnit *unit) | ||||
| { | ||||
|     const H266RawSlice *slice     = unit->content_ref; | ||||
|     const H266RawSliceHeader *rsh = sc->sh.r; | ||||
|     EntryPoint *ep                = sc->eps + index; | ||||
|     int size; | ||||
| @@ -461,10 +462,10 @@ static void ep_init_cabac_decoder(SliceContext *sc, const int index, | ||||
|         int skipped = 0; | ||||
|         int64_t start =  (gb->index >> 3); | ||||
|         int64_t end = start + rsh->sh_entry_point_offset_minus1[index] + 1; | ||||
|         while (skipped < nal->skipped_bytes && nal->skipped_bytes_pos[skipped] <= start) { | ||||
|         while (skipped < nal->skipped_bytes && nal->skipped_bytes_pos[skipped] <= start + slice->header_size) { | ||||
|             skipped++; | ||||
|         } | ||||
|         while (skipped < nal->skipped_bytes && nal->skipped_bytes_pos[skipped] < end) { | ||||
|         while (skipped < nal->skipped_bytes && nal->skipped_bytes_pos[skipped] <= end + slice->header_size) { | ||||
|             end--; | ||||
|             skipped++; | ||||
|         } | ||||
| @@ -506,7 +507,7 @@ static int slice_init_entry_points(SliceContext *sc, | ||||
|             fc->tab.slice_idx[rs] = sc->slice_idx; | ||||
|         } | ||||
|  | ||||
|         ep_init_cabac_decoder(sc, i, nal, &gb); | ||||
|         ep_init_cabac_decoder(sc, i, nal, &gb, unit); | ||||
|  | ||||
|         if (i + 1 < sc->nb_eps) | ||||
|             ctu_addr = sh->entry_point_start_ctu[i]; | ||||
|   | ||||
		Reference in New Issue
	
	Block a user