/work/libde265/libde265/decctx.h
Line | Count | Source |
1 | | /* |
2 | | * H.265 video codec. |
3 | | * Copyright (c) 2013-2014 struktur AG, Dirk Farin <farin@struktur.de> |
4 | | * |
5 | | * This file is part of libde265. |
6 | | * |
7 | | * libde265 is free software: you can redistribute it and/or modify |
8 | | * it under the terms of the GNU Lesser General Public License as |
9 | | * published by the Free Software Foundation, either version 3 of |
10 | | * the License, or (at your option) any later version. |
11 | | * |
12 | | * libde265 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 |
15 | | * GNU Lesser General Public License for more details. |
16 | | * |
17 | | * You should have received a copy of the GNU Lesser General Public License |
18 | | * along with libde265. If not, see <http://www.gnu.org/licenses/>. |
19 | | */ |
20 | | |
21 | | #ifndef DE265_DECCTX_H |
22 | | #define DE265_DECCTX_H |
23 | | |
24 | | #include "libde265/vps.h" |
25 | | #include "libde265/sps.h" |
26 | | #include "libde265/pps.h" |
27 | | #include "libde265/nal.h" |
28 | | #include "libde265/slice.h" |
29 | | #include "libde265/image.h" |
30 | | #include "libde265/motion.h" |
31 | | #include "libde265/de265.h" |
32 | | #include "libde265/dpb.h" |
33 | | #include "libde265/sei.h" |
34 | | #include "libde265/threads.h" |
35 | | #include "libde265/acceleration.h" |
36 | | #include "libde265/nal-parser.h" |
37 | | |
38 | | #include <memory> |
39 | | |
40 | 220 | #define DE265_MAX_VPS_SETS 16 // this is the maximum as defined in the standard |
41 | 2.38k | #define DE265_MAX_SPS_SETS 16 // this is the maximum as defined in the standard |
42 | 2.58k | #define DE265_MAX_PPS_SETS 64 // this is the maximum as defined in the standard |
43 | | |
44 | 1.15k | #define MAX_WARNINGS 20 |
45 | | |
46 | | |
47 | | class slice_segment_header; |
48 | | class image_unit; |
49 | | class slice_unit; |
50 | | class decoder_context; |
51 | | |
52 | | |
53 | | class thread_context |
54 | | { |
55 | | public: |
56 | | thread_context(); |
57 | | |
58 | | uint32_t CtbAddrInRS; |
59 | | uint32_t CtbAddrInTS; |
60 | | |
61 | | uint16_t CtbX, CtbY; |
62 | | |
63 | | |
64 | | // motion vectors |
65 | | |
66 | | PBMotionCoding motion; |
67 | | |
68 | | |
69 | | // prediction |
70 | | |
71 | | // enum IntraPredMode IntraPredModeC[4]; // chroma intra-prediction mode for current CB |
72 | | int ResScaleVal; |
73 | | |
74 | | |
75 | | // residual data |
76 | | |
77 | | uint8_t cu_transquant_bypass_flag; |
78 | | uint8_t transform_skip_flag[3]; |
79 | | uint8_t explicit_rdpcm_flag; |
80 | | uint8_t explicit_rdpcm_dir; |
81 | | |
82 | | // we need 16 bytes of extra memory (8*int16) to shift the base for the |
83 | | // alignment required for SSE code ! |
84 | | int16_t _coeffBuf[(32*32)+8]; |
85 | | int16_t *coeffBuf; // the base pointer for into _coeffBuf, aligned to 16 bytes |
86 | | |
87 | | int16_t coeffList[3][32*32]; |
88 | | int16_t coeffPos[3][32*32]; |
89 | | int16_t nCoeff[3]; |
90 | | |
91 | | int32_t residual_luma[32*32]; // only used when cross-comp-prediction is enabled |
92 | | |
93 | | |
94 | | // quantization |
95 | | |
96 | | int IsCuQpDeltaCoded; |
97 | | int CuQpDelta; |
98 | | int IsCuChromaQpOffsetCoded; |
99 | | int CuQpOffsetCb, CuQpOffsetCr; |
100 | | |
101 | | int currentQPY; |
102 | | int currentQG_x, currentQG_y; |
103 | | int lastQPYinPreviousQG; |
104 | | |
105 | | int qPYPrime, qPCbPrime, qPCrPrime; |
106 | | |
107 | | CABAC_decoder cabac_decoder; |
108 | | |
109 | | context_model_table ctx_model; |
110 | | uint8_t StatCoeff[4]; |
111 | | |
112 | | decoder_context* decctx; |
113 | | struct de265_image *img; |
114 | | slice_segment_header* shdr; |
115 | | |
116 | | image_unit* imgunit; |
117 | | slice_unit* sliceunit; |
118 | | thread_task* task; // executing thread_task or NULL if not multi-threaded |
119 | | |
120 | | private: |
121 | | thread_context(const thread_context&); // not allowed |
122 | | const thread_context& operator=(const thread_context&); // not allowed |
123 | | }; |
124 | | |
125 | | |
126 | | |
127 | | class error_queue |
128 | | { |
129 | | public: |
130 | | error_queue(); |
131 | | |
132 | | void add_warning(de265_error warning, bool once); |
133 | | de265_error get_warning(); |
134 | | |
135 | | private: |
136 | | std::mutex m_mutex; |
137 | | de265_error warnings[MAX_WARNINGS]; |
138 | | int nWarnings; |
139 | | de265_error warnings_shown[MAX_WARNINGS]; // warnings that have already occurred |
140 | | int nWarningsShown; |
141 | | }; |
142 | | |
143 | | |
144 | | |
145 | | class slice_unit |
146 | | { |
147 | | public: |
148 | | slice_unit(decoder_context* decctx); |
149 | | ~slice_unit(); |
150 | | |
151 | | NAL_unit* nal; // we are the owner |
152 | | slice_segment_header* shdr; // not the owner (de265_image is owner) |
153 | | bitreader reader; |
154 | | |
155 | | image_unit* imgunit; |
156 | | |
157 | | bool flush_reorder_buffer; |
158 | | |
159 | | |
160 | | // decoding status |
161 | | |
162 | | enum SliceDecodingProgress { Unprocessed, |
163 | | InProgress, |
164 | | Decoded |
165 | | } state; |
166 | | |
167 | | de265_progress_lock finished_threads; |
168 | | int nThreads; |
169 | | |
170 | | int first_decoded_CTB_RS; // TODO |
171 | | int last_decoded_CTB_RS; // TODO |
172 | | |
173 | | void allocate_thread_contexts(int n); |
174 | 0 | thread_context* get_thread_context(int n) { |
175 | 0 | assert(n < nThreadContexts); |
176 | 0 | return &thread_contexts[n]; |
177 | 0 | } |
178 | 0 | int num_thread_contexts() const { return nThreadContexts; } |
179 | | |
180 | | private: |
181 | | thread_context* thread_contexts; /* NOTE: cannot use std::vector, because thread_context has |
182 | | no copy constructor. */ |
183 | | int nThreadContexts; |
184 | | |
185 | | public: |
186 | | decoder_context* ctx; |
187 | | |
188 | | private: |
189 | | slice_unit(const slice_unit&); // not allowed |
190 | | const slice_unit& operator=(const slice_unit&); // not allowed |
191 | | }; |
192 | | |
193 | | |
194 | | class image_unit |
195 | | { |
196 | | public: |
197 | | image_unit(); |
198 | | ~image_unit(); |
199 | | |
200 | | de265_image* img; |
201 | | de265_image sao_output; // if SAO is used, this is allocated and used as SAO output buffer |
202 | | |
203 | | std::vector<slice_unit*> slice_units; |
204 | | std::vector<sei_message> suffix_SEIs; |
205 | | |
206 | 0 | slice_unit* get_next_unprocessed_slice_segment() const { |
207 | 0 | for (size_t i=0;i<slice_units.size();i++) { |
208 | 0 | if (slice_units[i]->state == slice_unit::Unprocessed) { |
209 | 0 | return slice_units[i]; |
210 | 0 | } |
211 | 0 | } |
212 | | |
213 | 0 | return NULL; |
214 | 0 | } |
215 | | |
216 | 0 | slice_unit* get_prev_slice_segment(slice_unit* s) const { |
217 | 0 | for (size_t i=1; i<slice_units.size(); i++) { |
218 | 0 | if (slice_units[i]==s) { |
219 | 0 | return slice_units[i-1]; |
220 | 0 | } |
221 | 0 | } |
222 | | |
223 | 0 | return NULL; |
224 | 0 | } |
225 | | |
226 | 0 | slice_unit* get_next_slice_segment(slice_unit* s) const { |
227 | 0 | for (size_t i=0; i<slice_units.size()-1; i++) { |
228 | 0 | if (slice_units[i]==s) { |
229 | 0 | return slice_units[i+1]; |
230 | 0 | } |
231 | 0 | } |
232 | | |
233 | 0 | return NULL; |
234 | 0 | } |
235 | | |
236 | 0 | void dump_slices() const { |
237 | 0 | for (size_t i=0; i<slice_units.size(); i++) { |
238 | 0 | printf("[%zu] = %p\n",i,slice_units[i]); |
239 | 0 | } |
240 | 0 | } |
241 | | |
242 | 0 | bool all_slice_segments_processed() const { |
243 | 0 | if (slice_units.size()==0) return true; |
244 | 0 | if (slice_units.back()->state != slice_unit::Unprocessed) return true; |
245 | 0 | return false; |
246 | 0 | } |
247 | | |
248 | 0 | bool is_first_slice_segment(const slice_unit* s) const { |
249 | 0 | if (slice_units.size()==0) return false; |
250 | 0 | return (slice_units[0] == s); |
251 | 0 | } |
252 | | |
253 | | enum { Invalid, // headers not read yet |
254 | | Unknown, // SPS/PPS available |
255 | | Reference, // will be used as reference |
256 | | Leaf // not a reference picture |
257 | | } role; |
258 | | |
259 | | enum { Unprocessed, |
260 | | InProgress, |
261 | | Decoded, |
262 | | Dropped // will not be decoded |
263 | | } state; |
264 | | |
265 | | std::vector<thread_task*> tasks; // we are the owner |
266 | | |
267 | | /* Saved context models for WPP. |
268 | | There is one saved model for the initialization of each CTB row. |
269 | | The array is unused for non-WPP streams. */ |
270 | | std::vector<context_model_table> ctx_models; // TODO: move this into image ? |
271 | | }; |
272 | | |
273 | | |
274 | | class base_context : public error_queue |
275 | | { |
276 | | public: |
277 | | base_context(); |
278 | 843 | virtual ~base_context() { } |
279 | | |
280 | | // --- accelerated DSP functions --- |
281 | | |
282 | | void set_acceleration_functions(enum de265_acceleration); |
283 | | |
284 | | struct acceleration_functions acceleration; // CPU optimized functions |
285 | | |
286 | | //virtual /* */ de265_image* get_image(uint16_t dpb_index) { return dpb.get_image(dpb_index); } |
287 | | virtual const de265_image* get_image(uint16_t frame_id) const = 0; |
288 | | virtual bool has_image(uint16_t frame_id) const = 0; |
289 | | }; |
290 | | |
291 | | |
292 | | class decoder_context : public base_context { |
293 | | public: |
294 | | decoder_context(); |
295 | | ~decoder_context(); |
296 | | |
297 | | de265_error start_thread_pool(int nThreads); |
298 | | void stop_thread_pool(); |
299 | | |
300 | | void reset(); |
301 | | |
302 | 785 | bool has_sps(int id) const { return (bool)sps[id]; } |
303 | 442 | bool has_pps(int id) const { return (bool)pps[id]; } |
304 | | |
305 | 447 | std::shared_ptr<const seq_parameter_set> get_shared_sps(int id) { return sps[id]; } |
306 | 130 | std::shared_ptr<const pic_parameter_set> get_shared_pps(int id) { return pps[id]; } |
307 | | |
308 | 72 | /* */ seq_parameter_set* get_sps(int id) { return sps[id].get(); } |
309 | 0 | const seq_parameter_set* get_sps(int id) const { return sps[id].get(); } |
310 | 35 | /* */ pic_parameter_set* get_pps(int id) { return pps[id].get(); } |
311 | 0 | const pic_parameter_set* get_pps(int id) const { return pps[id].get(); } |
312 | | |
313 | | /* |
314 | | const slice_segment_header* get_SliceHeader_atCtb(int ctb) { |
315 | | return img->slices[img->get_SliceHeaderIndex_atIndex(ctb)]; |
316 | | } |
317 | | */ |
318 | | |
319 | 255 | uint8_t get_nal_unit_type() const { return nal_unit_type; } |
320 | 483 | bool get_RapPicFlag() const { return RapPicFlag; } |
321 | | |
322 | | de265_error decode_NAL(NAL_unit* nal); |
323 | | |
324 | | de265_error decode(int* more); |
325 | | de265_error decode_some(bool* did_work); |
326 | | |
327 | | de265_error decode_slice_unit_sequential(image_unit* imgunit, slice_unit* sliceunit); |
328 | | de265_error decode_slice_unit_parallel(image_unit* imgunit, slice_unit* sliceunit); |
329 | | de265_error decode_slice_unit_WPP(image_unit* imgunit, slice_unit* sliceunit); |
330 | | de265_error decode_slice_unit_tiles(image_unit* imgunit, slice_unit* sliceunit); |
331 | | |
332 | | |
333 | | void process_nal_hdr(nal_header*); |
334 | | |
335 | | bool process_slice_segment_header(slice_segment_header*, |
336 | | de265_error*, de265_PTS pts, |
337 | | nal_header* nal_hdr, void* user_data); |
338 | | |
339 | | //void push_current_picture_to_output_queue(); |
340 | | de265_error push_picture_to_output_queue(image_unit*); |
341 | | |
342 | | |
343 | | // --- parameters --- |
344 | | |
345 | | bool param_sei_check_hash; |
346 | | bool param_conceal_stream_errors; |
347 | | bool param_suppress_faulty_pictures; |
348 | | |
349 | | int param_sps_headers_fd; |
350 | | int param_vps_headers_fd; |
351 | | int param_pps_headers_fd; |
352 | | int param_slice_headers_fd; |
353 | | |
354 | | bool param_disable_deblocking; |
355 | | bool param_disable_sao; |
356 | | //bool param_disable_mc_residual_idct; // not implemented yet |
357 | | //bool param_disable_intra_residual_idct; // not implemented yet |
358 | | |
359 | | void set_image_allocation_functions(de265_image_allocation* allocfunc, void* userdata); |
360 | | |
361 | | de265_image_allocation param_image_allocation_functions; |
362 | | void* param_image_allocation_userdata; |
363 | | |
364 | | |
365 | | // --- input stream data --- |
366 | | |
367 | | NAL_Parser nal_parser; |
368 | | |
369 | | |
370 | 843 | int get_num_worker_threads() const { return num_worker_threads; } |
371 | | |
372 | 0 | /* */ de265_image* get_image(uint16_t dpb_index) { return dpb.get_image(dpb_index); } |
373 | 0 | const de265_image* get_image(uint16_t dpb_index) const override { return dpb.get_image(dpb_index); } |
374 | | |
375 | 0 | bool has_image(uint16_t dpb_index) const override { return dpb_index<dpb.size(); } |
376 | | |
377 | 0 | de265_image* get_next_picture_in_output_queue() { return dpb.get_next_picture_in_output_queue(); } |
378 | 105k | int num_pictures_in_output_queue() const { return dpb.num_pictures_in_output_queue(); } |
379 | 0 | void pop_next_picture_in_output_queue() { dpb.pop_next_picture_in_output_queue(); } |
380 | | |
381 | | private: |
382 | | de265_error read_vps_NAL(bitreader&); |
383 | | de265_error read_sps_NAL(bitreader&); |
384 | | de265_error read_pps_NAL(bitreader&); |
385 | | de265_error read_sei_NAL(bitreader& reader, bool suffix); |
386 | | de265_error read_eos_NAL(bitreader& reader); |
387 | | de265_error read_slice_NAL(bitreader&, NAL_unit* nal, nal_header& nal_hdr); |
388 | | |
389 | | private: |
390 | | // --- internal data --- |
391 | | |
392 | | std::shared_ptr<video_parameter_set> vps[ DE265_MAX_VPS_SETS ]; |
393 | | std::shared_ptr<seq_parameter_set> sps[ DE265_MAX_SPS_SETS ]; |
394 | | std::shared_ptr<pic_parameter_set> pps[ DE265_MAX_PPS_SETS ]; |
395 | | |
396 | | std::shared_ptr<video_parameter_set> current_vps; |
397 | | std::shared_ptr<seq_parameter_set> current_sps; |
398 | | std::shared_ptr<pic_parameter_set> current_pps; |
399 | | |
400 | | public: |
401 | | thread_pool thread_pool_; |
402 | | |
403 | | private: |
404 | | int num_worker_threads; |
405 | | |
406 | | |
407 | | public: |
408 | | // --- frame dropping --- |
409 | | |
410 | | void set_limit_TID(int tid); |
411 | | int get_highest_TID() const; |
412 | 0 | int get_current_TID() const { return current_HighestTid; } |
413 | | int change_framerate(int more_vs_less); // 1: more, -1: less |
414 | | void set_framerate_ratio(int percent); |
415 | | |
416 | | private: |
417 | | // input parameters |
418 | | int limit_HighestTid; // never switch to a layer above this one |
419 | | int framerate_ratio; |
420 | | |
421 | | // current control parameters |
422 | | int goal_HighestTid; // this is the layer we want to decode at |
423 | | int layer_framerate_ratio; // ratio of frames to keep in the current layer |
424 | | |
425 | | int current_HighestTid; // the layer which we are currently decoding |
426 | | |
427 | | struct { |
428 | | int8_t tid; |
429 | | int8_t ratio; |
430 | | } framedrop_tab[100+1]; |
431 | | int framedrop_tid_index[6+1]; |
432 | | |
433 | | void compute_framedrop_table(); |
434 | | void calc_tid_and_framerate_ratio(); |
435 | | |
436 | | private: |
437 | | // --- decoded picture buffer --- |
438 | | |
439 | | decoded_picture_buffer dpb; |
440 | | |
441 | | int current_image_poc_lsb; |
442 | | bool first_decoded_picture; |
443 | | bool NoRaslOutputFlag; |
444 | | bool HandleCraAsBlaFlag; |
445 | | bool FirstAfterEndOfSequenceNAL; |
446 | | |
447 | | int PicOrderCntMsb; |
448 | | int prevPicOrderCntLsb; // at precTid0Pic |
449 | | int prevPicOrderCntMsb; // at precTid0Pic |
450 | | |
451 | | de265_image* img; |
452 | | |
453 | | public: |
454 | | const slice_segment_header* previous_slice_header; /* Remember the last slice for a successive |
455 | | dependent slice. */ |
456 | | |
457 | | |
458 | | // --- motion compensation --- |
459 | | |
460 | | public: |
461 | | int PocLsbLt[MAX_NUM_REF_PICS]; |
462 | | int UsedByCurrPicLt[MAX_NUM_REF_PICS]; |
463 | | int DeltaPocMsbCycleLt[MAX_NUM_REF_PICS]; |
464 | | private: |
465 | | int CurrDeltaPocMsbPresentFlag[MAX_NUM_REF_PICS]; |
466 | | int FollDeltaPocMsbPresentFlag[MAX_NUM_REF_PICS]; |
467 | | |
468 | | // The number of entries in the lists below. |
469 | | int NumPocStCurrBefore; |
470 | | int NumPocStCurrAfter; |
471 | | int NumPocStFoll; |
472 | | int NumPocLtCurr; |
473 | | int NumPocLtFoll; |
474 | | |
475 | | // These lists contain absolute POC values. |
476 | | int PocStCurrBefore[MAX_NUM_REF_PICS]; // used for reference in current picture, smaller POC |
477 | | int PocStCurrAfter[MAX_NUM_REF_PICS]; // used for reference in current picture, larger POC |
478 | | int PocStFoll[MAX_NUM_REF_PICS]; // not used for reference in current picture, but in future picture |
479 | | int PocLtCurr[MAX_NUM_REF_PICS]; // used in current picture |
480 | | int PocLtFoll[MAX_NUM_REF_PICS]; // used in some future picture |
481 | | |
482 | | // These lists contain indices into the DPB. |
483 | | int RefPicSetStCurrBefore[MAX_NUM_REF_PICS]; |
484 | | int RefPicSetStCurrAfter[MAX_NUM_REF_PICS]; |
485 | | int RefPicSetStFoll[MAX_NUM_REF_PICS]; |
486 | | int RefPicSetLtCurr[MAX_NUM_REF_PICS]; |
487 | | int RefPicSetLtFoll[MAX_NUM_REF_PICS]; |
488 | | |
489 | | |
490 | | // --- parameters derived from parameter sets --- |
491 | | |
492 | | // NAL |
493 | | |
494 | | uint8_t nal_unit_type; |
495 | | |
496 | | char IdrPicFlag; |
497 | | char RapPicFlag; |
498 | | |
499 | | |
500 | | // --- image unit queue --- |
501 | | |
502 | | std::vector<image_unit*> image_units; |
503 | | |
504 | | bool flush_reorder_buffer_at_this_frame; |
505 | | |
506 | | private: |
507 | | void init_thread_context(thread_context* tctx); |
508 | | void add_task_decode_CTB_row(thread_context* tctx, bool firstSliceSubstream, int ctbRow); |
509 | | void add_task_decode_slice_segment(thread_context* tctx, bool firstSliceSubstream, |
510 | | int ctbX,int ctbY); |
511 | | |
512 | | void mark_whole_slice_as_processed(image_unit* imgunit, |
513 | | slice_unit* sliceunit, |
514 | | int progress); |
515 | | |
516 | | void process_picture_order_count(slice_segment_header* hdr); |
517 | | |
518 | | /* |
519 | | If there is no space for a new image, returns the negative value of an de265_error. |
520 | | I.e. you can check for error by return_value<0, which is error (-return_value); |
521 | | */ |
522 | | int generate_unavailable_reference_picture(const seq_parameter_set* sps, |
523 | | int POC, bool longTerm); |
524 | | de265_error process_reference_picture_set(slice_segment_header* hdr); |
525 | | bool construct_reference_picture_lists(slice_segment_header* hdr); |
526 | | |
527 | | |
528 | | void remove_images_from_dpb(const std::vector<int>& removeImageList); |
529 | | void run_postprocessing_filters_sequential(struct de265_image* img); |
530 | | void run_postprocessing_filters_parallel(image_unit* img); |
531 | | }; |
532 | | |
533 | | |
534 | | #endif |