blob: b8e3d1b8854bb185c28e722ca96599966a76a1b2 [file] [log] [blame]
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301/******************************************************************************
2 *
3 * Copyright (C) 2015 The Android Open Source Project
4 *
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at:
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 *
17 *****************************************************************************
18 * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
19*/
20
21/*****************************************************************************/
22/* File Includes */
23/*****************************************************************************/
24
25/* User include files */
26#include "irc_datatypes.h"
27#include "irc_cntrl_param.h"
28#include "irc_mem_req_and_acq.h"
29#include "irc_mb_model_based.h"
30
31typedef struct mb_rate_control_t
32{
33 /* Frame Qp */
34 UWORD8 u1_frm_qp;
35
36 /*
37 * Estimated average activity for the current frame (updated with the
38 * previous frame activity since it is independent of picture type whether
39 * it is I or P)
40 */
41 WORD32 i4_avg_activity;
42
43} mb_rate_control_t;
44
45WORD32 irc_mbrc_num_fill_use_free_memtab(mb_rate_control_t **pps_mb_rate_control,
46 itt_memtab_t *ps_memtab,
47 ITT_FUNC_TYPE_E e_func_type)
48{
49 WORD32 i4_mem_tab_idx = 0;
Martin Storsjo73136022015-06-23 14:51:06 +030050 mb_rate_control_t s_mb_rate_control_temp;
Hamsalekha S8d3d3032015-03-13 21:24:58 +053051
52 /*
53 * Hack for al alloc, during which we don't have any state memory.
54 * Dereferencing can cause issues
55 */
56 if(e_func_type == GET_NUM_MEMTAB || e_func_type == FILL_MEMTAB)
57 {
58 (*pps_mb_rate_control) = &s_mb_rate_control_temp;
59 }
60
61 /*For src rate control state structure*/
62 if(e_func_type != GET_NUM_MEMTAB)
63 {
64 fill_memtab(&ps_memtab[i4_mem_tab_idx], sizeof(mb_rate_control_t),
65 ALIGN_128_BYTE, PERSISTENT, DDR);
66 use_or_fill_base(&ps_memtab[0], (void**)pps_mb_rate_control,
67 e_func_type);
68 }
69 i4_mem_tab_idx++;
70
71 return (i4_mem_tab_idx);
72}
73
74/*******************************************************************************
75 MB LEVEL API FUNCTIONS
76 ******************************************************************************/
77
78/******************************************************************************
79 Description : Initialize the mb model and the average activity to default
80 values
81 ******************************************************************************/
82void irc_init_mb_level_rc(mb_rate_control_t *ps_mb_rate_control)
83{
84 /* Set values to default */
85 ps_mb_rate_control->i4_avg_activity = 0;
86}
87
88/******************************************************************************
89 Description : Initialize the mb state with frame level decisions
90 *********************************************************************************/
91void irc_mb_init_frame_level(mb_rate_control_t *ps_mb_rate_control,
92 UWORD8 u1_frame_qp)
93{
94 /* Update frame level QP */
95 ps_mb_rate_control->u1_frm_qp = u1_frame_qp;
96}
97
98/******************************************************************************
99 Description : Reset the mb activity - Whenever there is SCD
100 the mb activity is reset
101 *********************************************************************************/
102void irc_reset_mb_activity(mb_rate_control_t *ps_mb_rate_control)
103{
104 ps_mb_rate_control->i4_avg_activity = 0;
105}
106
107/******************************************************************************
108 Description : Calculates the mb level qp
109 *********************************************************************************/
110void irc_get_mb_qp(mb_rate_control_t *ps_mb_rate_control,
111 WORD32 i4_cur_mb_activity,
112 WORD32 *pi4_mb_qp)
113{
114 WORD32 i4_qp;
115 /* Initialize the mb level qp with the frame level qp */
116 i4_qp = ps_mb_rate_control->u1_frm_qp;
117
118 /*
119 * Store the model based QP - This is used for updating the rate control model
120 */
121 pi4_mb_qp[0] = i4_qp;
122
123 /* Modulate the Qp based on the activity */
124 if((ps_mb_rate_control->i4_avg_activity) && (i4_qp < 100))
125 {
126 i4_qp =((((2 * i4_cur_mb_activity))
127 + ps_mb_rate_control->i4_avg_activity)* i4_qp
128 + ((i4_cur_mb_activity + 2 * ps_mb_rate_control->i4_avg_activity)
129 >> 1))/ (i4_cur_mb_activity + 2 * ps_mb_rate_control->i4_avg_activity);
130
131 if(i4_qp > ((3 * ps_mb_rate_control->u1_frm_qp) >> 1))
132 {
133 i4_qp = ((3 * ps_mb_rate_control->u1_frm_qp) >> 1);
134 }
135 }
136
137 /* Store the qp modulated by mb activity - This is used for encoding the MB */
138 pi4_mb_qp[1] = i4_qp;
139}
140
141/*******************************************************************************
142 Description : Returns the stored frame level QP
143 ******************************************************************************/
144UWORD8 irc_get_frm_level_qp(mb_rate_control_t *ps_mb_rate_control)
145{
146 return (ps_mb_rate_control->u1_frm_qp);
147}
148
149/*******************************************************************************
150 Description : Update the frame level info collected
151 ******************************************************************************/
152void irc_mb_update_frame_level(mb_rate_control_t *ps_mb_rate_control,
153 WORD32 i4_avg_activity)
154{
155 /* Update the Average Activity */
156 ps_mb_rate_control->i4_avg_activity = i4_avg_activity;
157}