335 lines
9.6 KiB
C
335 lines
9.6 KiB
C
|
/******************************************************************************
|
||
|
*
|
||
|
* 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_ */
|