blob: 2db3d6733a82066531dbb47a26093dfe383116e8
1 | /* |
2 | * Mpeg video formats-related defines and utility functions |
3 | * |
4 | * This file is part of FFmpeg. |
5 | * |
6 | * FFmpeg is free software; you can redistribute it and/or |
7 | * modify it under the terms of the GNU Lesser General Public |
8 | * License as published by the Free Software Foundation; either |
9 | * version 2.1 of the License, or (at your option) any later version. |
10 | * |
11 | * FFmpeg is distributed in the hope that it will be useful, |
12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
14 | * Lesser General Public License for more details. |
15 | * |
16 | * You should have received a copy of the GNU Lesser General Public |
17 | * License along with FFmpeg; if not, write to the Free Software |
18 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
19 | */ |
20 | |
21 | #ifndef AVCODEC_MPEGPICTURE_H |
22 | #define AVCODEC_MPEGPICTURE_H |
23 | |
24 | #include <stdint.h> |
25 | |
26 | #include "libavutil/frame.h" |
27 | |
28 | #include "avcodec.h" |
29 | #include "motion_est.h" |
30 | #include "thread.h" |
31 | |
32 | #define MAX_PICTURE_COUNT 36 |
33 | #define EDGE_WIDTH 16 |
34 | |
35 | typedef struct ScratchpadContext { |
36 | uint8_t *edge_emu_buffer; ///< temporary buffer for if MVs point to out-of-frame data |
37 | uint8_t *rd_scratchpad; ///< scratchpad for rate distortion mb decision |
38 | uint8_t *obmc_scratchpad; |
39 | uint8_t *b_scratchpad; ///< scratchpad used for writing into write only buffers |
40 | } ScratchpadContext; |
41 | |
42 | /** |
43 | * Picture. |
44 | */ |
45 | typedef struct Picture { |
46 | struct AVFrame *f; |
47 | ThreadFrame tf; |
48 | |
49 | AVBufferRef *qscale_table_buf; |
50 | int8_t *qscale_table; |
51 | |
52 | AVBufferRef *motion_val_buf[2]; |
53 | int16_t (*motion_val[2])[2]; |
54 | |
55 | AVBufferRef *mb_type_buf; |
56 | uint32_t *mb_type; ///< types and macros are defined in mpegutils.h |
57 | |
58 | AVBufferRef *mbskip_table_buf; |
59 | uint8_t *mbskip_table; |
60 | |
61 | AVBufferRef *ref_index_buf[2]; |
62 | int8_t *ref_index[2]; |
63 | |
64 | AVBufferRef *mb_var_buf; |
65 | uint16_t *mb_var; ///< Table for MB variances |
66 | |
67 | AVBufferRef *mc_mb_var_buf; |
68 | uint16_t *mc_mb_var; ///< Table for motion compensated MB variances |
69 | |
70 | int alloc_mb_width; ///< mb_width used to allocate tables |
71 | int alloc_mb_height; ///< mb_height used to allocate tables |
72 | |
73 | AVBufferRef *mb_mean_buf; |
74 | uint8_t *mb_mean; ///< Table for MB luminance |
75 | |
76 | AVBufferRef *hwaccel_priv_buf; |
77 | void *hwaccel_picture_private; ///< Hardware accelerator private data |
78 | |
79 | int field_picture; ///< whether or not the picture was encoded in separate fields |
80 | |
81 | int64_t mb_var_sum; ///< sum of MB variance for current frame |
82 | int64_t mc_mb_var_sum; ///< motion compensated MB variance for current frame |
83 | |
84 | int b_frame_score; |
85 | int needs_realloc; ///< Picture needs to be reallocated (eg due to a frame size change) |
86 | |
87 | int reference; |
88 | int shared; |
89 | |
90 | uint64_t encoding_error[AV_NUM_DATA_POINTERS]; |
91 | } Picture; |
92 | |
93 | /** |
94 | * Allocate a Picture. |
95 | * The pixels are allocated/set by calling get_buffer() if shared = 0. |
96 | */ |
97 | int ff_alloc_picture(AVCodecContext *avctx, Picture *pic, MotionEstContext *me, |
98 | ScratchpadContext *sc, int shared, int encoding, |
99 | int chroma_x_shift, int chroma_y_shift, int out_format, |
100 | int mb_stride, int mb_width, int mb_height, int b8_stride, |
101 | ptrdiff_t *linesize, ptrdiff_t *uvlinesize); |
102 | |
103 | int ff_mpeg_framesize_alloc(AVCodecContext *avctx, MotionEstContext *me, |
104 | ScratchpadContext *sc, int linesize); |
105 | |
106 | int ff_mpeg_ref_picture(AVCodecContext *avctx, Picture *dst, Picture *src); |
107 | void ff_mpeg_unref_picture(AVCodecContext *avctx, Picture *picture); |
108 | |
109 | void ff_free_picture_tables(Picture *pic); |
110 | int ff_update_picture_tables(Picture *dst, Picture *src); |
111 | |
112 | int ff_find_unused_picture(AVCodecContext *avctx, Picture *picture, int shared); |
113 | |
114 | #endif /* AVCODEC_MPEGPICTURE_H */ |
115 |