You've already forked FFmpeg
							
							
				mirror of
				https://github.com/FFmpeg/FFmpeg.git
				synced 2025-10-30 23:18:11 +02:00 
			
		
		
		
	avcodec/magicyuvenc: add support for encoding raw slice
Switched to raw slice encoding only if huffman encoding size of slice is bigger than raw one.
This commit is contained in:
		| @@ -217,12 +217,12 @@ static av_cold int magy_encode_init(AVCodecContext *avctx) | ||||
|         s->decorrelate_buf[1] = s->decorrelate_buf[0] + (s->nb_slices * s->slice_height) * FFALIGN(avctx->width, av_cpu_max_align()); | ||||
|     } | ||||
|  | ||||
|     s->bitslice_size = avctx->width * (s->slice_height + 2) + AV_INPUT_BUFFER_PADDING_SIZE; | ||||
|     s->bitslice_size = avctx->width * s->slice_height + 2; | ||||
|     for (int n = 0; n < s->nb_slices; n++) { | ||||
|         for (int i = 0; i < s->planes; i++) { | ||||
|             Slice *sl = &s->slices[n * s->planes + i]; | ||||
|  | ||||
|             sl->bitslice = av_malloc(s->bitslice_size); | ||||
|             sl->bitslice = av_malloc(s->bitslice_size + AV_INPUT_BUFFER_PADDING_SIZE); | ||||
|             sl->slice = av_malloc(avctx->width * (s->slice_height + 2) + | ||||
|                                                      AV_INPUT_BUFFER_PADDING_SIZE); | ||||
|             if (!sl->slice || !sl->bitslice) { | ||||
| @@ -416,11 +416,28 @@ static int encode_table(AVCodecContext *avctx, | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
| static int encode_plane_slice_raw(const uint8_t *src, uint8_t *dst, unsigned dst_size, | ||||
|                                   int width, int height, int prediction) | ||||
| { | ||||
|     unsigned count = width * height; | ||||
|  | ||||
|     dst[0] = 1; | ||||
|     dst[1] = prediction; | ||||
|  | ||||
|     memcpy(dst + 2, src, count); | ||||
|     count += 2; | ||||
|     AV_WN32(dst + count, 0); | ||||
|     if (count & 3) | ||||
|         count += 4 - (count & 3); | ||||
|  | ||||
|     return count; | ||||
| } | ||||
|  | ||||
| static int encode_plane_slice(const uint8_t *src, uint8_t *dst, unsigned dst_size, | ||||
|                               int width, int height, HuffEntry *he, int prediction) | ||||
| { | ||||
|     const uint8_t *osrc = src; | ||||
|     PutBitContext pb; | ||||
|     int i, j; | ||||
|     int count; | ||||
|  | ||||
|     init_put_bits(&pb, dst, dst_size); | ||||
| @@ -428,10 +445,13 @@ static int encode_plane_slice(const uint8_t *src, uint8_t *dst, unsigned dst_siz | ||||
|     put_bits(&pb, 8, 0); | ||||
|     put_bits(&pb, 8, prediction); | ||||
|  | ||||
|     for (j = 0; j < height; j++) { | ||||
|         for (i = 0; i < width; i++) { | ||||
|     for (int j = 0; j < height; j++) { | ||||
|         for (int i = 0; i < width; i++) { | ||||
|             const int idx = src[i]; | ||||
|             put_bits(&pb, he[idx].len, he[idx].code); | ||||
|             const int len = he[idx].len; | ||||
|             if (put_bits_left(&pb) < len + 32) | ||||
|                 return encode_plane_slice_raw(osrc, dst, dst_size, width, height, prediction); | ||||
|             put_bits(&pb, len, he[idx].code); | ||||
|         } | ||||
|  | ||||
|         src += width; | ||||
|   | ||||
		Reference in New Issue
	
	Block a user