You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							108 lines
						
					
					
						
							3.2 KiB
						
					
					
				
			
		
		
		
			
			
			
				
					
				
				
					
				
			
		
		
	
	
							108 lines
						
					
					
						
							3.2 KiB
						
					
					
				| --- a/libavcodec/dxva2.c | |
| +++ b/libavcodec/dxva2.c | |
| @@ -771,16 +771,18 @@ | |
|  #if CONFIG_D3D11VA | |
|      if (avctx->pix_fmt == AV_PIX_FMT_D3D11) | |
|          return (intptr_t)frame->data[1]; | |
| -    if (avctx->pix_fmt == AV_PIX_FMT_D3D11VA_VLD) { | |
| +    if (avctx->pix_fmt == AV_PIX_FMT_D3D11VA_VLD && surface) { | |
|          D3D11_VIDEO_DECODER_OUTPUT_VIEW_DESC viewDesc; | |
|          ID3D11VideoDecoderOutputView_GetDesc((ID3D11VideoDecoderOutputView*) surface, &viewDesc); | |
|          return viewDesc.Texture2D.ArraySlice; | |
|      } | |
|  #endif | |
|  #if CONFIG_DXVA2 | |
| -    for (i = 0; i < DXVA_CONTEXT_COUNT(avctx, ctx); i++) { | |
| -        if (avctx->pix_fmt == AV_PIX_FMT_DXVA2_VLD && ctx->dxva2.surface[i] == surface) | |
| -            return i; | |
| +    if (avctx->pix_fmt == AV_PIX_FMT_DXVA2_VLD) { | |
| +        for (i = 0; i < DXVA_CONTEXT_COUNT(avctx, ctx); i++) { | |
| +            if (ctx->dxva2.surface[i] == surface) | |
| +                return i; | |
| +        } | |
|      } | |
|  #endif | |
|   | |
| --- a/libavcodec/dxva2_h264.c | |
| +++ b/libavcodec/dxva2_h264.c | |
| @@ -504,6 +504,14 @@ | |
|   | |
|      if (ctx_pic->slice_count <= 0 || ctx_pic->bitstream_size <= 0) | |
|          return -1; | |
| + | |
| +    // Wait for an I-frame before start decoding. Workaround for ATI UVD and UVD+ GPUs | |
| +    if (!h->got_first_iframe) { | |
| +        if (!(ctx_pic->pp.wBitFields & (1 << 15))) | |
| +            return -1; | |
| +        h->got_first_iframe = 1; | |
| +    } | |
| + | |
|      ret = ff_dxva2_common_end_frame(avctx, h->cur_pic_ptr->f, | |
|                                      &ctx_pic->pp, sizeof(ctx_pic->pp), | |
|                                      &ctx_pic->qm, sizeof(ctx_pic->qm), | |
| --- a/libavcodec/h264_slice.c | |
| +++ b/libavcodec/h264_slice.c | |
| @@ -928,6 +928,7 @@ | |
|   | |
|      h->first_field           = 0; | |
|      h->prev_interlaced_frame = 1; | |
| +    h->got_first_iframe = 0; | |
|   | |
|      init_scan_tables(h); | |
|      ret = ff_h264_alloc_tables(h); | |
| --- a/libavcodec/h264dec.c | |
| +++ b/libavcodec/h264dec.c | |
| @@ -467,6 +467,7 @@ | |
|   | |
|      h->next_outputed_poc = INT_MIN; | |
|      h->prev_interlaced_frame = 1; | |
| +    h->got_first_iframe = 0; | |
|      idr(h); | |
|   | |
|      h->poc.prev_frame_num = -1; | |
| --- a/libavcodec/h264dec.h | |
| +++ b/libavcodec/h264dec.h | |
| @@ -539,6 +539,8 @@ | |
|       * slices) anymore */ | |
|      int setup_finished; | |
|   | |
| +    int got_first_iframe; | |
| + | |
|      int cur_chroma_format_idc; | |
|      int cur_bit_depth_luma; | |
|      int16_t slice_row[MAX_SLICES]; ///< to detect when MAX_SLICES is too low | |
| --- a/libavcodec/vaapi_h264.c | |
| +++ b/libavcodec/vaapi_h264.c | |
| @@ -314,6 +314,11 @@ | |
|      H264SliceContext *sl = &h->slice_ctx[0]; | |
|      int ret; | |
|   | |
| +    if (pic->nb_slices == 0) { | |
| +        ret = AVERROR_INVALIDDATA; | |
| +        goto finish; | |
| +    } | |
| + | |
|      ret = ff_vaapi_decode_issue(avctx, pic); | |
|      if (ret < 0) | |
|          goto finish; | |
| --- a/libavformat/bintext.c | |
| +++ b/libavformat/bintext.c | |
| @@ -149,7 +149,7 @@ | |
|              return AVPROBE_SCORE_EXTENSION + 1; | |
|   | |
|          predict_width(&par, p->buf_size, got_width); | |
| -        if (par.width < 8) | |
| +        if (par.width <= 0) | |
|              return 0; | |
|          calculate_height(&par, p->buf_size); | |
|          if (par.height <= 0) | |
| @@ -195,8 +195,6 @@ | |
|              next_tag_read(s, &bin->fsize); | |
|          if (!bin->width) { | |
|              predict_width(st->codecpar, bin->fsize, got_width); | |
| -            if (st->codecpar->width < 8) | |
| -                return AVERROR_INVALIDDATA; | |
|              calculate_height(st->codecpar, bin->fsize); | |
|          } | |
|          avio_seek(pb, 0, SEEK_SET); | |
| 
 | |
| 
 |