| Line | Branch | Exec | Source |
|---|---|---|---|
| 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 | |||
| 35 | #include "libavutil/mem.h" | ||
| 36 | |||
| 37 | #include "avcodec.h" | ||
| 38 | #include "codec_internal.h" | ||
| 39 | #include "jpegtables.h" | ||
| 40 | #include "mjpegenc_common.h" | ||
| 41 | #include "mjpegenc_huffman.h" | ||
| 42 | #include "mpegvideo.h" | ||
| 43 | #include "mjpeg.h" | ||
| 44 | #include "mjpegenc.h" | ||
| 45 | #include "mpegvideoenc.h" | ||
| 46 | #include "profiles.h" | ||
| 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 | */ | ||
| 55 | typedef struct MJpegHuffmanCode { | ||
| 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. | ||
| 60 | } MJpegHuffmanCode; | ||
| 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. */ | ||
| 66 | typedef struct MJPEGEncContext { | ||
| 67 | MPVMainEncContext mpeg; | ||
| 68 | MJpegContext mjpeg; | ||
| 69 | } MJPEGEncContext; | ||
| 70 | |||
| 71 | 1740 | static av_cold void init_uni_ac_vlc(const uint8_t huff_size_ac[256], | |
| 72 | uint8_t *uni_ac_vlc_len) | ||
| 73 | { | ||
| 74 |
2/2✓ Branch 0 taken 222720 times.
✓ Branch 1 taken 1740 times.
|
224460 | for (int i = 0; i < 128; i++) { |
| 75 | 222720 | int level = i - 64; | |
| 76 |
2/2✓ Branch 0 taken 1740 times.
✓ Branch 1 taken 220980 times.
|
222720 | if (!level) |
| 77 | 1740 | continue; | |
| 78 |
2/2✓ Branch 0 taken 14142720 times.
✓ Branch 1 taken 220980 times.
|
14363700 | for (int run = 0; run < 64; run++) { |
| 79 | int len, code, nbits; | ||
| 80 | 14142720 | int alevel = FFABS(level); | |
| 81 | |||
| 82 | 14142720 | len = (run >> 4) * huff_size_ac[0xf0]; | |
| 83 | |||
| 84 | 14142720 | nbits= av_log2_16bit(alevel) + 1; | |
| 85 | 14142720 | code = ((15&run) << 4) | nbits; | |
| 86 | |||
| 87 | 14142720 | len += huff_size_ac[code] + nbits; | |
| 88 | |||
| 89 | 14142720 | uni_ac_vlc_len[UNI_AC_ENC_INDEX(run, i)] = len; | |
| 90 | // We ignore EOB as its just a constant which does not change generally | ||
| 91 | } | ||
| 92 | } | ||
| 93 | 1740 | } | |
| 94 | |||
| 95 | 1439 | static void mjpeg_encode_picture_header(MPVEncContext *const s) | |
| 96 | { | ||
| 97 | 1439 | ff_mjpeg_encode_picture_header(s->c.avctx, &s->pb, s->c.cur_pic.ptr->f, s->mjpeg_ctx, | |
| 98 | 1439 | s->c.intra_scantable.permutated, 0, | |
| 99 | 1439 | s->c.intra_matrix, s->c.chroma_intra_matrix, | |
| 100 | 1439 | s->c.slice_context_count > 1); | |
| 101 | |||
| 102 | 1439 | s->esc_pos = put_bytes_count(&s->pb, 0); | |
| 103 |
2/2✓ Branch 0 taken 700 times.
✓ Branch 1 taken 1439 times.
|
2139 | for (int i = 1; i < s->c.slice_context_count; i++) |
| 104 | 700 | s->c.enc_contexts[i]->esc_pos = 0; | |
| 105 | 1439 | } | |
| 106 | |||
| 107 | 1439 | static int mjpeg_amv_encode_picture_header(MPVMainEncContext *const m) | |
| 108 | { | ||
| 109 | 1439 | MJPEGEncContext *const m2 = (MJPEGEncContext*)m; | |
| 110 | 1439 | MPVEncContext *const s = &m->s; | |
| 111 | av_assert2(s->mjpeg_ctx == &m2->mjpeg); | ||
| 112 | /* s->huffman == HUFFMAN_TABLE_OPTIMAL can only be true for MJPEG. */ | ||
| 113 |
2/2✓ Branch 0 taken 600 times.
✓ Branch 1 taken 839 times.
|
1439 | if (!CONFIG_MJPEG_ENCODER || m2->mjpeg.huffman != HUFFMAN_TABLE_OPTIMAL) |
| 114 | 600 | mjpeg_encode_picture_header(s); | |
| 115 | |||
| 116 | 1439 | 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 | */ | ||
| 125 | 839 | static void mjpeg_encode_picture_frame(MPVMainEncContext *const main) | |
| 126 | { | ||
| 127 | 839 | MPVEncContext *const s = &main->s; | |
| 128 | int nbits, code, table_id; | ||
| 129 | 839 | MJpegContext *m = s->mjpeg_ctx; | |
| 130 | 839 | uint8_t *huff_size[4] = { m->huff_size_dc_luminance, | |
| 131 | 839 | m->huff_size_dc_chrominance, | |
| 132 | 839 | m->huff_size_ac_luminance, | |
| 133 | 839 | m->huff_size_ac_chrominance }; | |
| 134 | 839 | uint16_t *huff_code[4] = { m->huff_code_dc_luminance, | |
| 135 | 839 | m->huff_code_dc_chrominance, | |
| 136 | 839 | m->huff_code_ac_luminance, | |
| 137 | 839 | m->huff_code_ac_chrominance }; | |
| 138 | 839 | size_t total_bits = 0; | |
| 139 | size_t bytes_needed; | ||
| 140 | |||
| 141 | 839 | main->header_bits = get_bits_diff(s); | |
| 142 | // Estimate the total size first | ||
| 143 |
2/2✓ Branch 0 taken 20394735 times.
✓ Branch 1 taken 839 times.
|
20395574 | for (int i = 0; i < m->huff_ncode; i++) { |
| 144 | 20394735 | table_id = m->huff_buffer[i].table_id; | |
| 145 | 20394735 | code = m->huff_buffer[i].code; | |
| 146 | 20394735 | nbits = code & 0xf; | |
| 147 | |||
| 148 | 20394735 | total_bits += huff_size[table_id][code] + nbits; | |
| 149 | } | ||
| 150 | |||
| 151 | 839 | bytes_needed = (total_bits + 7) / 8; | |
| 152 | 839 | ff_mpv_reallocate_putbitbuffer(s, bytes_needed, bytes_needed); | |
| 153 | |||
| 154 |
2/2✓ Branch 0 taken 20394735 times.
✓ Branch 1 taken 839 times.
|
20395574 | for (int i = 0; i < m->huff_ncode; i++) { |
| 155 | 20394735 | table_id = m->huff_buffer[i].table_id; | |
| 156 | 20394735 | code = m->huff_buffer[i].code; | |
| 157 | 20394735 | nbits = code & 0xf; | |
| 158 | |||
| 159 | 20394735 | put_bits(&s->pb, huff_size[table_id][code], huff_code[table_id][code]); | |
| 160 |
2/2✓ Branch 0 taken 18318883 times.
✓ Branch 1 taken 2075852 times.
|
20394735 | if (nbits != 0) { |
| 161 | 18318883 | put_sbits(&s->pb, nbits, m->huff_buffer[i].mant); | |
| 162 | } | ||
| 163 | } | ||
| 164 | |||
| 165 | 839 | m->huff_ncode = 0; | |
| 166 | 839 | s->i_tex_bits = get_bits_diff(s); | |
| 167 | 839 | } | |
| 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 | 839 | static void mjpeg_build_optimal_huffman(MJpegContext *m) | |
| 178 | { | ||
| 179 | MJpegEncHuffmanContext dc_luminance_ctx; | ||
| 180 | MJpegEncHuffmanContext dc_chrominance_ctx; | ||
| 181 | MJpegEncHuffmanContext ac_luminance_ctx; | ||
| 182 | MJpegEncHuffmanContext ac_chrominance_ctx; | ||
| 183 | 839 | MJpegEncHuffmanContext *ctx[4] = { &dc_luminance_ctx, | |
| 184 | &dc_chrominance_ctx, | ||
| 185 | &ac_luminance_ctx, | ||
| 186 | &ac_chrominance_ctx }; | ||
| 187 |
2/2✓ Branch 0 taken 3356 times.
✓ Branch 1 taken 839 times.
|
4195 | for (int i = 0; i < 4; i++) |
| 188 | 3356 | ff_mjpeg_encode_huffman_init(ctx[i]); | |
| 189 | |||
| 190 |
2/2✓ Branch 0 taken 20394735 times.
✓ Branch 1 taken 839 times.
|
20395574 | for (int i = 0; i < m->huff_ncode; i++) { |
| 191 | 20394735 | int table_id = m->huff_buffer[i].table_id; | |
| 192 | 20394735 | int code = m->huff_buffer[i].code; | |
| 193 | |||
| 194 | 20394735 | ff_mjpeg_encode_huffman_increment(ctx[table_id], code); | |
| 195 | } | ||
| 196 | |||
| 197 | 839 | ff_mjpeg_encode_huffman_close(&dc_luminance_ctx, | |
| 198 | 839 | m->bits_dc_luminance, | |
| 199 | 839 | m->val_dc_luminance, 12); | |
| 200 | 839 | ff_mjpeg_encode_huffman_close(&dc_chrominance_ctx, | |
| 201 | 839 | m->bits_dc_chrominance, | |
| 202 | 839 | m->val_dc_chrominance, 12); | |
| 203 | 839 | ff_mjpeg_encode_huffman_close(&ac_luminance_ctx, | |
| 204 | 839 | m->bits_ac_luminance, | |
| 205 | 839 | m->val_ac_luminance, 256); | |
| 206 | 839 | ff_mjpeg_encode_huffman_close(&ac_chrominance_ctx, | |
| 207 | 839 | m->bits_ac_chrominance, | |
| 208 | 839 | m->val_ac_chrominance, 256); | |
| 209 | |||
| 210 | 839 | ff_mjpeg_build_huffman_codes(m->huff_size_dc_luminance, | |
| 211 | 839 | m->huff_code_dc_luminance, | |
| 212 | 839 | m->bits_dc_luminance, | |
| 213 | 839 | m->val_dc_luminance); | |
| 214 | 839 | ff_mjpeg_build_huffman_codes(m->huff_size_dc_chrominance, | |
| 215 | 839 | m->huff_code_dc_chrominance, | |
| 216 | 839 | m->bits_dc_chrominance, | |
| 217 | 839 | m->val_dc_chrominance); | |
| 218 | 839 | ff_mjpeg_build_huffman_codes(m->huff_size_ac_luminance, | |
| 219 | 839 | m->huff_code_ac_luminance, | |
| 220 | 839 | m->bits_ac_luminance, | |
| 221 | 839 | m->val_ac_luminance); | |
| 222 | 839 | ff_mjpeg_build_huffman_codes(m->huff_size_ac_chrominance, | |
| 223 | 839 | m->huff_code_ac_chrominance, | |
| 224 | 839 | m->bits_ac_chrominance, | |
| 225 | 839 | m->val_ac_chrominance); | |
| 226 | 839 | } | |
| 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 | */ | ||
| 238 | 4089 | int ff_mjpeg_encode_stuffing(MPVEncContext *const s) | |
| 239 | { | ||
| 240 | 4089 | MJpegContext *const m = s->mjpeg_ctx; | |
| 241 | 4089 | PutBitContext *pbc = &s->pb; | |
| 242 | 4089 | int mb_y = s->c.mb_y - !s->c.mb_x; | |
| 243 | int ret; | ||
| 244 | |||
| 245 | #if CONFIG_MJPEG_ENCODER | ||
| 246 |
2/2✓ Branch 0 taken 839 times.
✓ Branch 1 taken 3250 times.
|
4089 | if (m->huffman == HUFFMAN_TABLE_OPTIMAL) { |
| 247 | /* HUFFMAN_TABLE_OPTIMAL is incompatible with slice threading, | ||
| 248 | * therefore the following cast is allowed. */ | ||
| 249 | 839 | MPVMainEncContext *const main = (MPVMainEncContext*)s; | |
| 250 | |||
| 251 | 839 | 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. | ||
| 255 | 839 | init_uni_ac_vlc(m->huff_size_ac_luminance, m->uni_ac_vlc_len); | |
| 256 | 839 | init_uni_ac_vlc(m->huff_size_ac_chrominance, m->uni_chroma_ac_vlc_len); | |
| 257 | 839 | s->intra_ac_vlc_length = | |
| 258 | 839 | s->intra_ac_vlc_last_length = m->uni_ac_vlc_len; | |
| 259 | 839 | s->intra_chroma_ac_vlc_length = | |
| 260 | 839 | s->intra_chroma_ac_vlc_last_length = m->uni_chroma_ac_vlc_len; | |
| 261 | |||
| 262 | 839 | mjpeg_encode_picture_header(s); | |
| 263 | 839 | mjpeg_encode_picture_frame(main); | |
| 264 | } | ||
| 265 | #endif | ||
| 266 | |||
| 267 | 4089 | ret = ff_mpv_reallocate_putbitbuffer(s, put_bits_count(&s->pb) / 8 + 100, | |
| 268 | 4089 | put_bits_count(&s->pb) / 4 + 1000); | |
| 269 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 4089 times.
|
4089 | if (ret < 0) { |
| 270 | ✗ | av_log(s->c.avctx, AV_LOG_ERROR, "Buffer reallocation failed\n"); | |
| 271 | ✗ | goto fail; | |
| 272 | } | ||
| 273 | |||
| 274 | 4089 | ff_mjpeg_escape_FF(pbc, s->esc_pos); | |
| 275 | |||
| 276 |
4/4✓ Branch 0 taken 2850 times.
✓ Branch 1 taken 1239 times.
✓ Branch 2 taken 2650 times.
✓ Branch 3 taken 200 times.
|
4089 | if (s->c.slice_context_count > 1 && mb_y < s->c.mb_height - 1) |
| 277 | 2650 | put_marker(pbc, RST0 + (mb_y&7)); | |
| 278 | 4089 | s->esc_pos = put_bytes_count(pbc, 0); | |
| 279 | |||
| 280 | 4089 | fail: | |
| 281 |
2/2✓ Branch 0 taken 12267 times.
✓ Branch 1 taken 4089 times.
|
16356 | for (int i = 0; i < 3; i++) |
| 282 | 12267 | s->c.last_dc[i] = 128 << s->c.intra_dc_precision; | |
| 283 | |||
| 284 | 4089 | return ret; | |
| 285 | } | ||
| 286 | |||
| 287 | 19 | static int alloc_huffman(MJPEGEncContext *const m2) | |
| 288 | { | ||
| 289 | 19 | MJpegContext *const m = &m2->mjpeg; | |
| 290 | 19 | MPVEncContext *const s = &m2->mpeg.s; | |
| 291 | static const char blocks_per_mb[] = { | ||
| 292 | [CHROMA_420] = 6, [CHROMA_422] = 8, [CHROMA_444] = 12 | ||
| 293 | }; | ||
| 294 | size_t num_blocks; | ||
| 295 | |||
| 296 | // Make sure we have enough space to hold this frame. | ||
| 297 | 19 | num_blocks = s->c.mb_num * blocks_per_mb[s->c.chroma_format]; | |
| 298 | |||
| 299 | 19 | m->huff_buffer = av_malloc_array(num_blocks, | |
| 300 | 64 /* codes per MB */ * sizeof(MJpegHuffmanCode)); | ||
| 301 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 19 times.
|
19 | if (!m->huff_buffer) |
| 302 | ✗ | return AVERROR(ENOMEM); | |
| 303 | 19 | return 0; | |
| 304 | } | ||
| 305 | |||
| 306 | 31 | static av_cold int mjpeg_encode_close(AVCodecContext *avctx) | |
| 307 | { | ||
| 308 | 31 | MJPEGEncContext *const mjpeg = avctx->priv_data; | |
| 309 | 31 | av_freep(&mjpeg->mjpeg.huff_buffer); | |
| 310 | 31 | ff_mpv_encode_end(avctx); | |
| 311 | 31 | 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 | */ | ||
| 321 | 20394735 | static inline void mjpeg_encode_code(MJpegContext *s, uint8_t table_id, int code) | |
| 322 | { | ||
| 323 | 20394735 | MJpegHuffmanCode *c = &s->huff_buffer[s->huff_ncode++]; | |
| 324 | 20394735 | c->table_id = table_id; | |
| 325 | 20394735 | c->code = code; | |
| 326 | 20394735 | } | |
| 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 | */ | ||
| 336 | 18399604 | static void mjpeg_encode_coef(MJpegContext *s, uint8_t table_id, int val, int run) | |
| 337 | { | ||
| 338 | int mant, code; | ||
| 339 | |||
| 340 |
2/2✓ Branch 0 taken 80721 times.
✓ Branch 1 taken 18318883 times.
|
18399604 | if (val == 0) { |
| 341 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 80721 times.
|
80721 | av_assert0(run == 0); |
| 342 | 80721 | mjpeg_encode_code(s, table_id, 0); | |
| 343 | } else { | ||
| 344 | 18318883 | mant = val; | |
| 345 |
2/2✓ Branch 0 taken 9146326 times.
✓ Branch 1 taken 9172557 times.
|
18318883 | if (val < 0) { |
| 346 | 9146326 | val = -val; | |
| 347 | 9146326 | mant--; | |
| 348 | } | ||
| 349 | |||
| 350 | 18318883 | code = (run << 4) | (av_log2_16bit(val) + 1); | |
| 351 | |||
| 352 | 18318883 | s->huff_buffer[s->huff_ncode].mant = mant; | |
| 353 | 18318883 | mjpeg_encode_code(s, table_id, code); | |
| 354 | } | ||
| 355 | 18399604 | } | |
| 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 | */ | ||
| 364 | 2005356 | static void record_block(MPVEncContext *const s, int16_t block[], int n) | |
| 365 | { | ||
| 366 | int i, j, table_id; | ||
| 367 | int component, dc, last_index, val, run; | ||
| 368 | 2005356 | MJpegContext *m = s->mjpeg_ctx; | |
| 369 | |||
| 370 | /* DC coef */ | ||
| 371 |
2/2✓ Branch 0 taken 987608 times.
✓ Branch 1 taken 1017748 times.
|
2005356 | component = (n <= 3 ? 0 : (n&1) + 1); |
| 372 | 2005356 | table_id = (n <= 3 ? 0 : 1); | |
| 373 | 2005356 | dc = block[0]; /* overflow is impossible */ | |
| 374 | 2005356 | val = dc - s->c.last_dc[component]; | |
| 375 | |||
| 376 | 2005356 | mjpeg_encode_coef(m, table_id, val, 0); | |
| 377 | |||
| 378 | 2005356 | s->c.last_dc[component] = dc; | |
| 379 | |||
| 380 | /* AC coefs */ | ||
| 381 | |||
| 382 | 2005356 | run = 0; | |
| 383 | 2005356 | last_index = s->c.block_last_index[n]; | |
| 384 | 2005356 | table_id |= 2; | |
| 385 | |||
| 386 |
2/2✓ Branch 0 taken 35322338 times.
✓ Branch 1 taken 2005356 times.
|
37327694 | for(i=1;i<=last_index;i++) { |
| 387 | 35322338 | j = s->c.intra_scantable.permutated[i]; | |
| 388 | 35322338 | val = block[j]; | |
| 389 | |||
| 390 |
2/2✓ Branch 0 taken 18928090 times.
✓ Branch 1 taken 16394248 times.
|
35322338 | if (val == 0) { |
| 391 | 18928090 | run++; | |
| 392 | } else { | ||
| 393 |
2/2✓ Branch 0 taken 43994 times.
✓ Branch 1 taken 16394248 times.
|
16438242 | while (run >= 16) { |
| 394 | 43994 | mjpeg_encode_code(m, table_id, 0xf0); | |
| 395 | 43994 | run -= 16; | |
| 396 | } | ||
| 397 | 16394248 | mjpeg_encode_coef(m, table_id, val, run); | |
| 398 | 16394248 | run = 0; | |
| 399 | } | ||
| 400 | } | ||
| 401 | |||
| 402 | /* output EOB only if not already 64 values */ | ||
| 403 |
3/4✓ Branch 0 taken 54219 times.
✓ Branch 1 taken 1951137 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 54219 times.
|
2005356 | if (last_index < 63 || run != 0) |
| 404 | 1951137 | mjpeg_encode_code(m, table_id, 0); | |
| 405 | 2005356 | } | |
| 406 | |||
| 407 | 1077300 | static void encode_block(MPVEncContext *const s, int16_t block[], int n) | |
| 408 | { | ||
| 409 | int mant, nbits, code, i, j; | ||
| 410 | int component, dc, run, last_index, val; | ||
| 411 | 1077300 | const MJpegContext *const m = s->mjpeg_ctx; | |
| 412 | const uint16_t *huff_code_ac; | ||
| 413 | const uint8_t *huff_size_ac; | ||
| 414 | |||
| 415 | /* DC coef */ | ||
| 416 |
2/2✓ Branch 0 taken 359100 times.
✓ Branch 1 taken 718200 times.
|
1077300 | component = (n <= 3 ? 0 : (n&1) + 1); |
| 417 | 1077300 | dc = block[0]; /* overflow is impossible */ | |
| 418 | 1077300 | val = dc - s->c.last_dc[component]; | |
| 419 |
2/2✓ Branch 0 taken 718200 times.
✓ Branch 1 taken 359100 times.
|
1077300 | if (n < 4) { |
| 420 | 718200 | ff_mjpeg_encode_dc(&s->pb, val, m->huff_size_dc_luminance, m->huff_code_dc_luminance); | |
| 421 | 718200 | huff_size_ac = m->huff_size_ac_luminance; | |
| 422 | 718200 | huff_code_ac = m->huff_code_ac_luminance; | |
| 423 | } else { | ||
| 424 | 359100 | ff_mjpeg_encode_dc(&s->pb, val, m->huff_size_dc_chrominance, m->huff_code_dc_chrominance); | |
| 425 | 359100 | huff_size_ac = m->huff_size_ac_chrominance; | |
| 426 | 359100 | huff_code_ac = m->huff_code_ac_chrominance; | |
| 427 | } | ||
| 428 | 1077300 | s->c.last_dc[component] = dc; | |
| 429 | |||
| 430 | /* AC coefs */ | ||
| 431 | |||
| 432 | 1077300 | run = 0; | |
| 433 | 1077300 | last_index = s->c.block_last_index[n]; | |
| 434 |
2/2✓ Branch 0 taken 21120946 times.
✓ Branch 1 taken 1077300 times.
|
22198246 | for(i=1;i<=last_index;i++) { |
| 435 | 21120946 | j = s->c.intra_scantable.permutated[i]; | |
| 436 | 21120946 | val = block[j]; | |
| 437 |
2/2✓ Branch 0 taken 10604708 times.
✓ Branch 1 taken 10516238 times.
|
21120946 | if (val == 0) { |
| 438 | 10604708 | run++; | |
| 439 | } else { | ||
| 440 |
2/2✓ Branch 0 taken 19627 times.
✓ Branch 1 taken 10516238 times.
|
10535865 | while (run >= 16) { |
| 441 | 19627 | put_bits(&s->pb, huff_size_ac[0xf0], huff_code_ac[0xf0]); | |
| 442 | 19627 | run -= 16; | |
| 443 | } | ||
| 444 | 10516238 | mant = val; | |
| 445 |
2/2✓ Branch 0 taken 5281413 times.
✓ Branch 1 taken 5234825 times.
|
10516238 | if (val < 0) { |
| 446 | 5281413 | val = -val; | |
| 447 | 5281413 | mant--; | |
| 448 | } | ||
| 449 | |||
| 450 | 10516238 | nbits= av_log2_16bit(val) + 1; | |
| 451 | 10516238 | code = (run << 4) | nbits; | |
| 452 | |||
| 453 | 10516238 | put_bits(&s->pb, huff_size_ac[code], huff_code_ac[code]); | |
| 454 | |||
| 455 | 10516238 | put_sbits(&s->pb, nbits, mant); | |
| 456 | 10516238 | run = 0; | |
| 457 | } | ||
| 458 | } | ||
| 459 | |||
| 460 | /* output EOB only if not already 64 values */ | ||
| 461 |
3/4✓ Branch 0 taken 40270 times.
✓ Branch 1 taken 1037030 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 40270 times.
|
1077300 | if (last_index < 63 || run != 0) |
| 462 | 1037030 | put_bits(&s->pb, huff_size_ac[0], huff_code_ac[0]); | |
| 463 | 1077300 | } | |
| 464 | |||
| 465 | 254512 | static void mjpeg_record_mb(MPVEncContext *const s, int16_t block[][64], | |
| 466 | int unused_x, int unused_y) | ||
| 467 | { | ||
| 468 |
2/2✓ Branch 0 taken 59914 times.
✓ Branch 1 taken 194598 times.
|
254512 | if (s->c.chroma_format == CHROMA_444) { |
| 469 | 59914 | record_block(s, block[0], 0); | |
| 470 | 59914 | record_block(s, block[2], 2); | |
| 471 | 59914 | record_block(s, block[4], 4); | |
| 472 | 59914 | record_block(s, block[8], 8); | |
| 473 | 59914 | record_block(s, block[5], 5); | |
| 474 | 59914 | record_block(s, block[9], 9); | |
| 475 | |||
| 476 |
2/2✓ Branch 0 taken 59764 times.
✓ Branch 1 taken 150 times.
|
59914 | if (16*s->c.mb_x+8 < s->c.width) { |
| 477 | 59764 | record_block(s, block[1], 1); | |
| 478 | 59764 | record_block(s, block[3], 3); | |
| 479 | 59764 | record_block(s, block[6], 6); | |
| 480 | 59764 | record_block(s, block[10], 10); | |
| 481 | 59764 | record_block(s, block[7], 7); | |
| 482 | 59764 | record_block(s, block[11], 11); | |
| 483 | } | ||
| 484 | } else { | ||
| 485 |
2/2✓ Branch 0 taken 972990 times.
✓ Branch 1 taken 194598 times.
|
1167588 | for (int i = 0; i < 5; i++) |
| 486 | 972990 | record_block(s, block[i], i); | |
| 487 |
2/2✓ Branch 0 taken 134748 times.
✓ Branch 1 taken 59850 times.
|
194598 | if (s->c.chroma_format == CHROMA_420) { |
| 488 | 134748 | record_block(s, block[5], 5); | |
| 489 | } else { | ||
| 490 | 59850 | record_block(s, block[6], 6); | |
| 491 | 59850 | record_block(s, block[5], 5); | |
| 492 | 59850 | record_block(s, block[7], 7); | |
| 493 | } | ||
| 494 | } | ||
| 495 | 254512 | } | |
| 496 | |||
| 497 | 179550 | static void mjpeg_encode_mb(MPVEncContext *const s, int16_t block[][64], | |
| 498 | int unused_x, int unused_y) | ||
| 499 | { | ||
| 500 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 179550 times.
|
179550 | if (s->c.chroma_format == CHROMA_444) { |
| 501 | ✗ | encode_block(s, block[0], 0); | |
| 502 | ✗ | encode_block(s, block[2], 2); | |
| 503 | ✗ | encode_block(s, block[4], 4); | |
| 504 | ✗ | encode_block(s, block[8], 8); | |
| 505 | ✗ | encode_block(s, block[5], 5); | |
| 506 | ✗ | encode_block(s, block[9], 9); | |
| 507 | |||
| 508 | ✗ | if (16 * s->c.mb_x + 8 < s->c.width) { | |
| 509 | ✗ | encode_block(s, block[1], 1); | |
| 510 | ✗ | encode_block(s, block[3], 3); | |
| 511 | ✗ | encode_block(s, block[6], 6); | |
| 512 | ✗ | encode_block(s, block[10], 10); | |
| 513 | ✗ | encode_block(s, block[7], 7); | |
| 514 | ✗ | encode_block(s, block[11], 11); | |
| 515 | } | ||
| 516 | } else { | ||
| 517 |
2/2✓ Branch 0 taken 897750 times.
✓ Branch 1 taken 179550 times.
|
1077300 | for (int i = 0; i < 5; i++) |
| 518 | 897750 | encode_block(s, block[i], i); | |
| 519 |
1/2✓ Branch 0 taken 179550 times.
✗ Branch 1 not taken.
|
179550 | if (s->c.chroma_format == CHROMA_420) { |
| 520 | 179550 | encode_block(s, block[5], 5); | |
| 521 | } else { | ||
| 522 | ✗ | encode_block(s, block[6], 6); | |
| 523 | ✗ | encode_block(s, block[5], 5); | |
| 524 | ✗ | encode_block(s, block[7], 7); | |
| 525 | } | ||
| 526 | } | ||
| 527 | |||
| 528 | 179550 | s->i_tex_bits += get_bits_diff(s); | |
| 529 | 179550 | } | |
| 530 | |||
| 531 | 31 | static av_cold int mjpeg_encode_init(AVCodecContext *avctx) | |
| 532 | { | ||
| 533 | 31 | MJPEGEncContext *const m2 = avctx->priv_data; | |
| 534 | 31 | MJpegContext *const m = &m2->mjpeg; | |
| 535 | 31 | MPVEncContext *const s = &m2->mpeg.s; | |
| 536 | int ret; | ||
| 537 | |||
| 538 | 31 | s->mjpeg_ctx = m; | |
| 539 | 31 | m2->mpeg.encode_picture_header = mjpeg_amv_encode_picture_header; | |
| 540 | // May be overridden below | ||
| 541 | 31 | s->encode_mb = mjpeg_encode_mb; | |
| 542 | |||
| 543 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 31 times.
|
31 | if (s->mpv_flags & FF_MPV_FLAG_QP_RD) { |
| 544 | // Used to produce garbage with MJPEG. | ||
| 545 | ✗ | av_log(avctx, AV_LOG_ERROR, | |
| 546 | "QP RD is no longer compatible with MJPEG or AMV\n"); | ||
| 547 | ✗ | return AVERROR(EINVAL); | |
| 548 | } | ||
| 549 | |||
| 550 | /* The following check is automatically true for AMV, | ||
| 551 | * but it doesn't hurt either. */ | ||
| 552 | 31 | ret = ff_mjpeg_encode_check_pix_fmt(avctx); | |
| 553 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 31 times.
|
31 | if (ret < 0) |
| 554 | ✗ | return ret; | |
| 555 | |||
| 556 |
2/4✓ Branch 0 taken 31 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 31 times.
|
31 | if (avctx->width > 65500 || avctx->height > 65500) { |
| 557 | ✗ | av_log(avctx, AV_LOG_ERROR, "JPEG does not support resolutions above 65500x65500\n"); | |
| 558 | ✗ | return AVERROR(EINVAL); | |
| 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. | ||
| 564 | 31 | ff_mjpeg_build_huffman_codes(m->huff_size_dc_luminance, | |
| 565 | 31 | m->huff_code_dc_luminance, | |
| 566 | ff_mjpeg_bits_dc_luminance, | ||
| 567 | ff_mjpeg_val_dc); | ||
| 568 | 31 | ff_mjpeg_build_huffman_codes(m->huff_size_dc_chrominance, | |
| 569 | 31 | m->huff_code_dc_chrominance, | |
| 570 | ff_mjpeg_bits_dc_chrominance, | ||
| 571 | ff_mjpeg_val_dc); | ||
| 572 | 31 | ff_mjpeg_build_huffman_codes(m->huff_size_ac_luminance, | |
| 573 | 31 | m->huff_code_ac_luminance, | |
| 574 | ff_mjpeg_bits_ac_luminance, | ||
| 575 | ff_mjpeg_val_ac_luminance); | ||
| 576 | 31 | ff_mjpeg_build_huffman_codes(m->huff_size_ac_chrominance, | |
| 577 | 31 | m->huff_code_ac_chrominance, | |
| 578 | ff_mjpeg_bits_ac_chrominance, | ||
| 579 | ff_mjpeg_val_ac_chrominance); | ||
| 580 | |||
| 581 | 31 | init_uni_ac_vlc(m->huff_size_ac_luminance, m->uni_ac_vlc_len); | |
| 582 | 31 | init_uni_ac_vlc(m->huff_size_ac_chrominance, m->uni_chroma_ac_vlc_len); | |
| 583 | |||
| 584 | 31 | s->min_qcoeff = -1023; | |
| 585 | 31 | s->max_qcoeff = 1023; | |
| 586 | |||
| 587 | 31 | s->intra_ac_vlc_length = | |
| 588 | 31 | s->intra_ac_vlc_last_length = m->uni_ac_vlc_len; | |
| 589 | 31 | s->intra_chroma_ac_vlc_length = | |
| 590 | 31 | s->intra_chroma_ac_vlc_last_length = m->uni_chroma_ac_vlc_len; | |
| 591 | |||
| 592 | 31 | ret = ff_mpv_encode_init(avctx); | |
| 593 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 31 times.
|
31 | if (ret < 0) |
| 594 | ✗ | return ret; | |
| 595 | |||
| 596 | // Buffers start out empty. | ||
| 597 | 31 | m->huff_ncode = 0; | |
| 598 | |||
| 599 |
2/2✓ Branch 0 taken 4 times.
✓ Branch 1 taken 27 times.
|
31 | if (s->c.slice_context_count > 1) |
| 600 | 4 | m->huffman = HUFFMAN_TABLE_DEFAULT; | |
| 601 | |||
| 602 |
2/2✓ Branch 0 taken 19 times.
✓ Branch 1 taken 12 times.
|
31 | if (m->huffman == HUFFMAN_TABLE_OPTIMAL) { |
| 603 | // If we are here, we have only one slice_context. So no loop necessary. | ||
| 604 | 19 | s->encode_mb = mjpeg_record_mb; | |
| 605 | 19 | return alloc_huffman(m2); | |
| 606 | } | ||
| 607 | |||
| 608 | 12 | return 0; | |
| 609 | } | ||
| 610 | |||
| 611 | #if CONFIG_AMV_ENCODER | ||
| 612 | // maximum over s->mjpeg_vsample[i] | ||
| 613 | #define V_MAX 2 | ||
| 614 | 200 | static int amv_encode_picture(AVCodecContext *avctx, AVPacket *pkt, | |
| 615 | const AVFrame *pic_arg, int *got_packet) | ||
| 616 | { | ||
| 617 | 200 | MPVEncContext *const s = avctx->priv_data; | |
| 618 | AVFrame *pic; | ||
| 619 | int i, ret; | ||
| 620 | 200 | int chroma_v_shift = 1; /* AMV is 420-only */ | |
| 621 | |||
| 622 |
3/4✓ Branch 0 taken 50 times.
✓ Branch 1 taken 150 times.
✗ Branch 2 not taken.
✓ Branch 3 taken 50 times.
|
200 | if ((avctx->height & 15) && avctx->strict_std_compliance > FF_COMPLIANCE_UNOFFICIAL) { |
| 623 | ✗ | av_log(avctx, AV_LOG_ERROR, | |
| 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"); | ||
| 628 | ✗ | return AVERROR_EXPERIMENTAL; | |
| 629 | } | ||
| 630 | |||
| 631 | 200 | pic = av_frame_clone(pic_arg); | |
| 632 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 200 times.
|
200 | if (!pic) |
| 633 | ✗ | return AVERROR(ENOMEM); | |
| 634 | //picture should be flipped upside-down | ||
| 635 |
2/2✓ Branch 0 taken 600 times.
✓ Branch 1 taken 200 times.
|
800 | for(i=0; i < 3; i++) { |
| 636 |
2/2✓ Branch 0 taken 400 times.
✓ Branch 1 taken 200 times.
|
600 | int vsample = i ? 2 >> chroma_v_shift : 2; |
| 637 | 600 | pic->data[i] += pic->linesize[i] * (vsample * s->c.height / V_MAX - 1); | |
| 638 | 600 | pic->linesize[i] *= -1; | |
| 639 | } | ||
| 640 | 200 | ret = ff_mpv_encode_picture(avctx, pkt, pic, got_packet); | |
| 641 | 200 | av_frame_free(&pic); | |
| 642 | 200 | return ret; | |
| 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 | ||
| 648 | static const AVOption options[] = { | ||
| 649 | #define AMV_OPTIONS_OFFSET 4 | ||
| 650 | { "huffman", "Huffman table strategy", OFFSET(huffman), AV_OPT_TYPE_INT, { .i64 = HUFFMAN_TABLE_OPTIMAL }, 0, NB_HUFFMAN_TABLE_OPTION - 1, VE, .unit = "huffman" }, | ||
| 651 | { "default", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = HUFFMAN_TABLE_DEFAULT }, INT_MIN, INT_MAX, VE, .unit = "huffman" }, | ||
| 652 | { "optimal", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = HUFFMAN_TABLE_OPTIMAL }, INT_MIN, INT_MAX, VE, .unit = "huffman" }, | ||
| 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 }, | ||
| 654 | FF_MPV_COMMON_OPTS | ||
| 655 | { NULL}, | ||
| 656 | }; | ||
| 657 | |||
| 658 | #if CONFIG_MJPEG_ENCODER | ||
| 659 | static const AVClass mjpeg_class = { | ||
| 660 | .class_name = "mjpeg encoder", | ||
| 661 | .item_name = av_default_item_name, | ||
| 662 | .option = options, | ||
| 663 | .version = LIBAVUTIL_VERSION_INT, | ||
| 664 | }; | ||
| 665 | |||
| 666 | 187 | static int mjpeg_get_supported_config(const AVCodecContext *avctx, | |
| 667 | const AVCodec *codec, | ||
| 668 | enum AVCodecConfig config, | ||
| 669 | unsigned flags, const void **out, | ||
| 670 | int *out_num) | ||
| 671 | { | ||
| 672 |
2/2✓ Branch 0 taken 27 times.
✓ Branch 1 taken 160 times.
|
187 | if (config == AV_CODEC_CONFIG_COLOR_RANGE) { |
| 673 | static const enum AVColorRange mjpeg_ranges[] = { | ||
| 674 | AVCOL_RANGE_MPEG, AVCOL_RANGE_JPEG, AVCOL_RANGE_UNSPECIFIED, | ||
| 675 | }; | ||
| 676 |
1/2✓ Branch 0 taken 27 times.
✗ Branch 1 not taken.
|
27 | int strict = avctx ? avctx->strict_std_compliance : 0; |
| 677 | 27 | int index = strict > FF_COMPLIANCE_UNOFFICIAL ? 1 : 0; | |
| 678 | 27 | *out = &mjpeg_ranges[index]; | |
| 679 | 27 | *out_num = FF_ARRAY_ELEMS(mjpeg_ranges) - index - 1; | |
| 680 | 27 | return 0; | |
| 681 | } | ||
| 682 | |||
| 683 | 160 | return ff_default_get_supported_config(avctx, codec, config, flags, out, out_num); | |
| 684 | } | ||
| 685 | |||
| 686 | const FFCodec ff_mjpeg_encoder = { | ||
| 687 | .p.name = "mjpeg", | ||
| 688 | CODEC_LONG_NAME("MJPEG (Motion JPEG)"), | ||
| 689 | .p.type = AVMEDIA_TYPE_VIDEO, | ||
| 690 | .p.id = AV_CODEC_ID_MJPEG, | ||
| 691 | .priv_data_size = sizeof(MJPEGEncContext), | ||
| 692 | .init = mjpeg_encode_init, | ||
| 693 | FF_CODEC_ENCODE_CB(ff_mpv_encode_picture), | ||
| 694 | .close = mjpeg_encode_close, | ||
| 695 | .p.capabilities = AV_CODEC_CAP_DR1 | | ||
| 696 | AV_CODEC_CAP_SLICE_THREADS | AV_CODEC_CAP_FRAME_THREADS | | ||
| 697 | AV_CODEC_CAP_ENCODER_REORDERED_OPAQUE, | ||
| 698 | .caps_internal = FF_CODEC_CAP_INIT_CLEANUP | FF_CODEC_CAP_ICC_PROFILES, | ||
| 699 | CODEC_PIXFMTS(AV_PIX_FMT_YUVJ420P, AV_PIX_FMT_YUVJ422P, AV_PIX_FMT_YUVJ444P, | ||
| 700 | AV_PIX_FMT_YUV420P, AV_PIX_FMT_YUV422P, AV_PIX_FMT_YUV444P), | ||
| 701 | .p.priv_class = &mjpeg_class, | ||
| 702 | .p.profiles = NULL_IF_CONFIG_SMALL(ff_mjpeg_profiles), | ||
| 703 | .get_supported_config = mjpeg_get_supported_config, | ||
| 704 | }; | ||
| 705 | #endif | ||
| 706 | |||
| 707 | #if CONFIG_AMV_ENCODER | ||
| 708 | static const AVClass amv_class = { | ||
| 709 | .class_name = "amv encoder", | ||
| 710 | .item_name = av_default_item_name, | ||
| 711 | .option = options + AMV_OPTIONS_OFFSET, | ||
| 712 | .version = LIBAVUTIL_VERSION_INT, | ||
| 713 | }; | ||
| 714 | |||
| 715 | const FFCodec ff_amv_encoder = { | ||
| 716 | .p.name = "amv", | ||
| 717 | CODEC_LONG_NAME("AMV Video"), | ||
| 718 | .p.type = AVMEDIA_TYPE_VIDEO, | ||
| 719 | .p.id = AV_CODEC_ID_AMV, | ||
| 720 | .p.capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_ENCODER_REORDERED_OPAQUE, | ||
| 721 | .priv_data_size = sizeof(MJPEGEncContext), | ||
| 722 | .init = mjpeg_encode_init, | ||
| 723 | FF_CODEC_ENCODE_CB(amv_encode_picture), | ||
| 724 | .close = mjpeg_encode_close, | ||
| 725 | .caps_internal = FF_CODEC_CAP_INIT_CLEANUP, | ||
| 726 | CODEC_PIXFMTS(AV_PIX_FMT_YUVJ420P), | ||
| 727 | .color_ranges = AVCOL_RANGE_JPEG, | ||
| 728 | .p.priv_class = &amv_class, | ||
| 729 | }; | ||
| 730 | #endif | ||
| 731 |