/******************************************************************************
*
* Copyright (C) 2015 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at:
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*****************************************************************************
* Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
*/
/**
*******************************************************************************
* @file
* ih264e_process.h
*
* @brief
* Contains functions for codec thread
*
* @author
* ittiam
*
* @remarks
* None
*
*******************************************************************************
*/
#ifndef IH264E_PROCESS_H_
#define IH264E_PROCESS_H_
/*****************************************************************************/
/* Function Declarations */
/*****************************************************************************/
/**
******************************************************************************
*
* @brief This function generates sps, pps set on request
*
* @par Description
* When the encoder is set in header generation mode, the following function
* is called. This generates sps and pps headers and returns the control back
* to caller.
*
* @param[in] ps_codec
* pointer to codec context
*
* @return success or failure error code
*
******************************************************************************
*/
IH264E_ERROR_T ih264e_generate_sps_pps
(
codec_t *ps_codec
);
/**
*******************************************************************************
*
* @brief initialize entropy context.
*
* @par Description:
* Before invoking the call to perform to entropy coding the entropy context
* associated with the job needs to be initialized. This involves the start
* mb address, end mb address, slice index and the pointer to location at
* which the mb residue info and mb header info are packed.
*
* @param[in] ps_proc
* Pointer to the current process context
*
* @returns error status
*
* @remarks none
*
*******************************************************************************
*/
IH264E_ERROR_T ih264e_init_entropy_ctxt(process_ctxt_t *ps_proc);
/**
*******************************************************************************
*
* @brief entry point for entropy coding
*
* @par Description
* This function calls lower level functions to perform entropy coding for a
* group (n rows) of mb's. After encoding 1 row of mb's, the function takes
* back the control, updates the ctxt and calls lower level functions again.
* This process is repeated till all the rows or group of mb's (which ever is
* minimum) are coded
*
* @param[in] ps_proc
* process context
*
* @returns error status
*
* @remarks
* NOTE : It is assumed that this routine is invoked at the start of a slice,
* so the slice header is generated by default.
*
*******************************************************************************
*/
IH264E_ERROR_T ih264e_entropy(process_ctxt_t *ps_proc);
/**
*******************************************************************************
*
* @brief Packs header information of a mb in to a buffer
*
* @par Description:
* After the deciding the mode info of a macroblock, the syntax elements
* associated with the mb are packed and stored. The entropy thread unpacks
* this buffer and generates the end bit stream.
*
* @param[in] ps_proc
* Pointer to the current process context
*
* @returns error status
*
* @remarks none
*
*******************************************************************************
*/
IH264E_ERROR_T ih264e_pack_header_data
(
process_ctxt_t *ps_proc
);
/**
*******************************************************************************
*
* @brief update process context after encoding an mb. This involves preserving
* the current mb information for later use, initialize the proc ctxt elements to
* encode next mb.
*
* @par Description:
* This function performs house keeping tasks after encoding an mb.
* After encoding an mb, various elements of the process context needs to be
* updated to encode the next mb. For instance, the source, recon and reference
* pointers, mb indices have to be adjusted to the next mb. The slice index of
* the current mb needs to be updated. If mb qp modulation is enabled, then if
* the qp changes the quant param structure needs to be updated. Also to encoding
* the next mb, the current mb info is used as part of mode prediction or mv
* prediction. Hence the current mb info has to preserved at top/top left/left
* locations.
*
* @param[in] ps_proc
* Pointer to the current process context
*
* @returns none
*
* @remarks none
*
*******************************************************************************
*/
WORD32 ih264e_update_proc_ctxt
(
process_ctxt_t *ps_proc
);
/**
*******************************************************************************
*
* @brief initialize process context.
*
* @par Description:
* Before dispatching the current job to process thread, the process context
* associated with the job is initialized. Usually every job aims to encode one
* row of mb's. Basing on the row indices provided by the job, the process
* context's buffer ptrs, slice indices and other elements that are necessary
* during core-coding are initialized.
*
* @param[in] ps_proc
* Pointer to the current process context
*
* @returns error status
*
* @remarks none
*
*******************************************************************************
*/
IH264E_ERROR_T ih264e_init_proc_ctxt(process_ctxt_t *ps_proc);
/**
*******************************************************************************
*
* @brief This function performs luma & chroma padding
*
* @par Description:
*
* @param[in] ps_proc
* Process context corresponding to the job
*
* @param[in] pu1_curr_pic_luma
* Pointer to luma buffer
*
* @param[in] pu1_curr_pic_chroma
* Pointer to chroma buffer
*
* @param[in] i4_mb_x
* mb index x
*
* @param[in] i4_mb_y
* mb index y
*
* @param[in] i4_pad_ht
* number of rows to be padded
*
* @returns error status
*
* @remarks none
*
*******************************************************************************
*/
IH264E_ERROR_T ih264e_pad_recon_buffer
(
process_ctxt_t *ps_proc,
UWORD8 *pu1_curr_pic_luma,
UWORD8 *pu1_curr_pic_chroma,
WORD32 i4_mb_x,
WORD32 i4_mb_y,
WORD32 i4_pad_ht
);
/**
*******************************************************************************
*
* @brief This function performs luma half pel planes generation
*
* @par Description:
*
* @param[in] ps_proc
* Process context corresponding to the job
*
* @returns error status
*
* @remarks none
*
*******************************************************************************
*/
IH264E_ERROR_T ih264e_halfpel_generation
(
process_ctxt_t *ps_proc,
UWORD8 *pu1_curr_pic_luma,
WORD32 i4_mb_x,
WORD32 i4_mb_y
);
/**
*******************************************************************************
*
* @brief This function performs luma & chroma core coding for a set of mb's.
*
* @par Description:
* The mb to be coded is taken and is evaluated over a predefined set of modes
* (intra (i16, i4, i8)/inter (mv, skip)) for best cost. The mode with least cost
* is selected and using intra/inter prediction filters, prediction is carried out.
* The deviation between src and pred signal constitutes error signal. This error
* signal is transformed (hierarchical transform if necessary) and quantized. The
* quantized residue is packed in to entropy buffer for entropy coding. This is
* repeated for all the mb's enlisted under the job.
*
* @param[in] ps_proc
* Process context corresponding to the job
*
* @returns error status
*
* @remarks none
*
*******************************************************************************
*/
WORD32 ih264e_process(process_ctxt_t *ps_proc);
/**
*******************************************************************************
*
* @brief
* Function to update rc context after encoding
*
* @par Description
* This function updates the rate control context after the frame is encoded.
* Number of bits consumed by the current frame, frame distortion, frame cost,
* number of intra/inter mb's, ... are passed on to rate control context for
* updating the rc model.
*
* @param[in] ps_codec
* Handle to codec context
*
* @param[in] ctxt_sel
* frame context selector
*
* @param[in] pic_cnt
* pic count
*
* @returns i4_stuffing_byte
* number of stuffing bytes (if necessary)
*
* @remarks
*
*******************************************************************************
*/
WORD32 ih264e_update_rc_post_enc(codec_t *ps_codec, WORD32 ctxt_sel, WORD32 pic_cnt);
/**
*******************************************************************************
*
* @brief
* entry point of a spawned encoder thread
*
* @par Description:
* The encoder thread dequeues a proc/entropy job from the encoder queue and
* calls necessary routines.
*
* @param[in] pv_proc
* Process context corresponding to the thread
*
* @returns error status
*
* @remarks
*
*******************************************************************************
*/
WORD32 ih264e_process_thread(void *pv_proc);
#endif /* IH264E_PROCESS_H_ */