00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #include "global.h"
00018
00019 #include "rdopt_coding_state.h"
00020 #include "cabac.h"
00021
00022
00023
00024
00025
00026
00027
00028 void delete_coding_state (CSptr cs)
00029 {
00030 if (cs != NULL)
00031 {
00032
00033 if (cs->encenv != NULL) free (cs->encenv);
00034 if (cs->bitstream != NULL) free (cs->bitstream);
00035
00036
00037 delete_contexts_MotionInfo (cs->mot_ctx);
00038 delete_contexts_TextureInfo (cs->tex_ctx);
00039
00040
00041 free (cs);
00042 cs=NULL;
00043 }
00044 }
00045
00046
00047
00048
00049
00050
00051
00052
00053 CSptr create_coding_state ()
00054 {
00055 CSptr cs;
00056
00057
00058 if ((cs = (CSptr) calloc (1, sizeof(CSobj))) == NULL)
00059 no_mem_exit("init_coding_state: cs");
00060
00061
00062 cs->no_part = params->partition_mode==0?1:3;
00063 if (params->symbol_mode == CABAC)
00064 {
00065 if ((cs->encenv = (EncodingEnvironment*) calloc (cs->no_part, sizeof(EncodingEnvironment))) == NULL)
00066 no_mem_exit("init_coding_state: cs->encenv");
00067 }
00068 else
00069 {
00070 cs->encenv = NULL;
00071 }
00072 if ((cs->bitstream = (Bitstream*) calloc (cs->no_part, sizeof(Bitstream))) == NULL)
00073 no_mem_exit("init_coding_state: cs->bitstream");
00074
00075
00076 cs->symbol_mode = params->symbol_mode;
00077 if (cs->symbol_mode == CABAC)
00078 {
00079 cs->mot_ctx = create_contexts_MotionInfo ();
00080 cs->tex_ctx = create_contexts_TextureInfo();
00081 }
00082 else
00083 {
00084 cs->mot_ctx = NULL;
00085 cs->tex_ctx = NULL;
00086 }
00087
00088 return cs;
00089 }
00090
00091
00092
00093
00094
00095
00096
00097
00098 void store_coding_state (Slice *currSlice, Macroblock *currMB, CSptr cs)
00099 {
00100 int i;
00101 int i_last = img->currentPicture->idr_flag? 1:cs->no_part;
00102
00103 if (!params->rdopt) return;
00104
00105 if (cs->symbol_mode==CABAC)
00106 {
00107
00108
00109 for (i = 0; i < i_last; i++)
00110 {
00111 cs->encenv[i] = currSlice->partArr[i].ee_cabac;
00112 cs->bitstream[i] = *currSlice->partArr[i].bitstream;
00113 }
00114
00115
00116 *cs->mot_ctx = *currSlice->mot_ctx;
00117 *cs->tex_ctx = *currSlice->tex_ctx;
00118 }
00119 else
00120 {
00121
00122 for (i = 0; i < i_last; i++)
00123 {
00124 cs->bitstream[i] = *currSlice->partArr[i].bitstream;
00125 }
00126 }
00127
00128 memcpy (cs->bitcounter, currMB->bitcounter, MAX_BITCOUNTER_MB * sizeof(int));
00129
00130
00131 memcpy (cs->mvd, currMB->mvd, BLOCK_CONTEXT * sizeof(short));
00132 memcpy (cs->cbp_bits, currMB->cbp_bits, 3 * sizeof(int64));
00133
00134 if (img->P444_joined)
00135 memcpy (cs->cbp_bits_8x8, currMB->cbp_bits_8x8, 3 * sizeof(int64));
00136 }
00137
00138
00139
00140
00141
00142
00143
00144
00145 void reset_coding_state (Slice *currSlice, Macroblock *currMB, CSptr cs)
00146 {
00147 int i;
00148 int i_last = img->currentPicture->idr_flag? 1:cs->no_part;
00149
00150 if (!params->rdopt) return;
00151
00152 if (cs->symbol_mode==CABAC)
00153 {
00154
00155
00156 for (i = 0; i < i_last; i++)
00157 {
00158
00159 currSlice->partArr[i].ee_cabac = cs->encenv[i];
00160 *currSlice->partArr[i].bitstream = cs->bitstream[i];
00161 }
00162
00163
00164 *currSlice->mot_ctx = *cs->mot_ctx;
00165 *currSlice->tex_ctx = *cs->tex_ctx;
00166 }
00167 else
00168 {
00169
00170
00171 for (i = 0; i < i_last; i++)
00172 {
00173
00174 *currSlice->partArr[i].bitstream = cs->bitstream[i];
00175 }
00176 }
00177
00178
00179 memcpy (currMB->bitcounter, cs->bitcounter, MAX_BITCOUNTER_MB * sizeof(int));
00180
00181
00182 memcpy (currMB->mvd, cs->mvd, BLOCK_CONTEXT * sizeof(short));
00183 memcpy (currMB->cbp_bits, cs->cbp_bits, 3 * sizeof(int64));
00184 if(img->P444_joined)
00185 memcpy (currMB->cbp_bits_8x8, cs->cbp_bits_8x8, 3 * sizeof(int64));
00186 }
00187
00188