Line | Branch | Exec | Source |
---|---|---|---|

1 | /* | ||

2 | * MJPEG encoder | ||

3 | * Copyright (c) 2016 William Ma, Ted Ying, Jerry Jiang | ||

4 | * | ||

5 | * This file is part of FFmpeg. | ||

6 | * | ||

7 | * FFmpeg is free software; you can redistribute it and/or | ||

8 | * modify it under the terms of the GNU Lesser General Public | ||

9 | * License as published by the Free Software Foundation; either | ||

10 | * version 2.1 of the License, or (at your option) any later version. | ||

11 | * | ||

12 | * FFmpeg is distributed in the hope that it will be useful, | ||

13 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||

14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||

15 | * Lesser General Public License for more details. | ||

16 | * | ||

17 | * You should have received a copy of the GNU Lesser General Public | ||

18 | * License along with FFmpeg; if not, write to the Free Software | ||

19 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | ||

20 | */ | ||

21 | |||

22 | /** | ||

23 | * @file | ||

24 | * Huffman table generation for MJPEG encoder. | ||

25 | */ | ||

26 | |||

27 | #ifndef AVCODEC_MJPEGENC_HUFFMAN_H | ||

28 | #define AVCODEC_MJPEGENC_HUFFMAN_H | ||

29 | |||

30 | #include <stdint.h> | ||

31 | |||

32 | typedef struct MJpegEncHuffmanContext { | ||

33 | int val_count[256]; | ||

34 | } MJpegEncHuffmanContext; | ||

35 | |||

36 | // Uses the package merge algorithm to compute the Huffman table. | ||

37 | void ff_mjpeg_encode_huffman_init(MJpegEncHuffmanContext *s); | ||

38 | 28822754 | static inline void ff_mjpeg_encode_huffman_increment(MJpegEncHuffmanContext *s, | |

39 | uint8_t val) | ||

40 | { | ||

41 | 28822754 | s->val_count[val]++; | |

42 | 28822754 | } | |

43 | void ff_mjpeg_encode_huffman_close(MJpegEncHuffmanContext *s, | ||

44 | uint8_t bits[17], uint8_t val[], | ||

45 | int max_nval); | ||

46 | |||

47 | |||

48 | /** | ||

49 | * Used to assign a occurrence count or "probability" to an input value | ||

50 | */ | ||

51 | typedef struct PTable { | ||

52 | int value; ///< input value | ||

53 | int prob; ///< number of occurences of this value in input | ||

54 | } PTable; | ||

55 | |||

56 | /** | ||

57 | * Used to store intermediate lists in the package merge algorithm | ||

58 | */ | ||

59 | typedef struct PackageMergerList { | ||

60 | int nitems; ///< number of items in the list and probability ex. 4 | ||

61 | int item_idx[515]; ///< index range for each item in items 0, 2, 5, 9, 13 | ||

62 | int probability[514]; ///< probability of each item 3, 8, 18, 46 | ||

63 | int items[257 * 16]; ///< chain of all individual values that make up items A, B, A, B, C, A, B, C, D, C, D, D, E | ||

64 | } PackageMergerList; | ||

65 | |||

66 | /** | ||

67 | * Used to store optimal huffman encoding results | ||

68 | */ | ||

69 | typedef struct HuffTable { | ||

70 | int code; ///< code is the input value | ||

71 | int length; ///< length of the encoding | ||

72 | } HuffTable; | ||

73 | |||

74 | void ff_mjpegenc_huffman_compute_bits(PTable *prob_table, HuffTable *distincts, | ||

75 | int size, int max_length); | ||

76 | #endif /* AVCODEC_MJPEGENC_HUFFMAN_H */ | ||

77 |