Go to the documentation of this file. 1 /*
2 * MJPEG encoder
3 * Copyright (c) 2000, 2001 Fabrice Bellard
4 * Copyright (c) 2003 Alex Beregszaszi
5 * Copyright (c) 2003-2004 Michael Niedermayer
6 *
7 * Support for external huffman table, various fixes (AVID workaround),
8 * aspecting, new decode_frame mechanism and apple mjpeg-b support
9 * by Alex Beregszaszi
10 *
11 * This file is part of FFmpeg.
12 *
13 * FFmpeg is free software; you can redistribute it and/or
14 * modify it under the terms of the GNU Lesser General Public
15 * License as published by the Free Software Foundation; either
16 * version 2.1 of the License, or (at your option) any later version.
17 *
18 * FFmpeg is distributed in the hope that it will be useful,
19 * but WITHOUT ANY WARRANTY; without even the implied warranty of
20 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
21 * Lesser General Public License for more details.
22 *
23 * You should have received a copy of the GNU Lesser General Public
24 * License along with FFmpeg; if not, write to the Free Software
25 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
26 */
27
28 /**
29 * @file
30 * MJPEG encoder.
31 */
32
33 #include "config_components.h"
34
36
47
48 /**
49 * Buffer of JPEG frame data.
50 *
51 * Optimal Huffman table generation requires the frame data to be loaded into
52 * a buffer so that the tables can be computed.
53 * There are at most mb_width*mb_height*12*64 of these per frame.
54 */
56 // 0=DC lum, 1=DC chrom, 2=AC lum, 3=AC chrom
57 uint8_t
table_id;
///< The Huffman table id associated with the data.
58 uint8_t
code;
///< The exponent.
59 uint16_t
mant;
///< The mantissa.
61
62 /* The following is the private context of MJPEG/AMV decoder.
63 * Note that when using slice threading only the main thread's
64 * MPVEncContext is followed by a MjpegContext; the other threads
65 * can access this shared context via MPVEncContext.mjpeg. */
70
72 uint8_t *uni_ac_vlc_len)
73 {
74 for (
int i = 0;
i < 128;
i++) {
77 continue;
81
82 len = (
run >> 4) * huff_size_ac[0xf0];
83
86
87 len += huff_size_ac[
code] + nbits;
88
90 // We ignore EOB as its just a constant which does not change generally
91 }
92 }
93 }
94
96 {
98 s->c.intra_scantable.permutated, 0,
99 s->c.intra_matrix,
s->c.chroma_intra_matrix,
100 s->c.slice_context_count > 1);
101
103 for (
int i = 1;
i <
s->c.slice_context_count;
i++)
104 s->c.enc_contexts[
i]->esc_pos = 0;
105 }
106
108 {
112 /* s->huffman == HUFFMAN_TABLE_OPTIMAL can only be true for MJPEG. */
115
116 return 0;
117 }
118
119 #if CONFIG_MJPEG_ENCODER
120 /**
121 * Encodes and outputs the entire frame in the JPEG format.
122 *
123 * @param main The MPVMainEncContext.
124 */
126 {
128 int nbits,
code, table_id;
138 size_t total_bits = 0;
139 size_t bytes_needed;
140
142 // Estimate the total size first
147
148 total_bits += huff_size[table_id][
code] + nbits;
149 }
150
151 bytes_needed = (total_bits + 7) / 8;
153
158
160 if (nbits != 0) {
162 }
163 }
164
167 }
168
169 /**
170 * Builds all 4 optimal Huffman tables.
171 *
172 * Uses the data stored in the JPEG buffer to compute the tables.
173 * Stores the Huffman tables in the bits_* and val_* arrays in the MJpegContext.
174 *
175 * @param m MJpegContext containing the JPEG buffer.
176 */
177 static void mjpeg_build_optimal_huffman(
MJpegContext *m)
178 {
184 &dc_chrominance_ctx,
185 &ac_luminance_ctx,
186 &ac_chrominance_ctx };
187 for (
int i = 0;
i < 4;
i++)
189
193
195 }
196
209
226 }
227 #endif
228
229 /**
230 * Writes the complete JPEG frame when optimal huffman tables are enabled,
231 * otherwise writes the stuffing.
232 *
233 * Header + values + stuffing.
234 *
235 * @param s The MPVEncContext.
236 * @return int Error code, 0 if successful.
237 */
239 {
242 int mb_y =
s->c.mb_y - !
s->c.mb_x;
244
245 #if CONFIG_MJPEG_ENCODER
247 /* HUFFMAN_TABLE_OPTIMAL is incompatible with slice threading,
248 * therefore the following cast is allowed. */
250
251 mjpeg_build_optimal_huffman(m);
252
253 // Replace the VLCs with the optimal ones.
254 // The default ones may be used for trellis during quantization.
257 s->intra_ac_vlc_length =
259 s->intra_chroma_ac_vlc_length =
261
263 mjpeg_encode_picture_frame(
main);
264 }
265 #endif
266
272 }
273
275
276 if (
s->c.slice_context_count > 1 && mb_y < s->
c.mb_height - 1)
279
281 for (
int i = 0;
i < 3;
i++)
282 s->c.last_dc[
i] = 128 <<
s->c.intra_dc_precision;
283
285 }
286
288 {
291 static const char blocks_per_mb[] = {
293 };
294 size_t num_blocks;
295
296 // Make sure we have enough space to hold this frame.
297 num_blocks =
s->c.mb_num * blocks_per_mb[
s->c.chroma_format];
298
303 return 0;
304 }
305
307 {
311 return 0;
312 }
313
314 /**
315 * Add code and table_id to the JPEG buffer.
316 *
317 * @param s The MJpegContext which contains the JPEG buffer.
318 * @param table_id Which Huffman table the code belongs to.
319 * @param code The encoded exponent of the coefficients and the run-bits.
320 */
322 {
324 c->table_id = table_id;
326 }
327
328 /**
329 * Add the coefficient's data to the JPEG buffer.
330 *
331 * @param s The MJpegContext which contains the JPEG buffer.
332 * @param table_id Which Huffman table the code belongs to.
333 * @param val The coefficient.
334 * @param run The run-bits.
335 */
337 {
339
343 } else {
347 mant--;
348 }
349
351
352 s->huff_buffer[
s->huff_ncode].mant = mant;
354 }
355 }
356
357 /**
358 * Add the block's data into the JPEG buffer.
359 *
360 * @param s The MPVEncContext that contains the JPEG buffer.
361 * @param block The block.
362 * @param n The block's index or number.
363 */
365 {
367 int component,
dc, last_index,
val,
run;
369
370 /* DC coef */
371 component = (n <= 3 ? 0 : (n&1) + 1);
372 table_id = (n <= 3 ? 0 : 1);
373 dc =
block[0];
/* overflow is impossible */
374 val =
dc -
s->c.last_dc[component];
375
377
378 s->c.last_dc[component] =
dc;
379
380 /* AC coefs */
381
383 last_index =
s->c.block_last_index[n];
384 table_id |= 2;
385
386 for(
i=1;
i<=last_index;
i++) {
387 j =
s->c.intra_scantable.permutated[
i];
389
392 } else {
396 }
399 }
400 }
401
402 /* output EOB only if not already 64 values */
403 if (last_index < 63 ||
run != 0)
405 }
406
408 {
409 int mant, nbits,
code,
i, j;
410 int component,
dc,
run, last_index,
val;
412 const uint16_t *huff_code_ac;
413 const uint8_t *huff_size_ac;
414
415 /* DC coef */
416 component = (n <= 3 ? 0 : (n&1) + 1);
417 dc =
block[0];
/* overflow is impossible */
418 val =
dc -
s->c.last_dc[component];
419 if (n < 4) {
423 } else {
427 }
428 s->c.last_dc[component] =
dc;
429
430 /* AC coefs */
431
433 last_index =
s->c.block_last_index[n];
434 for(
i=1;
i<=last_index;
i++) {
435 j =
s->c.intra_scantable.permutated[
i];
439 } else {
441 put_bits(&
s->pb, huff_size_ac[0xf0], huff_code_ac[0xf0]);
443 }
447 mant--;
448 }
449
452
454
457 }
458 }
459
460 /* output EOB only if not already 64 values */
461 if (last_index < 63 ||
run != 0)
462 put_bits(&
s->pb, huff_size_ac[0], huff_code_ac[0]);
463 }
464
466 int unused_x, int unused_y)
467 {
475
476 if (16*
s->c.mb_x+8 <
s->c.width) {
483 }
484 } else {
485 for (
int i = 0;
i < 5;
i++)
489 } else {
493 }
494 }
495 }
496
498 int unused_x, int unused_y)
499 {
507
508 if (16 *
s->c.mb_x + 8 <
s->c.width) {
515 }
516 } else {
517 for (
int i = 0;
i < 5;
i++)
521 } else {
525 }
526 }
527
529 }
530
532 {
537
540 // May be overridden below
542
544 // Used to produce garbage with MJPEG.
546 "QP RD is no longer compatible with MJPEG or AMV\n");
548 }
549
550 /* The following check is automatically true for AMV,
551 * but it doesn't hurt either. */
555
556 if (avctx->
width > 65500 || avctx->
height > 65500) {
559 }
560
561 // Build default Huffman tables.
562 // These may be overwritten later with more optimal Huffman tables, but
563 // they are needed at least right now for some processes like trellis.
580
583
584 s->min_qcoeff = -1023;
585 s->max_qcoeff = 1023;
586
587 s->intra_ac_vlc_length =
589 s->intra_chroma_ac_vlc_length =
591
595
596 // Buffers start out empty.
598
599 if (
s->c.slice_context_count > 1)
601
603 // If we are here, we have only one slice_context. So no loop necessary.
606 }
607
608 return 0;
609 }
610
611 #if CONFIG_AMV_ENCODER
612 // maximum over s->mjpeg_vsample[i]
613 #define V_MAX 2
615 const AVFrame *pic_arg,
int *got_packet)
616 {
620 int chroma_v_shift = 1; /* AMV is 420-only */
621
624 "Heights which are not a multiple of 16 might fail with some decoders, "
625 "use vstrict=-1 / -strict -1 to use %d anyway.\n", avctx->
height);
626 av_log(avctx,
AV_LOG_WARNING,
"If you have a device that plays AMV videos, please test if videos "
627 "with such heights work with it and report your findings to ffmpeg-devel@ffmpeg.org\n");
629 }
630
632 if (!pic)
634 //picture should be flipped upside-down
635 for(
i=0;
i < 3;
i++) {
636 int vsample =
i ? 2 >> chroma_v_shift : 2;
637 pic->
data[
i] += pic->
linesize[
i] * (vsample *
s->c.height / V_MAX - 1);
639 }
643 }
644 #endif
645
646 #define OFFSET(x) offsetof(MJPEGEncContext, mjpeg.x)
647 #define VE AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM
649 #define AMV_OPTIONS_OFFSET 4
653 {
"force_duplicated_matrix",
"Always write luma and chroma matrix for mjpeg, useful for rtp streaming.",
OFFSET(force_duplicated_matrix),
AV_OPT_TYPE_BOOL, {.i64 = 0 }, 0, 1,
VE },
656 };
657
658 #if CONFIG_MJPEG_ENCODER
659 static const AVClass mjpeg_class = {
664 };
665
666 static int mjpeg_get_supported_config(
const AVCodecContext *avctx,
670 int *out_num)
671 {
675 };
680 return 0;
681 }
682
684 }
685
701 .p.priv_class = &mjpeg_class,
703 .get_supported_config = mjpeg_get_supported_config,
704 };
705 #endif
706
707 #if CONFIG_AMV_ENCODER
708 static const AVClass amv_class = {
713 };
714
728 .p.priv_class = &amv_class,
729 };
730 #endif
Tag MUST be and< 10hcoeff half pel interpolation filter coefficients, hcoeff[0] are the 2 middle coefficients[1] are the next outer ones and so on, resulting in a filter like:...eff[2], hcoeff[1], hcoeff[0], hcoeff[0], hcoeff[1], hcoeff[2] ... the sign of the coefficients is not explicitly stored but alternates after each coeff and coeff[0] is positive, so ...,+,-,+,-,+,+,-,+,-,+,... hcoeff[0] is not explicitly stored but found by subtracting the sum of all stored coefficients with signs from 32 hcoeff[0]=32 - hcoeff[1] - hcoeff[2] - ... a good choice for hcoeff and htaps is htaps=6 hcoeff={40,-10, 2} an alternative which requires more computations at both encoder and decoder side and may or may not be better is htaps=8 hcoeff={42,-14, 6,-2}ref_frames minimum of the number of available reference frames and max_ref_frames for example the first frame after a key frame always has ref_frames=1spatial_decomposition_type wavelet type 0 is a 9/7 symmetric compact integer wavelet 1 is a 5/3 symmetric compact integer wavelet others are reserved stored as delta from last, last is reset to 0 if always_reset||keyframeqlog quality(logarithmic quantizer scale) stored as delta from last, last is reset to 0 if always_reset||keyframemv_scale stored as delta from last, last is reset to 0 if always_reset||keyframe FIXME check that everything works fine if this changes between framesqbias dequantization bias stored as delta from last, last is reset to 0 if always_reset||keyframeblock_max_depth maximum depth of the block tree stored as delta from last, last is reset to 0 if always_reset||keyframequant_table quantization tableHighlevel bitstream structure:==============================--------------------------------------------|Header|--------------------------------------------|------------------------------------|||Block0||||split?||||yes no||||......... intra?||||:Block01 :yes no||||:Block02 :....... ..........||||:Block03 ::y DC ::ref index:||||:Block04 ::cb DC ::motion x :||||......... :cr DC ::motion y :||||....... ..........|||------------------------------------||------------------------------------|||Block1|||...|--------------------------------------------|------------ ------------ ------------|||Y subbands||Cb subbands||Cr subbands||||--- ---||--- ---||--- ---|||||LL0||HL0||||LL0||HL0||||LL0||HL0|||||--- ---||--- ---||--- ---||||--- ---||--- ---||--- ---|||||LH0||HH0||||LH0||HH0||||LH0||HH0|||||--- ---||--- ---||--- ---||||--- ---||--- ---||--- ---|||||HL1||LH1||||HL1||LH1||||HL1||LH1|||||--- ---||--- ---||--- ---||||--- ---||--- ---||--- ---|||||HH1||HL2||||HH1||HL2||||HH1||HL2|||||...||...||...|||------------ ------------ ------------|--------------------------------------------Decoding process:=================------------|||Subbands|------------||||------------|Intra DC||||LL0 subband prediction ------------|\ Dequantization ------------------- \||Reference frames|\ IDWT|------- -------|Motion \|||Frame 0||Frame 1||Compensation . OBMC v -------|------- -------|--------------. \------> Frame n output Frame Frame<----------------------------------/|...|------------------- Range Coder:============Binary Range Coder:------------------- The implemented range coder is an adapted version based upon "Range encoding: an algorithm for removing redundancy from a digitised message." by G. N. N. Martin. The symbols encoded by the Snow range coder are bits(0|1). The associated probabilities are not fix but change depending on the symbol mix seen so far. bit seen|new state ---------+----------------------------------------------- 0|256 - state_transition_table[256 - old_state];1|state_transition_table[old_state];state_transition_table={ 0, 0, 0, 0, 0, 0, 0, 0, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 190, 191, 192, 194, 194, 195, 196, 197, 198, 199, 200, 201, 202, 202, 204, 205, 206, 207, 208, 209, 209, 210, 211, 212, 213, 215, 215, 216, 217, 218, 219, 220, 220, 222, 223, 224, 225, 226, 227, 227, 229, 229, 230, 231, 232, 234, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 248, 0, 0, 0, 0, 0, 0, 0};FIXME Range Coding of integers:------------------------- FIXME Neighboring Blocks:===================left and top are set to the respective blocks unless they are outside of the image in which case they are set to the Null block top-left is set to the top left block unless it is outside of the image in which case it is set to the left block if this block has no larger parent block or it is at the left side of its parent block and the top right block is not outside of the image then the top right block is used for top-right else the top-left block is used Null block y, cb, cr are 128 level, ref, mx and my are 0 Motion Vector Prediction:=========================1. the motion vectors of all the neighboring blocks are scaled to compensate for the difference of reference frames scaled_mv=(mv *(256 *(current_reference+1)/(mv.reference+1))+128)> the median of the scaled top and top right vectors is used as motion vector prediction the used motion vector is the sum of the predictor and(mvx_diff, mvy_diff) *mv_scale Intra DC Prediction block[y][x] dc[1]