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 /* The following is the private context of MJPEG/AMV decoder.
49 * Note that when using slice threading only the main thread's
50 * MpegEncContext is followed by a MjpegContext; the other threads
51 * can access this shared context via MpegEncContext.mjpeg. */
56
58 uint8_t *uni_ac_vlc_len)
59 {
60 for (
int i = 0;
i < 128;
i++) {
63 continue;
67
68 len = (
run >> 4) * huff_size_ac[0xf0];
69
72
73 len += huff_size_ac[
code] + nbits;
74
76 // We ignore EOB as its just a constant which does not change generally
77 }
78 }
79 }
80
82 {
84 &
s->intra_scantable, 0,
85 s->intra_matrix,
s->chroma_intra_matrix,
86 s->slice_context_count > 1);
87
89 for (
int i = 1;
i <
s->slice_context_count;
i++)
90 s->thread_context[
i]->esc_pos = 0;
91 }
92
94 {
97 /* s->huffman == HUFFMAN_TABLE_OPTIMAL can only be true for MJPEG. */
100 }
101
102 #if CONFIG_MJPEG_ENCODER
103 /**
104 * Encodes and outputs the entire frame in the JPEG format.
105 *
106 * @param s The MpegEncContext.
107 */
109 {
110 int nbits,
code, table_id;
120 size_t total_bits = 0;
121 size_t bytes_needed;
122
124 // Estimate the total size first
129
130 total_bits += huff_size[table_id][
code] + nbits;
131 }
132
133 bytes_needed = (total_bits + 7) / 8;
135
140
142 if (nbits != 0) {
144 }
145 }
146
149 }
150
151 /**
152 * Builds all 4 optimal Huffman tables.
153 *
154 * Uses the data stored in the JPEG buffer to compute the tables.
155 * Stores the Huffman tables in the bits_* and val_* arrays in the MJpegContext.
156 *
157 * @param m MJpegContext containing the JPEG buffer.
158 */
159 static void mjpeg_build_optimal_huffman(
MJpegContext *m)
160 {
166 &dc_chrominance_ctx,
167 &ac_luminance_ctx,
168 &ac_chrominance_ctx };
169 for (
int i = 0;
i < 4;
i++)
171
175
177 }
178
191
208 }
209 #endif
210
211 /**
212 * Writes the complete JPEG frame when optimal huffman tables are enabled,
213 * otherwise writes the stuffing.
214 *
215 * Header + values + stuffing.
216 *
217 * @param s The MpegEncContext.
218 * @return int Error code, 0 if successful.
219 */
221 {
224 int mb_y =
s->mb_y - !
s->mb_x;
226
227 #if CONFIG_MJPEG_ENCODER
229
230 mjpeg_build_optimal_huffman(m);
231
232 // Replace the VLCs with the optimal ones.
233 // The default ones may be used for trellis during quantization.
236 s->intra_ac_vlc_length =
238 s->intra_chroma_ac_vlc_length =
240
242 mjpeg_encode_picture_frame(
s);
243 }
244 #endif
245
251 }
252
254
255 if (
s->slice_context_count > 1 && mb_y < s->mb_height - 1)
258
260 for (
int i = 0;
i < 3;
i++)
261 s->last_dc[
i] = 128 <<
s->intra_dc_precision;
262
264 }
265
267 {
269 size_t num_mbs, num_blocks, num_codes;
270 int blocks_per_mb;
271
272 // We need to init this here as the mjpeg init is called before the common init,
273 s->mb_width = (
s->width + 15) / 16;
274 s->mb_height = (
s->height + 15) / 16;
275
276 switch (
s->chroma_format) {
281 };
282
283 // Make sure we have enough space to hold this frame.
284 num_mbs =
s->mb_width *
s->mb_height;
285 num_blocks = num_mbs * blocks_per_mb;
286 num_codes = num_blocks * 64;
287
291 return 0;
292 }
293
295 {
298
300 use_slices =
s->avctx->slices > 0 ?
s->avctx->slices > 1 :
302 s->avctx->thread_count > 1;
303
306
308 // Used to produce garbage with MJPEG.
310 "QP RD is no longer compatible with MJPEG or AMV\n");
312 }
313
314 /* The following check is automatically true for AMV,
315 * but it doesn't hurt either. */
319
320 if (
s->width > 65500 ||
s->height > 65500) {
323 }
324
327
328 // Build default Huffman tables.
329 // These may be overwritten later with more optimal Huffman tables, but
330 // they are needed at least right now for some processes like trellis.
347
350 s->intra_ac_vlc_length =
352 s->intra_chroma_ac_vlc_length =
354
355 // Buffers start out empty.
357
360
361 return 0;
362 }
363
365 {
369 return 0;
370 }
371
372 /**
373 * Add code and table_id to the JPEG buffer.
374 *
375 * @param s The MJpegContext which contains the JPEG buffer.
376 * @param table_id Which Huffman table the code belongs to.
377 * @param code The encoded exponent of the coefficients and the run-bits.
378 */
380 {
382 c->table_id = table_id;
384 }
385
386 /**
387 * Add the coefficient's data to the JPEG buffer.
388 *
389 * @param s The MJpegContext which contains the JPEG buffer.
390 * @param table_id Which Huffman table the code belongs to.
391 * @param val The coefficient.
392 * @param run The run-bits.
393 */
395 {
397
401 } else {
405 mant--;
406 }
407
409
410 s->huff_buffer[
s->huff_ncode].mant = mant;
412 }
413 }
414
415 /**
416 * Add the block's data into the JPEG buffer.
417 *
418 * @param s The MpegEncContext that contains the JPEG buffer.
419 * @param block The block.
420 * @param n The block's index or number.
421 */
423 {
425 int component,
dc, last_index,
val,
run;
427
428 /* DC coef */
429 component = (n <= 3 ? 0 : (n&1) + 1);
430 table_id = (n <= 3 ? 0 : 1);
431 dc =
block[0];
/* overflow is impossible */
432 val =
dc -
s->last_dc[component];
433
435
436 s->last_dc[component] =
dc;
437
438 /* AC coefs */
439
441 last_index =
s->block_last_index[n];
442 table_id |= 2;
443
444 for(
i=1;
i<=last_index;
i++) {
445 j =
s->intra_scantable.permutated[
i];
447
450 } else {
454 }
457 }
458 }
459
460 /* output EOB only if not already 64 values */
461 if (last_index < 63 ||
run != 0)
463 }
464
466 {
467 int mant, nbits,
code,
i, j;
468 int component,
dc,
run, last_index,
val;
470 uint8_t *huff_size_ac;
471 uint16_t *huff_code_ac;
472
473 /* DC coef */
474 component = (n <= 3 ? 0 : (n&1) + 1);
475 dc =
block[0];
/* overflow is impossible */
476 val =
dc -
s->last_dc[component];
477 if (n < 4) {
481 } else {
485 }
486 s->last_dc[component] =
dc;
487
488 /* AC coefs */
489
491 last_index =
s->block_last_index[n];
492 for(
i=1;
i<=last_index;
i++) {
493 j =
s->intra_scantable.permutated[
i];
497 } else {
499 put_bits(&
s->pb, huff_size_ac[0xf0], huff_code_ac[0xf0]);
501 }
505 mant--;
506 }
507
510
512
515 }
516 }
517
518 /* output EOB only if not already 64 values */
519 if (last_index < 63 ||
run != 0)
520 put_bits(&
s->pb, huff_size_ac[0], huff_code_ac[0]);
521 }
522
524 {
534
535 if (16*
s->mb_x+8 <
s->width) {
542 }
543 } else {
546 }
549 } else {
553 }
554 }
555 } else {
563
564 if (16*
s->mb_x+8 <
s->width) {
571 }
572 } else {
575 }
578 } else {
582 }
583 }
584
586 }
587 }
588
589 #if CONFIG_AMV_ENCODER
590 // maximum over s->mjpeg_vsample[i]
591 #define V_MAX 2
593 const AVFrame *pic_arg,
int *got_packet)
594 {
598 int chroma_h_shift, chroma_v_shift;
599
601
604 "Heights which are not a multiple of 16 might fail with some decoders, "
605 "use vstrict=-1 / -strict -1 to use %d anyway.\n", avctx->
height);
606 av_log(avctx,
AV_LOG_WARNING,
"If you have a device that plays AMV videos, please test if videos "
607 "with such heights work with it and report your findings to ffmpeg-devel@ffmpeg.org\n");
609 }
610
612 if (!pic)
614 //picture should be flipped upside-down
615 for(
i=0;
i < 3;
i++) {
616 int vsample =
i ? 2 >> chroma_v_shift : 2;
619 }
623 }
624 #endif
625
626 #define OFFSET(x) offsetof(MJPEGEncContext, mjpeg.x)
627 #define VE AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM
633 {
"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 },
635 };
636
637 #if CONFIG_MJPEG_ENCODER
638 static const AVClass mjpeg_class = {
643 };
644
660 },
661 .p.priv_class = &mjpeg_class,
663 };
664 #endif
665
666 #if CONFIG_AMV_ENCODER
667 static const AVClass amv_class = {
672 };
673
686 },
687 .p.priv_class = &amv_class,
688 };
689 #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]