/* * H.265 video codec. * Copyright (c) 2013-2014 struktur AG, Dirk Farin <farin@struktur.de> * * Authors: Dirk Farin <farin@struktur.de> * * This file is part of libde265. * * libde265 is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation, either version 3 of * the License, or (at your option) any later version. * * libde265 is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with libde265. If not, see <http://www.gnu.org/licenses/>. */ #ifndef ENCODER_CONTEXT_H #define ENCODER_CONTEXT_H #include "libde265/image.h" #include "libde265/decctx.h" #include "libde265/image-io.h" #include "libde265/encoder/encoder-params.h" #include "libde265/encoder/encpicbuf.h" #include "libde265/encoder/sop.h" #include "libde265/en265.h" #include "libde265/util.h" #include <memory> class encoder_context : public base_context { public: encoder_context(); ~encoder_context(); virtual const de265_image* get_image(int frame_id) const { return picbuf.get_picture(frame_id)->reconstruction; } virtual bool has_image(int frame_id) const { return picbuf.has_picture(frame_id); } bool encoder_started; encoder_params params; config_parameters params_config; EncoderCore_Custom algo; int image_width, image_height; bool image_spec_is_defined; // whether we know the input image size void* param_image_allocation_userdata; void (*release_func)(en265_encoder_context*, de265_image*, void* userdata); //error_queue errqueue; //acceleration_functions accel; // quick links de265_image* img; // reconstruction //de265_image* prediction; image_data* imgdata; // input image slice_segment_header* shdr; CTBTreeMatrix ctbs; // temporary memory for motion compensated pixels (when CB-algo passes this down to TB-algo) //uint8_t prediction[3][64*64]; // stride: 1<<(cb->log2Size) //int prediction_x0,prediction_y0; int active_qp; // currently active QP /*int target_qp;*/ /* QP we want to code at. (Not actually the real QP. Check image.get_QPY() for that.) */ const seq_parameter_set& get_sps() const { return *sps; } const pic_parameter_set& get_pps() const { return *pps; } seq_parameter_set& get_sps() { return *sps; } pic_parameter_set& get_pps() { return *pps; } std::shared_ptr<video_parameter_set>& get_shared_vps() { return vps; } std::shared_ptr<seq_parameter_set>& get_shared_sps() { return sps; } std::shared_ptr<pic_parameter_set>& get_shared_pps() { return pps; } private: std::shared_ptr<video_parameter_set> vps; std::shared_ptr<seq_parameter_set> sps; std::shared_ptr<pic_parameter_set> pps; //slice_segment_header shdr; public: bool parameters_have_been_set; bool headers_have_been_sent; encoder_picture_buffer picbuf; std::shared_ptr<sop_creator> sop; std::deque<en265_packet*> output_packets; // --- rate-control --- float lambda; // --- CABAC output and rate estimation --- //CABAC_encoder* cabac; // currently active CABAC output (estim or bitstream) //context_model_table2* ctx_model; // currently active ctx models (estim or bitstream) // CABAC bitstream writer CABAC_encoder_bitstream cabac_encoder; context_model_table cabac_ctx_models; //std::shared_ptr<CABAC_encoder> cabac_estim; bool use_adaptive_context; /*** TODO: CABAC_encoder direkt an encode-Funktion übergeben, anstatt hier aussenrum zwischenzuspeichern (mit undefinierter Lifetime). Das Context-Model kann dann gleich mit in den Encoder rein cabac_encoder(ctxtable). write_bits() wird dann mit dem context-index aufgerufen, nicht mit dem model direkt. ***/ /* void switch_CABAC(context_model_table2* model) { cabac = cabac_estim.get(); ctx_model = model; } void switch_CABAC_to_bitstream() { cabac = &cabac_bitstream; ctx_model = &ctx_model_bitstream; } */ en265_packet* create_packet(en265_packet_content_type t); // --- encoding control --- void start_encoder(); de265_error encode_headers(); de265_error encode_picture_from_input_buffer(); // Input images can be released after encoding and when the output packet is released. // This is important to do as soon as possible, as the image might actually wrap // scarce resources like camera picture buffers. // This function does release (only) the raw input data. void release_input_image(int frame_number) { picbuf.release_input_image(frame_number); } void mark_image_is_outputted(int frame_number) { picbuf.mark_image_is_outputted(frame_number); } }; #endif