You've already forked FFmpeg
							
							
				mirror of
				https://github.com/FFmpeg/FFmpeg.git
				synced 2025-10-30 23:18:11 +02:00 
			
		
		
		
	h264: move resync_mb_{x,y} into the per-slice context
This commit is contained in:
		| @@ -358,6 +358,8 @@ typedef struct H264SliceContext { | |||||||
|  |  | ||||||
|     int mb_x, mb_y; |     int mb_x, mb_y; | ||||||
|     int mb_xy; |     int mb_xy; | ||||||
|  |     int resync_mb_x; | ||||||
|  |     int resync_mb_y; | ||||||
|     int mb_skip_run; |     int mb_skip_run; | ||||||
|     int is_complex; |     int is_complex; | ||||||
|  |  | ||||||
| @@ -528,8 +530,6 @@ typedef struct H264Context { | |||||||
|     int x264_build; |     int x264_build; | ||||||
|  |  | ||||||
|     int mb_y; |     int mb_y; | ||||||
|     int resync_mb_x; |  | ||||||
|     int resync_mb_y; |  | ||||||
|     int mb_height, mb_width; |     int mb_height, mb_width; | ||||||
|     int mb_stride; |     int mb_stride; | ||||||
|     int mb_num; |     int mb_num; | ||||||
|   | |||||||
| @@ -1557,11 +1557,11 @@ int ff_h264_decode_slice_header(H264Context *h, H264SliceContext *sl, H264Contex | |||||||
|         av_log(h->avctx, AV_LOG_ERROR, "first_mb_in_slice overflow\n"); |         av_log(h->avctx, AV_LOG_ERROR, "first_mb_in_slice overflow\n"); | ||||||
|         return AVERROR_INVALIDDATA; |         return AVERROR_INVALIDDATA; | ||||||
|     } |     } | ||||||
|     h->resync_mb_x = sl->mb_x =  first_mb_in_slice % h->mb_width; |     sl->resync_mb_x = sl->mb_x =  first_mb_in_slice % h->mb_width; | ||||||
|     h->resync_mb_y = sl->mb_y = (first_mb_in_slice / h->mb_width) << |     sl->resync_mb_y = sl->mb_y = (first_mb_in_slice / h->mb_width) << | ||||||
|                                FIELD_OR_MBAFF_PICTURE(h); |                                  FIELD_OR_MBAFF_PICTURE(h); | ||||||
|     if (h->picture_structure == PICT_BOTTOM_FIELD) |     if (h->picture_structure == PICT_BOTTOM_FIELD) | ||||||
|         h->resync_mb_y = sl->mb_y = sl->mb_y + 1; |         sl->resync_mb_y = sl->mb_y = sl->mb_y + 1; | ||||||
|     assert(sl->mb_y < h->mb_height); |     assert(sl->mb_y < h->mb_height); | ||||||
|  |  | ||||||
|     if (h->picture_structure == PICT_FRAME) { |     if (h->picture_structure == PICT_FRAME) { | ||||||
| @@ -2224,7 +2224,7 @@ static int decode_slice(struct AVCodecContext *avctx, void *arg) | |||||||
|  |  | ||||||
|             if ((h->workaround_bugs & FF_BUG_TRUNCATED) && |             if ((h->workaround_bugs & FF_BUG_TRUNCATED) && | ||||||
|                 sl->cabac.bytestream > sl->cabac.bytestream_end + 2) { |                 sl->cabac.bytestream > sl->cabac.bytestream_end + 2) { | ||||||
|                 er_add_slice(h, sl, h->resync_mb_x, h->resync_mb_y, sl->mb_x - 1, |                 er_add_slice(h, sl, sl->resync_mb_x, sl->resync_mb_y, sl->mb_x - 1, | ||||||
|                              sl->mb_y, ER_MB_END); |                              sl->mb_y, ER_MB_END); | ||||||
|                 if (sl->mb_x >= lf_x_start) |                 if (sl->mb_x >= lf_x_start) | ||||||
|                     loop_filter(h, sl, lf_x_start, sl->mb_x + 1); |                     loop_filter(h, sl, lf_x_start, sl->mb_x + 1); | ||||||
| @@ -2235,7 +2235,7 @@ static int decode_slice(struct AVCodecContext *avctx, void *arg) | |||||||
|                        "error while decoding MB %d %d, bytestream %td\n", |                        "error while decoding MB %d %d, bytestream %td\n", | ||||||
|                        sl->mb_x, sl->mb_y, |                        sl->mb_x, sl->mb_y, | ||||||
|                        sl->cabac.bytestream_end - sl->cabac.bytestream); |                        sl->cabac.bytestream_end - sl->cabac.bytestream); | ||||||
|                 er_add_slice(h, sl, h->resync_mb_x, h->resync_mb_y, sl->mb_x, |                 er_add_slice(h, sl, sl->resync_mb_x, sl->resync_mb_y, sl->mb_x, | ||||||
|                              sl->mb_y, ER_MB_ERROR); |                              sl->mb_y, ER_MB_ERROR); | ||||||
|                 return AVERROR_INVALIDDATA; |                 return AVERROR_INVALIDDATA; | ||||||
|             } |             } | ||||||
| @@ -2255,7 +2255,7 @@ static int decode_slice(struct AVCodecContext *avctx, void *arg) | |||||||
|             if (eos || sl->mb_y >= h->mb_height) { |             if (eos || sl->mb_y >= h->mb_height) { | ||||||
|                 tprintf(h->avctx, "slice end %d %d\n", |                 tprintf(h->avctx, "slice end %d %d\n", | ||||||
|                         get_bits_count(&h->gb), h->gb.size_in_bits); |                         get_bits_count(&h->gb), h->gb.size_in_bits); | ||||||
|                 er_add_slice(h, sl, h->resync_mb_x, h->resync_mb_y, sl->mb_x - 1, |                 er_add_slice(h, sl, sl->resync_mb_x, sl->resync_mb_y, sl->mb_x - 1, | ||||||
|                              sl->mb_y, ER_MB_END); |                              sl->mb_y, ER_MB_END); | ||||||
|                 if (sl->mb_x > lf_x_start) |                 if (sl->mb_x > lf_x_start) | ||||||
|                     loop_filter(h, sl, lf_x_start, sl->mb_x); |                     loop_filter(h, sl, lf_x_start, sl->mb_x); | ||||||
| @@ -2282,7 +2282,7 @@ static int decode_slice(struct AVCodecContext *avctx, void *arg) | |||||||
|             if (ret < 0) { |             if (ret < 0) { | ||||||
|                 av_log(h->avctx, AV_LOG_ERROR, |                 av_log(h->avctx, AV_LOG_ERROR, | ||||||
|                        "error while decoding MB %d %d\n", sl->mb_x, sl->mb_y); |                        "error while decoding MB %d %d\n", sl->mb_x, sl->mb_y); | ||||||
|                 er_add_slice(h, sl, h->resync_mb_x, h->resync_mb_y, sl->mb_x, |                 er_add_slice(h, sl, sl->resync_mb_x, sl->resync_mb_y, sl->mb_x, | ||||||
|                              sl->mb_y, ER_MB_ERROR); |                              sl->mb_y, ER_MB_ERROR); | ||||||
|                 return ret; |                 return ret; | ||||||
|             } |             } | ||||||
| @@ -2302,12 +2302,12 @@ static int decode_slice(struct AVCodecContext *avctx, void *arg) | |||||||
|                             get_bits_count(&h->gb), h->gb.size_in_bits); |                             get_bits_count(&h->gb), h->gb.size_in_bits); | ||||||
|  |  | ||||||
|                     if (get_bits_left(&h->gb) == 0) { |                     if (get_bits_left(&h->gb) == 0) { | ||||||
|                         er_add_slice(h, sl, h->resync_mb_x, h->resync_mb_y, |                         er_add_slice(h, sl, sl->resync_mb_x, sl->resync_mb_y, | ||||||
|                                      sl->mb_x - 1, sl->mb_y, ER_MB_END); |                                      sl->mb_x - 1, sl->mb_y, ER_MB_END); | ||||||
|  |  | ||||||
|                         return 0; |                         return 0; | ||||||
|                     } else { |                     } else { | ||||||
|                         er_add_slice(h, sl, h->resync_mb_x, h->resync_mb_y, |                         er_add_slice(h, sl, sl->resync_mb_x, sl->resync_mb_y, | ||||||
|                                      sl->mb_x - 1, sl->mb_y, ER_MB_END); |                                      sl->mb_x - 1, sl->mb_y, ER_MB_END); | ||||||
|  |  | ||||||
|                         return AVERROR_INVALIDDATA; |                         return AVERROR_INVALIDDATA; | ||||||
| @@ -2320,14 +2320,14 @@ static int decode_slice(struct AVCodecContext *avctx, void *arg) | |||||||
|                         get_bits_count(&h->gb), h->gb.size_in_bits); |                         get_bits_count(&h->gb), h->gb.size_in_bits); | ||||||
|  |  | ||||||
|                 if (get_bits_left(&h->gb) == 0) { |                 if (get_bits_left(&h->gb) == 0) { | ||||||
|                     er_add_slice(h, sl, h->resync_mb_x, h->resync_mb_y, |                     er_add_slice(h, sl, sl->resync_mb_x, sl->resync_mb_y, | ||||||
|                                  sl->mb_x - 1, sl->mb_y, ER_MB_END); |                                  sl->mb_x - 1, sl->mb_y, ER_MB_END); | ||||||
|                     if (sl->mb_x > lf_x_start) |                     if (sl->mb_x > lf_x_start) | ||||||
|                         loop_filter(h, sl, lf_x_start, sl->mb_x); |                         loop_filter(h, sl, lf_x_start, sl->mb_x); | ||||||
|  |  | ||||||
|                     return 0; |                     return 0; | ||||||
|                 } else { |                 } else { | ||||||
|                     er_add_slice(h, sl, h->resync_mb_x, h->resync_mb_y, sl->mb_x, |                     er_add_slice(h, sl, sl->resync_mb_x, sl->resync_mb_y, sl->mb_x, | ||||||
|                                  sl->mb_y, ER_MB_ERROR); |                                  sl->mb_y, ER_MB_ERROR); | ||||||
|  |  | ||||||
|                     return AVERROR_INVALIDDATA; |                     return AVERROR_INVALIDDATA; | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user