While it offers modest speedups compared to the ordinary code, removing it completely offers even bigger speedups; and given that these speedups also exist in the ordinary mode, they are even more important. The no-output code has a 7.8% performance improvement (based on benchmarking mpeg4_encode_mb()), yet removing the no-output code resulted in a 9.4% improvement. Furthermore, the no-output code was broken for the majority of its existence (until 9207dc3b0db368bb9cf5eb295cbc1129c2975e31) and no one complained, so it is likely not used at all.
Unified · Split
| @@ -292,14 +292,6 @@ static inline void mpeg4_encode_dc(PutBitContext *s, int level, int n) · 291 unmodified lines | |||
| 292 | } | 292 | } |
| 293 | } | 293 | } |
| 294 | 294 | ||
| 295 | static inline int mpeg4_get_dc_length(int level, int n) | ||
| 296 | { | ||
| 297 | if (n < 4) | ||
| 298 | return uni_DCtab_lum_len[level + 256]; | ||
| 299 | else | ||
| 300 | return uni_DCtab_chrom_len[level + 256]; | ||
| 301 | } | ||
| 302 | |||
| 303 | /** | 295 | /** |
| 304 | * Encode an 8x8 block. | 296 | * Encode an 8x8 block. |
| 305 | * @param n block index (0-3 are luma, 4-5 are chroma) | 297 | * @param n block index (0-3 are luma, 4-5 are chroma) |
| @@ -365,60 +357,6 @@ static inline void mpeg4_encode_block(const MPVEncContext *const s, · 59 unmodified lines | |||
| 365 | } | 357 | } |
| 366 | } | 358 | } |
| 367 | 359 | ||
| 368 | static int mpeg4_get_block_length(MPVEncContext *const s, | ||
| 369 | const int16_t *block, int n, | ||
| 370 | int intra_dc, const uint8_t *scan_table) | ||
| 371 | { | ||
| 372 | int i, last_non_zero; | ||
| 373 | const uint8_t *len_tab; | ||
| 374 | const int last_index = s->c.block_last_index[n]; | ||
| 375 | int len = 0; | ||
| 376 | |||
| 377 | if (s->c.mb_intra) { // Note gcc (3.2.1 at least) will optimize this away | ||
| 378 | /* MPEG-4 based DC predictor */ | ||
| 379 | len += mpeg4_get_dc_length(intra_dc, n); | ||
| 380 | if (last_index < 1) | ||
| 381 | return len; | ||
| 382 | i = 1; | ||
| 383 | len_tab = uni_mpeg4_intra_rl_len; | ||
| 384 | } else { | ||
| 385 | if (last_index < 0) | ||
| 386 | return 0; | ||
| 387 | i = 0; | ||
| 388 | len_tab = uni_mpeg4_inter_rl_len; | ||
| 389 | } | ||
| 390 | |||
| 391 | /* AC coefs */ | ||
| 392 | last_non_zero = i - 1; | ||
| 393 | for (; i < last_index; i++) { | ||
| 394 | int level = block[scan_table[i]]; | ||
| 395 | if (level) { | ||
| 396 | int run = i - last_non_zero - 1; | ||
| 397 | level += 64; | ||
| 398 | if ((level & (~127)) == 0) { | ||
| 399 | const int index = UNI_MPEG4_ENC_INDEX(0, run, level); | ||
| 400 | len += len_tab[index]; | ||
| 401 | } else { // ESC3 | ||
| 402 | len += 7 + 2 + 1 + 6 + 1 + 12 + 1; | ||
| 403 | } | ||
| 404 | last_non_zero = i; | ||
| 405 | } | ||
| 406 | } | ||
| 407 | /* if (i <= last_index) */ { | ||
| 408 | int level = block[scan_table[i]]; | ||
| 409 | int run = i - last_non_zero - 1; | ||
| 410 | level += 64; | ||
| 411 | if ((level & (~127)) == 0) { | ||
| 412 | const int index = UNI_MPEG4_ENC_INDEX(1, run, level); | ||
| 413 | len += len_tab[index]; | ||
| 414 | } else { // ESC3 | ||
| 415 | len += 7 + 2 + 1 + 6 + 1 + 12 + 1; | ||
| 416 | } | ||
| 417 | } | ||
| 418 | |||
| 419 | return len; | ||
| 420 | } | ||
| 421 | |||
| 422 | static inline void mpeg4_encode_blocks(MPVEncContext *const s, | 360 | static inline void mpeg4_encode_blocks(MPVEncContext *const s, |
| 423 | const int16_t block[6][64], | 361 | const int16_t block[6][64], |
| 424 | const int intra_dc[6], | 362 | const int intra_dc[6], |
| @@ -429,29 +367,15 @@ static inline void mpeg4_encode_blocks(MPVEncContext *const s, · 4 unmodified lines | |||
| 429 | int i; | 367 | int i; |
| 430 | 368 | ||
| 431 | if (scan_table) { | 369 | if (scan_table) { |
| 432 | if (s->c.avctx->flags2 & AV_CODEC_FLAG2_NO_OUTPUT) { | ||
| 433 | for (i = 0; i < 6; i++) | ||
| 434 | skip_put_bits(&s->pb, | ||
| 435 | mpeg4_get_block_length(s, block[i], i, | ||
| 436 | intra_dc[i], scan_table[i])); | ||
| 437 | } else { | ||
| 438 | /* encode each block */ | 370 | /* encode each block */ |
| 439 | for (i = 0; i < 6; i++) | 371 | for (i = 0; i < 6; i++) |
| 440 | mpeg4_encode_block(s, block[i], i, | 372 | mpeg4_encode_block(s, block[i], i, |
| 441 | intra_dc[i], scan_table[i], dc_pb, ac_pb); | 373 | intra_dc[i], scan_table[i], dc_pb, ac_pb); |
| 442 | } | ||
| 443 | } else { | 374 | } else { |
| 444 | if (s->c.avctx->flags2 & AV_CODEC_FLAG2_NO_OUTPUT) { | ||
| 445 | for (i = 0; i < 6; i++) | ||
| 446 | skip_put_bits(&s->pb, | ||
| 447 | mpeg4_get_block_length(s, block[i], i, 0, | ||
| 448 | s->c.intra_scantable.permutated)); | ||
| 449 | } else { | ||
| 450 | /* encode each block */ | 375 | /* encode each block */ |
| 451 | for (i = 0; i < 6; i++) | 376 | for (i = 0; i < 6; i++) |
| 452 | mpeg4_encode_block(s, block[i], i, 0, | 377 | mpeg4_encode_block(s, block[i], i, 0, |
| 453 | s->c.intra_scantable.permutated, dc_pb, ac_pb); | 378 | s->c.intra_scantable.permutated, dc_pb, ac_pb); |
| 454 | } | ||
| 455 | } | 379 | } |
| 456 | } | 380 | } |
| 457 | 381 | ||