Changeset 837 in 3DVCSoftware


Ignore:
Timestamp:
8 Feb 2014, 00:23:11 (11 years ago)
Author:
tech
Message:

Merged HM 13.0. (No yet checked).

Location:
branches/HTM-10.0rc1-dev0
Files:
2 added
179 edited

Legend:

Unmodified
Added
Removed
  • branches/HTM-10.0rc1-dev0/COPYING

    r56 r837  
    44granted under this license.   
    55
    6 Copyright (c) 2010-2012, ITU/ISO/IEC
     6Copyright (c) 2010-2014, ITU/ISO/IEC
    77All rights reserved.
    88
  • branches/HTM-10.0rc1-dev0/HM.xcodeproj/project.pbxproj

    r608 r837  
    10841084                                HEADER_SEARCH_PATHS = source/Lib;
    10851085                                ONLY_ACTIVE_ARCH = YES;
    1086                                 SDKROOT = macosx;
     1086                                SDKROOT = "";
    10871087                        };
    10881088                        name = Debug;
     
    10981098                                GCC_WARN_UNUSED_VARIABLE = YES;
    10991099                                HEADER_SEARCH_PATHS = source/Lib;
    1100                                 SDKROOT = macosx;
     1100                                SDKROOT = "";
    11011101                        };
    11021102                        name = Release;
  • branches/HTM-10.0rc1-dev0/build/linux/common/makefile.base

    r608 r837  
    1414
    1515CPP     = g++
     16CC      = gcc
    1617AR      = ar
    1718LD      = $(CPP)
     
    4748# default cpp flags for all configurations
    4849#CPPFLAGS          = -Wall -fPIC $(DEFS) -I$(CURDIR)/$(INC_DIR) $(USER_INC_DIRS)
    49 CPPFLAGS          = -fPIC $(DEFS) $(ADDDEFS) -I$(CURDIR)/$(INC_DIR) $(USER_INC_DIRS) -Wall -Wshadow -Wno-sign-compare -Werror
     50CPPFLAGS          = -fPIC $(DEFS) -I$(CURDIR)/$(INC_DIR) $(USER_INC_DIRS) -Wall -Wshadow -Wno-sign-compare -Werror
    5051
    5152##########
     
    6364#
    6465# release cpp
    65 RELEASE_CPPFLAGS  =  -O3 -ffloat-store -Wuninitialized
     66RELEASE_CPPFLAGS  =  -O3 -Wuninitialized
    6667
    6768
     
    208209                rm -f $(OBJ_DIR)/$*.d.d
    209210endef
     211define COMPILE_AND_DEPEND_RELEASE_C
     212        $(CC) -c -MMD -MF $(OBJ_DIR)/$*.r.d -MT $(OBJ_DIR)/$*.r.o $(CPPFLAGS) $(RELEASE_CPPFLAGS) -o $@ $(CURDIR)/$<
     213        @cp $(OBJ_DIR)/$*.r.d $(OBJ_DIR)/$*.r.P; \
     214                sed -e 's/#.*//' -e 's/^[^:]*: *//' -e 's/ *\\$$//' \
     215                -e '/^$$/ d' -e 's/$$/ :/' < $(OBJ_DIR)/$*.r.d >> $(OBJ_DIR)/$*.r.P; \
     216                rm -f $(OBJ_DIR)/$*.r.d
     217endef
     218define COMPILE_AND_DEPEND_DEBUG_C
     219        $(CC) -c -MMD -MF $(OBJ_DIR)/$*.d.d -MT $(OBJ_DIR)/$*.d.o $(CPPFLAGS) $(DEBUG_CPPFLAGS) -o $@ $(CURDIR)/$<
     220        @cp $(OBJ_DIR)/$*.d.d $(OBJ_DIR)/$*.d.P; \
     221                sed -e 's/#.*//' -e 's/^[^:]*: *//' -e 's/ *\\$$//' \
     222                -e '/^$$/ d' -e 's/$$/ :/' < $(OBJ_DIR)/$*.d.d >> $(OBJ_DIR)/$*.d.P; \
     223                rm -f $(OBJ_DIR)/$*.d.d
     224endef
    210225
    211226# create release objects
     
    251266# create release objects
    252267$(OBJ_DIR)/%.r.o: $(SRC_DIR)/%.c
    253         $(COMPILE_AND_DEPEND_RELEASE)
     268        $(COMPILE_AND_DEPEND_RELEASE_C)
    254269
    255270# create debug objects
    256271$(OBJ_DIR)/%.d.o: $(SRC_DIR)/%.c
    257         $(COMPILE_AND_DEPEND_DEBUG)
     272        $(COMPILE_AND_DEPEND_DEBUG_C)
    258273
    259274# create release objects
    260275$(OBJ_DIR)/%.r.o: $(SRC_DIR1)/%.c
    261         $(COMPILE_AND_DEPEND_RELEASE)
     276        $(COMPILE_AND_DEPEND_RELEASE_C)
    262277
    263278# create debug objects
    264279$(OBJ_DIR)/%.d.o: $(SRC_DIR1)/%.c
    265         $(COMPILE_AND_DEPEND_DEBUG)
     280        $(COMPILE_AND_DEPEND_DEBUG_C)
    266281
    267282# create release objects
    268283$(OBJ_DIR)/%.r.o: $(SRC_DIR2)/%.c
    269         $(COMPILE_AND_DEPEND_RELEASE)
     284        $(COMPILE_AND_DEPEND_RELEASE_C)
    270285
    271286# create debug objects
    272287$(OBJ_DIR)/%.d.o: $(SRC_DIR2)/%.c
    273         $(COMPILE_AND_DEPEND_DEBUG)
     288        $(COMPILE_AND_DEPEND_DEBUG_C)
    274289
    275290# create release objects
    276291$(OBJ_DIR)/%.r.o: $(SRC_DIR3)/%.c
    277         $(COMPILE_AND_DEPEND_RELEASE)
     292        $(COMPILE_AND_DEPEND_RELEASE_C)
    278293
    279294# create debug objects
    280295$(OBJ_DIR)/%.d.o: $(SRC_DIR3)/%.c
    281         $(COMPILE_AND_DEPEND_DEBUG)
     296        $(COMPILE_AND_DEPEND_DEBUG_C)
    282297
    283298# create release objects
    284299$(OBJ_DIR)/%.r.o: $(SRC_DIR4)/%.c
    285         $(COMPILE_AND_DEPEND_RELEASE)
     300        $(COMPILE_AND_DEPEND_RELEASE_C)
    286301
    287302# create debug objects
    288303$(OBJ_DIR)/%.d.o: $(SRC_DIR4)/%.c
    289         $(COMPILE_AND_DEPEND_DEBUG)
     304        $(COMPILE_AND_DEPEND_DEBUG_C)
    290305
    291306
  • branches/HTM-10.0rc1-dev0/cfg/3D-HEVC/NonCTC/allintra/baseCfg_2view+depth_AllIntra.cfg

    r738 r837  
    149149#============ Lossless ================
    150150TransquantBypassEnableFlag: 0  # Value of PPS flag.
    151 CUTransquantBypassFlagValue: 0 # Constant lossless-value signaling per CU, if TransquantBypassEnableFlag is 1.
     151CUTransquantBypassFlagForce: 0 # Constant lossless-value signaling per CU, if TransquantBypassEnableFlag is 1.
    152152
    153153#============ Rate Control ======================
  • branches/HTM-10.0rc1-dev0/cfg/3D-HEVC/NonCTC/allintra/baseCfg_2view_AllIntra.cfg

    r655 r837  
    122122#============ Lossless ================
    123123TransquantBypassEnableFlag: 0  # Value of PPS flag.
    124 CUTransquantBypassFlagValue: 0 # Constant lossless-value signaling per CU, if TransquantBypassEnableFlag is 1.
     124CUTransquantBypassFlagForce: 0 # Constant lossless-value signaling per CU, if TransquantBypassEnableFlag is 1.
    125125
    126126#============ Rate Control ======================
  • branches/HTM-10.0rc1-dev0/cfg/3D-HEVC/NonCTC/allintra/baseCfg_3view+depth_AllIntra.cfg

    r738 r837  
    164164#============ Lossless ================
    165165TransquantBypassEnableFlag: 0  # Value of PPS flag.
    166 CUTransquantBypassFlagValue: 0 # Constant lossless-value signaling per CU, if TransquantBypassEnableFlag is 1.
     166CUTransquantBypassFlagForce: 0 # Constant lossless-value signaling per CU, if TransquantBypassEnableFlag is 1.
    167167
    168168#============ Rate Control ======================
  • branches/HTM-10.0rc1-dev0/cfg/3D-HEVC/NonCTC/allintra/baseCfg_3view_AllIntra.cfg

    r655 r837  
    124124#============ Lossless ================
    125125TransquantBypassEnableFlag: 0  # Value of PPS flag.
    126 CUTransquantBypassFlagValue: 0 # Constant lossless-value signaling per CU, if TransquantBypassEnableFlag is 1.
     126CUTransquantBypassFlagForce: 0 # Constant lossless-value signaling per CU, if TransquantBypassEnableFlag is 1.
    127127
    128128#============ Rate Control ======================
  • branches/HTM-10.0rc1-dev0/cfg/3D-HEVC/NonCTC/fco/baseCfg_3view+depth.cfg

    r833 r837  
    213213#============ Lossless ================
    214214TransquantBypassEnableFlag: 0  # Value of PPS flag.
    215 CUTransquantBypassFlagValue: 0 # Constant lossless-value signaling per CU, if TransquantBypassEnableFlag is 1.
     215CUTransquantBypassFlagForce: 0 # Constant lossless-value signaling per CU, if TransquantBypassEnableFlag is 1.
    216216
    217217#============ Rate Control ======================
  • branches/HTM-10.0rc1-dev0/cfg/3D-HEVC/NonCTC/rc/baseCfg_3view+depth_rate_control.cfg

    r724 r837  
    213213#============ Lossless ================
    214214TransquantBypassEnableFlag: 0  # Value of PPS flag.
    215 CUTransquantBypassFlagValue: 0 # Constant lossless-value signaling per CU, if TransquantBypassEnableFlag is 1.
     215CUTransquantBypassFlagForce: 0 # Constant lossless-value signaling per CU, if TransquantBypassEnableFlag is 1.
    216216
    217217#============ Rate Control ======================
  • branches/HTM-10.0rc1-dev0/cfg/3D-HEVC/baseCfg_2view+depth.cfg

    r833 r837  
    183183#============ Lossless ================
    184184TransquantBypassEnableFlag: 0  # Value of PPS flag.
    185 CUTransquantBypassFlagValue: 0 # Constant lossless-value signaling per CU, if TransquantBypassEnableFlag is 1.
     185CUTransquantBypassFlagForce: 0 # Constant lossless-value signaling per CU, if TransquantBypassEnableFlag is 1.
    186186
    187187#============ Rate Control ======================
  • branches/HTM-10.0rc1-dev0/cfg/3D-HEVC/baseCfg_2view.cfg

    r724 r837  
    156156#============ Lossless ================
    157157TransquantBypassEnableFlag: 0  # Value of PPS flag.
    158 CUTransquantBypassFlagValue: 0 # Constant lossless-value signaling per CU, if TransquantBypassEnableFlag is 1.
     158CUTransquantBypassFlagForce: 0 # Constant lossless-value signaling per CU, if TransquantBypassEnableFlag is 1.
    159159
    160160#============ Rate Control ======================
  • branches/HTM-10.0rc1-dev0/cfg/3D-HEVC/baseCfg_3view+depth.cfg

    r833 r837  
    213213#============ Lossless ================
    214214TransquantBypassEnableFlag: 0  # Value of PPS flag.
    215 CUTransquantBypassFlagValue: 0 # Constant lossless-value signaling per CU, if TransquantBypassEnableFlag is 1.
     215CUTransquantBypassFlagForce: 0 # Constant lossless-value signaling per CU, if TransquantBypassEnableFlag is 1.
    216216
    217217#============ Rate Control ======================
  • branches/HTM-10.0rc1-dev0/cfg/3D-HEVC/baseCfg_3view.cfg

    r622 r837  
    171171#============ Lossless ================
    172172TransquantBypassEnableFlag: 0  # Value of PPS flag.
    173 CUTransquantBypassFlagValue: 0 # Constant lossless-value signaling per CU, if TransquantBypassEnableFlag is 1.
     173CUTransquantBypassFlagForce: 0 # Constant lossless-value signaling per CU, if TransquantBypassEnableFlag is 1.
    174174
    175175#============ Rate Control ======================
  • branches/HTM-10.0rc1-dev0/cfg/3D-HEVC/fullCfg.cfg

    r735 r837  
    219219#============ Lossless ================
    220220TransquantBypassEnableFlag: 0  # Value of PPS flag.
    221 CUTransquantBypassFlagValue: 0 # Constant lossless-value signaling per CU, if TransquantBypassEnableFlag is 1.
     221CUTransquantBypassFlagForce: 0 # Constant lossless-value signaling per CU, if TransquantBypassEnableFlag is 1.
    222222
    223223#============ Rate Control ======================
  • branches/HTM-10.0rc1-dev0/cfg/HEVC/HM/encoder_intra_main.cfg

    r655 r837  
    9797#============ Lossless ================
    9898TransquantBypassEnableFlag: 0  # Value of PPS flag.
    99 CUTransquantBypassFlagValue: 0 # Constant lossless-value signaling per CU, if TransquantBypassEnableFlag is 1.
     99CUTransquantBypassFlagForce: 0 # Constant lossless-value signaling per CU, if TransquantBypassEnableFlag is 1.
    100100                                                       
    101101### DO NOT ADD ANYTHING BELOW THIS LINE ###
  • branches/HTM-10.0rc1-dev0/cfg/HEVC/HM/encoder_intra_main10.cfg

    r655 r837  
    9797#============ Lossless ================
    9898TransquantBypassEnableFlag: 0  # Value of PPS flag.
    99 CUTransquantBypassFlagValue: 0 # Constant lossless-value signaling per CU, if TransquantBypassEnableFlag is 1.
     99CUTransquantBypassFlagForce: 0 # Constant lossless-value signaling per CU, if TransquantBypassEnableFlag is 1.
    100100
    101101                                                       
  • branches/HTM-10.0rc1-dev0/cfg/HEVC/HM/encoder_lowdelay_P_main.cfg

    r655 r837  
    102102#============ Lossless ================
    103103TransquantBypassEnableFlag: 0  # Value of PPS flag.
    104 CUTransquantBypassFlagValue: 0 # Constant lossless-value signaling per CU, if TransquantBypassEnableFlag is 1.
     104CUTransquantBypassFlagForce: 0 # Constant lossless-value signaling per CU, if TransquantBypassEnableFlag is 1.
    105105
    106106#============ Rate Control ======================
  • branches/HTM-10.0rc1-dev0/cfg/HEVC/HM/encoder_lowdelay_P_main10.cfg

    r655 r837  
    102102#============ Lossless ================
    103103TransquantBypassEnableFlag: 0  # Value of PPS flag.
    104 CUTransquantBypassFlagValue: 0 # Constant lossless-value signaling per CU, if TransquantBypassEnableFlag is 1.
     104CUTransquantBypassFlagForce: 0 # Constant lossless-value signaling per CU, if TransquantBypassEnableFlag is 1.
    105105
    106106#============ Rate Control ======================
  • branches/HTM-10.0rc1-dev0/cfg/HEVC/HM/encoder_lowdelay_main.cfg

    r655 r837  
    102102#============ Lossless ================
    103103TransquantBypassEnableFlag: 0  # Value of PPS flag.
    104 CUTransquantBypassFlagValue: 0 # Constant lossless-value signaling per CU, if TransquantBypassEnableFlag is 1.
     104CUTransquantBypassFlagForce: 0 # Constant lossless-value signaling per CU, if TransquantBypassEnableFlag is 1.
    105105
    106106#============ Rate Control ======================
  • branches/HTM-10.0rc1-dev0/cfg/HEVC/HM/encoder_lowdelay_main10.cfg

    r655 r837  
    102102#============ Lossless ================
    103103TransquantBypassEnableFlag: 0  # Value of PPS flag.
    104 CUTransquantBypassFlagValue: 0 # Constant lossless-value signaling per CU, if TransquantBypassEnableFlag is 1.
     104CUTransquantBypassFlagForce: 0 # Constant lossless-value signaling per CU, if TransquantBypassEnableFlag is 1.
    105105
    106106#============ Rate Control ======================
  • branches/HTM-10.0rc1-dev0/cfg/HEVC/HM/encoder_randomaccess_main.cfg

    r655 r837  
    106106#============ Lossless ================
    107107TransquantBypassEnableFlag: 0  # Value of PPS flag.
    108 CUTransquantBypassFlagValue: 0 # Constant lossless-value signaling per CU, if TransquantBypassEnableFlag is 1.
     108CUTransquantBypassFlagForce: 0 # Constant lossless-value signaling per CU, if TransquantBypassEnableFlag is 1.
    109109
    110110#============ Rate Control ======================
  • branches/HTM-10.0rc1-dev0/cfg/HEVC/HM/encoder_randomaccess_main10.cfg

    r655 r837  
    106106#============ Lossless ================
    107107TransquantBypassEnableFlag: 0  # Value of PPS flag.
    108 CUTransquantBypassFlagValue: 0 # Constant lossless-value signaling per CU, if TransquantBypassEnableFlag is 1.
     108CUTransquantBypassFlagForce: 0 # Constant lossless-value signaling per CU, if TransquantBypassEnableFlag is 1.
    109109
    110110#============ Rate Control ======================
  • branches/HTM-10.0rc1-dev0/cfg/HEVC/HM/per-sequence/Kimono.cfg

    r655 r837  
    88FramesToBeEncoded              : 240         # Number of frames to be coded
    99
    10 Level                         : 4.0
     10Level                         : 4
  • branches/HTM-10.0rc1-dev0/cfg/HEVC/HM/per-sequence/ParkScene.cfg

    r655 r837  
    88FramesToBeEncoded              : 240         # Number of frames to be coded
    99
    10 Level                         : 4.0
     10Level                         : 4
  • branches/HTM-10.0rc1-dev0/cfg/MV-HEVC/baseCfg_2view.cfg

    r622 r837  
    150150#============ Lossless ================
    151151TransquantBypassEnableFlag: 0  # Value of PPS flag.
    152 CUTransquantBypassFlagValue: 0 # Constant lossless-value signaling per CU, if TransquantBypassEnableFlag is 1.
     152CUTransquantBypassFlagForce: 0 # Constant lossless-value signaling per CU, if TransquantBypassEnableFlag is 1.
    153153
    154154#============ Rate Control ======================
  • branches/HTM-10.0rc1-dev0/cfg/MV-HEVC/baseCfg_3view.cfg

    r622 r837  
    167167#============ Lossless ================
    168168TransquantBypassEnableFlag: 0  # Value of PPS flag.
    169 CUTransquantBypassFlagValue: 0 # Constant lossless-value signaling per CU, if TransquantBypassEnableFlag is 1.
     169CUTransquantBypassFlagForce: 0 # Constant lossless-value signaling per CU, if TransquantBypassEnableFlag is 1.
    170170
    171171#============ Rate Control ======================
  • branches/HTM-10.0rc1-dev0/cfg/MV-HEVC/fullCfg.cfg

    r622 r837  
    164164#============ Lossless ================
    165165TransquantBypassEnableFlag: 0  # Value of PPS flag.
    166 CUTransquantBypassFlagValue: 0 # Constant lossless-value signaling per CU, if TransquantBypassEnableFlag is 1.
     166CUTransquantBypassFlagForce: 0 # Constant lossless-value signaling per CU, if TransquantBypassEnableFlag is 1.
    167167
    168168#============ Rate Control ======================
  • branches/HTM-10.0rc1-dev0/doc/Doxyfile

    r608 r837  
    3333# if some version control system is used.
    3434
    35 PROJECT_NUMBER         = HM-11.0
     35PROJECT_NUMBER         = HM-13.0
    3636
    3737# Using the PROJECT_BRIEF tag one can provide an optional one line description
  • branches/HTM-10.0rc1-dev0/doc/mainpage.h

    r608 r837  
    2525 * granted under this license. 
    2626 *
    27  * Copyright (c) 2010-2012, ITU/ISO/IEC
     27 * Copyright (c) 2010-2014, ITU/ISO/IEC
    2828 * All rights reserved.
    2929 *
  • branches/HTM-10.0rc1-dev0/doc/software-manual.tex

    r608 r837  
    9999\author{%
    100100        Frank Bossen
    101         \email{bossen@docomoinnovations.com}
     101        \email{frank@bossentech.com}
    102102        \and
    103103        David Flynn
    104         \email{davidf@rd.bbc.co.uk}
     104        \email{dflynn@blackberry.com}
    105105        \and
    106106        Karsten S\"uhring
     
    118118\begin{abstract}
    119119This document is a user manual describing usage of reference software
    120 for the HEVC project. It applies to version 11.0
     120for the HEVC project. It applies to version 13.0
    121121of the software.
    122122\end{abstract}
     
    952952
    953953
    954 
    955 %%
    956 %% Entropy coding parameters
    957 %%
    958 \begin{OptionTable}{Entropy coding parameters}
    959 \Option{SBACRD} &
    960 \ShortOption{\None} &
    961 \Default{true} &
    962 Enables or disables the use of bit counts from arithmetic coder in
    963 rate-distortion decisions.
    964 \\
    965 \end{OptionTable}
    966 
    967 
    968954%%
    969955%% Slice coding parameters
     
    11831169transquant_bypass_enable_flag that is transmitted in the PPS.
    11841170
    1185 See CUTransquantBypassFlagValue for further details.
    1186 \\
    1187 
    1188 \Option{CUTransquantBypassFlagValue} &
     1171See CUTransquantBypassFlagForce for further details.
     1172\\
     1173
     1174\Option{CUTransquantBypassFlagForce} &
    11891175\ShortOption{\None} &
    11901176\Default{0} &
    11911177Controls the per CU transformation, quantization and filtering
    11921178mode decision.
    1193 This option corresponds to the value of the per CU cu_transquant_bypass_flag.
    1194 \par
    1195 \begin{tabular}{cp{0.45\textwidth}}
    1196  0 & Bypass is not performed on any CU \\
    1197  1 & Bypass is performed on all CUs \\
     1179This option controls the value of the per CU cu_transquant_bypass_flag.
     1180\par
     1181\begin{tabular}{cp{0.45\textwidth}}
     1182 0 & Bypass is searched on a CU-by-CU basis and will be used if the cost is lower than not bypassing. \\
     1183 1 & Bypass is forced for all CUs. \\
    11981184\end{tabular}
    11991185
     
    12041190\ShortOption{\None} &
    12051191\Default{false} &
    1206 Enables or disables the use of PCM.
     1192Enables or disables the use of PCM. The encoder will use cost measures on a CU-by-CU basis to determine if PCM mode is to be applied.
    12071193\\
    12081194
     
    19241910\section{Using the decoder}
    19251911\begin{verbatim}
    1926 TappDecoder -b str.bin -o dec.yuv [options]
     1912TAppDecoder -b str.bin -o dec.yuv [options]
    19271913\end{verbatim}
    19281914
  • branches/HTM-10.0rc1-dev0/source/App/TAppDecoder/TAppDecCfg.cpp

    r773 r837  
    44 * granted under this license. 
    55 *
    6  * Copyright (c) 2010-2013, ITU/ISO/IEC
     6* Copyright (c) 2010-2014, ITU/ISO/IEC
    77 * All rights reserved.
    88 *
  • branches/HTM-10.0rc1-dev0/source/App/TAppDecoder/TAppDecCfg.h

    r773 r837  
    44 * granted under this license. 
    55 *
    6  * Copyright (c) 2010-2013, ITU/ISO/IEC
     6* Copyright (c) 2010-2014, ITU/ISO/IEC
    77 * All rights reserved.
    88 *
  • branches/HTM-10.0rc1-dev0/source/App/TAppDecoder/TAppDecTop.cpp

    r773 r837  
    44 * granted under this license. 
    55 *
    6  * Copyright (c) 2010-2013, ITU/ISO/IEC
     6* Copyright (c) 2010-2014, ITU/ISO/IEC
    77 * All rights reserved.
    88 *
     
    165165  Bool firstSlice        = true;
    166166#endif
    167  
     167  Bool loopFiltered = false;
     168
    168169  while (!!bitstreamFile)
    169170  {
     
    296297      }
    297298    }
    298     if (bNewPicture || !bitstreamFile)
     299    if (bNewPicture || !bitstreamFile || nalu.m_nalUnitType == NAL_UNIT_EOS )
    299300    {
    300301#if H_MV
    301302      assert( decIdxLastPic != -1 );
     303      // TODO add loop filtered variable here
    302304      m_tDecTop[decIdxLastPic]->endPicDecoding(poc, pcListPic, m_targetDecLayerIdSet );
    303305#else
    304       m_cTDecTop.executeLoopFilters(poc, pcListPic);
     306      if (!loopFiltered || bitstreamFile)
     307      {
     308        m_cTDecTop.executeLoopFilters(poc, pcListPic);
     309      }
     310      loopFiltered = (nalu.m_nalUnitType == NAL_UNIT_EOS);
    305311#endif
    306312    }
     
    351357#endif
    352358      }
     359      if (nalu.m_nalUnitType == NAL_UNIT_EOS)
     360      {
     361#if H_MV
     362        xFlushOutput( pcListPic, decIdxLastPic );
     363#else
     364        xFlushOutput( pcListPic );
     365#endif
     366      }
    353367      // write reconstruction to file
    354368      if(bNewPicture)
     
    462476#endif
    463477{
     478
     479  if (pcListPic->empty())
     480  {
     481    return;
     482  }
     483
    464484  TComList<TComPic*>::iterator iterPic   = pcListPic->begin();
    465485  Int numPicsNotYetDisplayed = 0;
     
    647667#endif
    648668{
    649   if(!pcListPic)
     669  if(!pcListPic || pcListPic->empty())
    650670  {
    651671    return;
  • branches/HTM-10.0rc1-dev0/source/App/TAppDecoder/TAppDecTop.h

    r773 r837  
    44 * granted under this license. 
    55 *
    6  * Copyright (c) 2010-2013, ITU/ISO/IEC
     6* Copyright (c) 2010-2014, ITU/ISO/IEC
    77 * All rights reserved.
    88 *
  • branches/HTM-10.0rc1-dev0/source/App/TAppDecoder/decmain.cpp

    r608 r837  
    44 * granted under this license. 
    55 *
    6  * Copyright (c) 2010-2013, ITU/ISO/IEC
     6* Copyright (c) 2010-2014, ITU/ISO/IEC
    77 * All rights reserved.
    88 *
  • branches/HTM-10.0rc1-dev0/source/App/TAppEncoder/TAppEncCfg.cpp

    r833 r837  
    44 * granted under this license. 
    55 *
    6  * Copyright (c) 2010-2013, ITU/ISO/IEC
     6* Copyright (c) 2010-2014, ITU/ISO/IEC
    77 * All rights reserved.
    88 *
     
    492492  ("RDOQTS",                        m_useRDOQTS,                true )
    493493  ("RDpenalty",                     m_rdPenalty,                0,  "RD-penalty for 32x32 TU for intra in non-intra slices. 0:disbaled  1:RD-penalty  2:maximum RD-penalty")
    494   // Entropy coding parameters
    495   ("SBACRD",                         m_bUseSBACRD,                      true, "SBAC based RD estimation")
    496494 
    497495  // Deblocking filter parameters
     
    539537  ("MaxNumOffsetsPerPic",      m_maxNumOffsetsPerPic,       2048,  "Max number of SAO offset per picture (Default: 2048)")   
    540538  ("SAOLcuBoundary",           m_saoLcuBoundary,            false, "0: right/bottom LCU boundary areas skipped from SAO parameter estimation, 1: non-deblocked pixels are used for those areas")
    541   ("SAOLcuBasedOptimization",  m_saoLcuBasedOptimization,   true,  "0: SAO picture-based optimization, 1: SAO LCU-based optimization ")
    542539  ("SliceMode",                m_sliceMode,                0,     "0: Disable all Recon slice limits, 1: Enforce max # of LCUs, 2: Enforce max # of bytes, 3:specify tiles per dependent slice")
    543540  ("SliceArgument",            m_sliceArgument,            0,     "Depending on SliceMode being:"
     
    559556  ("PCMInputBitDepthFlag",     m_bPCMInputBitDepthFlag,     true)
    560557  ("PCMFilterDisableFlag",     m_bPCMFilterDisableFlag,    false)
    561 
    562   ("LosslessCuEnabled",        m_useLossless, false)
    563558
    564559  ("WeightedPredP,-wpP",          m_useWeightedPred,               false,      "Use weighted prediction in P slices")
     
    590585  ("CFM", m_bUseCbfFastMode, false, "Cbf fast mode setting")
    591586  ("ESD", m_useEarlySkipDetection, false, "Early SKIP detection setting")
    592 #if RATE_CONTROL_LAMBDA_DOMAIN
    593587  ( "RateControl",         m_RCEnableRateControl,   false, "Rate control: enable rate control" )
    594588  ( "TargetBitrate",       m_RCTargetBitrate,           0, "Rate control: target bitrate" )
    595 #if M0036_RC_IMPROVEMENT
    596589  ( "KeepHierarchicalBit", m_RCKeepHierarchicalBit,     0, "Rate control: 0: equal bit allocation; 1: fixed ratio bit allocation; 2: adaptive ratio bit allocation" )
    597 #else
    598   ( "KeepHierarchicalBit", m_RCKeepHierarchicalBit, false, "Rate control: keep hierarchical bit allocation in rate control algorithm" )
    599 #endif
    600590  ( "LCULevelRateControl", m_RCLCULevelRC,           true, "Rate control: true: LCU level RC; false: picture level RC" )
    601591  ( "RCLCUSeparateModel",  m_RCUseLCUSeparateModel,  true, "Rate control: use LCU level separate R-lambda model" )
     
    610600  ("DepthMADPred, -dm", m_depthMADPred, (UInt)0, "Depth based MAD prediction on/off")
    611601#endif
    612 #else
    613   ("RateCtrl,-rc", m_enableRateCtrl, false, "Rate control on/off")
    614   ("TargetBitrate,-tbr", m_targetBitrate, 0, "Input target bitrate")
    615   ("NumLCUInUnit,-nu", m_numLCUInUnit, 0, "Number of LCUs in an Unit")
    616 
    617 #if KWU_RC_VIEWRC_E0227
    618   ("ViewWiseTargetBits, -vtbr" ,  m_viewTargetBits,  std::vector<Int>(1, 32), "View-wise target bit-rate setting")
    619   ("TargetBitAssign, -ta", m_viewWiseRateCtrl, false, "View-wise rate control on/off")
    620 #endif
    621 #if KWU_RC_MADPRED_E0227
    622   ("DepthMADPred, -dm", m_depthMADPred, (UInt)0, "Depth based MAD prediction on/off")
    623 #endif
    624 #endif
    625 
    626602#if H_MV
    627603
     
    20211997      m_maxTempLayer = m_GOPList[i].m_temporalId+1;
    20221998    }
    2023     xConfirmPara(m_GOPList[i].m_sliceType!='B'&&m_GOPList[i].m_sliceType!='P', "Slice type must be equal to B or P");
     1999    xConfirmPara(m_GOPList[i].m_sliceType!='B'&&m_GOPList[i].m_sliceType!='P'&&m_GOPList[i].m_sliceType!='I', "Slice type must be equal to B or P or I");
    20242000  }
    20252001  for(Int i=0; i<MAX_TLAYER; i++)
     
    21722148  }
    21732149
    2174 #if RATE_CONTROL_LAMBDA_DOMAIN
    21752150  if ( m_RCEnableRateControl )
    21762151  {
     
    21852160    xConfirmPara( m_uiDeltaQpRD > 0, "Rate control cannot be used together with slice level multiple-QP optimization!\n" );
    21862161  }
    2187 #else
    2188   if(m_enableRateCtrl)
    2189   {
    2190     Int numLCUInWidth  = (m_iSourceWidth  / m_uiMaxCUWidth) + (( m_iSourceWidth  %  m_uiMaxCUWidth ) ? 1 : 0);
    2191     Int numLCUInHeight = (m_iSourceHeight / m_uiMaxCUHeight)+ (( m_iSourceHeight %  m_uiMaxCUHeight) ? 1 : 0);
    2192     Int numLCUInPic    =  numLCUInWidth * numLCUInHeight;
    2193 
    2194     xConfirmPara( (numLCUInPic % m_numLCUInUnit) != 0, "total number of LCUs in a frame should be completely divided by NumLCUInUnit" );
    2195 
    2196 #if !KWU_FIX_URQ
    2197     m_iMaxDeltaQP       = MAX_DELTA_QP;
    2198 #endif
    2199     m_iMaxCuDQPDepth    = MAX_CUDQP_DEPTH;
    2200   }
    2201 #endif
    22022162#if H_MV
    22032163  // VPS VUI
     
    22232183#endif
    22242184
    2225   xConfirmPara(!m_TransquantBypassEnableFlag && m_CUTransquantBypassFlagValue, "CUTransquantBypassFlagValue cannot be 1 when TransquantBypassEnableFlag is 0");
     2185  xConfirmPara(!m_TransquantBypassEnableFlag && m_CUTransquantBypassFlagForce, "CUTransquantBypassFlagForce cannot be 1 when TransquantBypassEnableFlag is 0");
    22262186
    22272187  xConfirmPara(m_log2ParallelMergeLevel < 2, "Log2ParallelMergeLevel should be larger than or equal to 2");
     
    23432303  printf("Internal bit depth           : (Y:%d, C:%d)\n", m_internalBitDepthY, m_internalBitDepthC );
    23442304  printf("PCM sample bit depth         : (Y:%d, C:%d)\n", g_uiPCMBitDepthLuma, g_uiPCMBitDepthChroma );
    2345 #if RATE_CONTROL_LAMBDA_DOMAIN
    23462305  printf("RateControl                  : %d\n", m_RCEnableRateControl );
    23472306  if(m_RCEnableRateControl)
     
    23732332#endif
    23742333  }
    2375 #else
    2376   printf("RateControl                  : %d\n", m_enableRateCtrl);
    2377   if(m_enableRateCtrl)
    2378   {
    2379     printf("TargetBitrate                : %d\n", m_targetBitrate);
    2380     printf("NumLCUInUnit                 : %d\n", m_numLCUInUnit);
    2381 
    2382 #if KWU_RC_MADPRED_E0227
    2383     printf("Depth based MAD prediction   : %d\n", m_depthMADPred);
    2384 #endif
    2385 #if KWU_RC_VIEWRC_E0227
    2386     printf("View-wise Rate control       : %d\n", m_viewWiseRateCtrl);
    2387     if(m_viewWiseRateCtrl)
    2388     {
    2389 
    2390       printf("ViewWiseTargetBits           : ");
    2391       for (Int i = 0 ; i < m_iNumberOfViews ; i++)
    2392         printf("%d ", m_viewTargetBits[i]);
    2393       printf("\n");
    2394     }
    2395     else
    2396     {
    2397       printf("TargetBitrate                : %d\n", m_targetBitrate );
    2398     }
    2399 #endif
    2400   }
    2401 #endif
    24022334  printf("Max Num Merge Candidates     : %d\n", m_maxNumMergeCand);
    24032335#if H_3D
     
    24582390#endif
    24592391  printf("PCM:%d ", (m_usePCM && (1<<m_uiPCMLog2MinSize) <= m_uiMaxCUWidth)? 1 : 0);
    2460   printf("SAOLcuBasedOptimization:%d ", (m_saoLcuBasedOptimization)?(1):(0));
    2461 
    2462   printf("LosslessCuEnabled:%d ", (m_useLossless)? 1:0 );
     2392  if (m_TransquantBypassEnableFlag && m_CUTransquantBypassFlagForce)
     2393  {
     2394    printf("TransQuantBypassEnabled: =1 ");
     2395  }
     2396  else
     2397  {
     2398    printf("TransQuantBypassEnabled:%d ", (m_TransquantBypassEnableFlag)? 1:0 );
     2399  }
    24632400  printf("WPP:%d ", (Int)m_useWeightedPred);
    24642401  printf("WPB:%d ", (Int)m_useWeightedBiPred);
  • branches/HTM-10.0rc1-dev0/source/App/TAppEncoder/TAppEncCfg.h

    r833 r837  
    44 * granted under this license. 
    55 *
    6  * Copyright (c) 2010-2013, ITU/ISO/IEC
     6* Copyright (c) 2010-2014, ITU/ISO/IEC
    77 * All rights reserved.
    88 *
     
    259259  Bool      m_bPCMInputBitDepthFlag;                          ///< 0: PCM bit-depth is internal bit-depth. 1: PCM bit-depth is input bit-depth.
    260260
    261   // coding tool (lossless)
    262   Bool      m_useLossless;                                    ///< flag for using lossless coding
     261  // coding tool (SAO)
    263262#if H_MV
    264263  std::vector<Bool> m_bUseSAO;
     
    268267  Int       m_maxNumOffsetsPerPic;                            ///< SAO maximun number of offset per picture
    269268  Bool      m_saoLcuBoundary;                                 ///< SAO parameter estimation using non-deblocked pixels for LCU bottom and right boundary areas
    270   Bool      m_saoLcuBasedOptimization;                        ///< SAO LCU-based optimization
    271269  // coding tools (loop filter)
    272270#if H_MV
     
    372370  Int       m_TMVPModeId;
    373371  Int       m_signHideFlag;
    374 #if RATE_CONTROL_LAMBDA_DOMAIN
    375372  Bool      m_RCEnableRateControl;                ///< enable rate control or not
    376373  Int       m_RCTargetBitrate;                    ///< target bitrate when rate control is enabled
    377 #if M0036_RC_IMPROVEMENT
    378374  Int       m_RCKeepHierarchicalBit;              ///< 0: equal bit allocation; 1: fixed ratio bit allocation; 2: adaptive ratio bit allocation
    379 #else
    380   Bool      m_RCKeepHierarchicalBit;              ///< whether keeping hierarchical bit allocation structure or not
    381 #endif
    382375  Bool      m_RCLCULevelRC;                       ///< true: LCU level rate control; false: picture level rate control
    383376  Bool      m_RCUseLCUSeparateModel;              ///< use separate R-lambda model at LCU level
     
    409402
    410403  Bool      m_TransquantBypassEnableFlag;                     ///< transquant_bypass_enable_flag setting in PPS.
    411   Bool      m_CUTransquantBypassFlagValue;                    ///< if transquant_bypass_enable_flag, the fixed value to use for the per-CU cu_transquant_bypass_flag.
     404  Bool      m_CUTransquantBypassFlagForce;                    ///< if transquant_bypass_enable_flag, then, if true, all CU transquant bypass flags will be set to true.
    412405
    413406  Bool      m_recalculateQPAccordingToLambda;                 ///< recalculate QP value according to the lambda value
  • branches/HTM-10.0rc1-dev0/source/App/TAppEncoder/TAppEncTop.cpp

    r833 r837  
    44 * granted under this license. 
    55 *
    6  * Copyright (c) 2010-2013, ITU/ISO/IEC
     6* Copyright (c) 2010-2014, ITU/ISO/IEC
    77 * All rights reserved.
    88 *
     
    309309#endif
    310310
    311   Int lowestQP;
    312   lowestQP =  - 6*(g_bitDepthY - 8); // XXX: check
    313 
    314 #if H_MV
    315   if ((m_iMaxDeltaQP == 0 ) && (m_iQP[layerIdInVps] == lowestQP) && (m_useLossless == true))
    316 #else
    317   if ((m_iMaxDeltaQP == 0 ) && (m_iQP == lowestQP) && (m_useLossless == true))
    318 #endif
    319   {
    320     m_bUseAdaptiveQP = false;
    321   }
    322311  m_cTEncTop.setUseAdaptiveQP                ( m_bUseAdaptiveQP  );
    323312  m_cTEncTop.setQPAdaptationRange            ( m_iQPAdaptationRange );
    324313 
    325314  //====== Tool list ========
    326   m_cTEncTop.setUseSBACRD                    ( m_bUseSBACRD   );
    327315  m_cTEncTop.setDeltaQpRD                    ( m_uiDeltaQpRD  );
    328316  m_cTEncTop.setUseASR                       ( m_bUseASR      );
    329317  m_cTEncTop.setUseHADME                     ( m_bUseHADME    );
    330   m_cTEncTop.setUseLossless                  ( m_useLossless );
    331318#if H_MV
    332319  m_cTEncTop.setdQPs                         ( m_aidQP[layerIdInVps]   );
     
    396383
    397384  m_cTEncTop.setSaoLcuBoundary (m_saoLcuBoundary);
    398   m_cTEncTop.setSaoLcuBasedOptimization (m_saoLcuBasedOptimization);
    399385  m_cTEncTop.setPCMInputBitDepthFlag  ( m_bPCMInputBitDepthFlag);
    400386  m_cTEncTop.setPCMFilterDisableFlag  ( m_bPCMFilterDisableFlag);
     
    461447  m_cTEncTop.setScalingListFile            ( m_scalingListFile   );
    462448  m_cTEncTop.setSignHideFlag(m_signHideFlag);
    463 #if RATE_CONTROL_LAMBDA_DOMAIN
    464449#if KWU_RC_VIEWRC_E0227 || KWU_RC_MADPRED_E0227
    465450  if(!m_cTEncTop.getIsDepth())    //only for texture
     
    482467  m_cTEncTop.setInitialQP           ( m_RCInitialQP );
    483468  m_cTEncTop.setForceIntraQP        ( m_RCForceIntraQP );
    484 
    485469#if KWU_RC_MADPRED_E0227
    486470  if(m_cTEncTop.getUseRateCtrl() && !m_cTEncTop.getIsDepth())
    487471  {
    488472    m_cTEncTop.setUseDepthMADPred(layerIdInVps ? m_depthMADPred       : 0);
    489 
    490473    if(m_cTEncTop.getUseDepthMADPred())
    491474    {
     
    498481  {
    499482    m_cTEncTop.setUseViewWiseRateCtrl(m_viewWiseRateCtrl);
    500 
    501483    if(m_iNumberOfViews == 1)
    502484    {
     
    552534  }
    553535#endif
    554 #else
    555 #if KWU_RC_VIEWRC_E0227 || KWU_RC_MADPRED_E0227
    556   if(!m_cTEncTop.getIsDepth())    //only for texture
    557   {
    558     m_cTEncTop.setUseRateCtrl         ( m_enableRateCtrl );
    559     m_cTEncTop.setTargetBitrate       ( m_targetBitrate );
    560     m_cTEncTop.setNumLCUInUnit        ( m_numLCUInUnit);
    561   }
    562   else
    563   {
    564     m_cTEncTop.setUseRateCtrl         ( 0 );
    565   }
    566 #else
    567   m_cTEncTop.setUseRateCtrl         ( m_enableRateCtrl );
    568   m_cTEncTop.setTargetBitrate       ( m_targetBitrate );
    569   m_cTEncTop.setNumLCUInUnit        ( m_numLCUInUnit);
    570 #endif
    571 
    572  
    573 #if KWU_RC_MADPRED_E0227
    574   if(m_cTEncTop.getUseRateCtrl() && !m_cTEncTop.getIsDepth())
    575   {
    576     m_cTEncTop.setUseDepthMADPred(layerIdInVps ? m_depthMADPred       : 0);
    577 
    578     if(m_cTEncTop.getUseDepthMADPred())
    579     {
    580       m_cTEncTop.setCamParam(&m_cCameraData);
    581     }
    582   }
    583 #endif
    584 
    585 #if KWU_RC_VIEWRC_E0227
    586   if(m_cTEncTop.getUseRateCtrl() && !m_cTEncTop.getIsDepth())
    587   {
    588     m_cTEncTop.setUseViewWiseRateCtrl(m_viewWiseRateCtrl);
    589     if(m_iNumberOfViews == 1)
    590     {
    591       if(m_viewWiseRateCtrl)
    592       {
    593         m_cTEncTop.setTargetBitrate(m_viewTargetBits[layerIdInVps>>1]);
    594       }
    595       else
    596       {
    597         m_cTEncTop.setTargetBitrate       ( m_targetBitrate );
    598       }
    599     }
    600     else
    601     {
    602       if(m_viewWiseRateCtrl)
    603       {
    604         m_cTEncTop.setTargetBitrate(m_viewTargetBits[layerIdInVps>>1]);
    605       }
    606       else
    607       {
    608         if(m_iNumberOfViews == 2)
    609         {
    610           if(m_cTEncTop.getViewId() == 0)
    611           {
    612             m_cTEncTop.setTargetBitrate              ( (m_targetBitrate*80)/100 );
    613           }
    614           else if(m_cTEncTop.getViewId() == 1)
    615           {
    616             m_cTEncTop.setTargetBitrate              ( (m_targetBitrate*20)/100 );
    617           }
    618         }
    619         else if(m_iNumberOfViews == 3)
    620         {
    621           if(m_cTEncTop.getViewId() == 0)
    622           {
    623             m_cTEncTop.setTargetBitrate              ( (m_targetBitrate*66)/100 );
    624           }
    625           else if(m_cTEncTop.getViewId() == 1)
    626           {
    627             m_cTEncTop.setTargetBitrate              ( (m_targetBitrate*17)/100 );
    628           }
    629           else if(m_cTEncTop.getViewId() == 2)
    630           {
    631             m_cTEncTop.setTargetBitrate              ( (m_targetBitrate*17)/100 );
    632           }
    633         }
    634         else
    635         {
    636           m_cTEncTop.setTargetBitrate              ( m_targetBitrate );
    637         }
    638       }
    639     }
    640   }
    641 #endif
    642 #endif
    643536  m_cTEncTop.setTransquantBypassEnableFlag(m_TransquantBypassEnableFlag);
    644   m_cTEncTop.setCUTransquantBypassFlagValue(m_CUTransquantBypassFlagValue);
     537  m_cTEncTop.setCUTransquantBypassFlagForceValue(m_CUTransquantBypassFlagForce);
    645538  m_cTEncTop.setUseRecalculateQPAccordingToLambda( m_recalculateQPAccordingToLambda );
    646539  m_cTEncTop.setUseStrongIntraSmoothing( m_useStrongIntraSmoothing );
     
    12031096      rateStatsAccum(au, stats);   
    12041097    }
    1205 #endif   
    12061098  }
    12071099}
     
    12211113    case NAL_UNIT_CODED_SLICE_TRAIL_R:
    12221114    case NAL_UNIT_CODED_SLICE_TRAIL_N:
    1223     case NAL_UNIT_CODED_SLICE_TLA_R:
     1115    case NAL_UNIT_CODED_SLICE_TSA_R:
    12241116    case NAL_UNIT_CODED_SLICE_TSA_N:
    12251117    case NAL_UNIT_CODED_SLICE_STSA_R:
  • branches/HTM-10.0rc1-dev0/source/App/TAppEncoder/TAppEncTop.h

    r773 r837  
    44 * granted under this license. 
    55 *
    6  * Copyright (c) 2010-2013, ITU/ISO/IEC
     6* Copyright (c) 2010-2014, ITU/ISO/IEC
    77 * All rights reserved.
    88 *
  • branches/HTM-10.0rc1-dev0/source/App/TAppEncoder/encmain.cpp

    r608 r837  
    44 * granted under this license. 
    55 *
    6  * Copyright (c) 2010-2013, ITU/ISO/IEC
     6* Copyright (c) 2010-2014, ITU/ISO/IEC
    77 * All rights reserved.
    88 *
  • branches/HTM-10.0rc1-dev0/source/App/utils/BitrateTargeting/ExtractBitrates.cpp

    r56 r837  
    44 * granted under this license. 
    55 *
    6  * Copyright (c) 2010-2012, ITU/ISO/IEC
     6 * Copyright (c) 2010-2014, ITU/ISO/IEC
    77 * All rights reserved.
    88 *
  • branches/HTM-10.0rc1-dev0/source/App/utils/BitrateTargeting/ExtractBitrates.h

    r56 r837  
    44 * granted under this license. 
    55 *
    6  * Copyright (c) 2010-2012, ITU/ISO/IEC
     6 * Copyright (c) 2010-2014, ITU/ISO/IEC
    77 * All rights reserved.
    88 *
  • branches/HTM-10.0rc1-dev0/source/App/utils/BitrateTargeting/ExtractBitratesMain.cpp

    r56 r837  
    44 * granted under this license. 
    55 *
    6  * Copyright (c) 2010-2012, ITU/ISO/IEC
     6 * Copyright (c) 2010-2014, ITU/ISO/IEC
    77 * All rights reserved.
    88 *
  • branches/HTM-10.0rc1-dev0/source/App/utils/BitrateTargeting/GuessLambdaModifiers.cpp

    r56 r837  
    44 * granted under this license. 
    55 *
    6  * Copyright (c) 2010-2012, ITU/ISO/IEC
     6 * Copyright (c) 2010-2014, ITU/ISO/IEC
    77 * All rights reserved.
    88 *
  • branches/HTM-10.0rc1-dev0/source/App/utils/BitrateTargeting/GuessLambdaModifiers.h

    r56 r837  
    44 * granted under this license. 
    55 *
    6  * Copyright (c) 2010-2012, ITU/ISO/IEC
     6 * Copyright (c) 2010-2014, ITU/ISO/IEC
    77 * All rights reserved.
    88 *
  • branches/HTM-10.0rc1-dev0/source/App/utils/BitrateTargeting/GuessLambdaModifiersMain.cpp

    r56 r837  
    44 * granted under this license. 
    55 *
    6  * Copyright (c) 2010-2012, ITU/ISO/IEC
     6 * Copyright (c) 2010-2014, ITU/ISO/IEC
    77 * All rights reserved.
    88 *
  • branches/HTM-10.0rc1-dev0/source/App/utils/BitrateTargeting/RuntimeError.h

    r56 r837  
    44 * granted under this license. 
    55 *
    6  * Copyright (c) 2010-2012, ITU/ISO/IEC
     6 * Copyright (c) 2010-2014, ITU/ISO/IEC
    77 * All rights reserved.
    88 *
  • branches/HTM-10.0rc1-dev0/source/App/utils/BitrateTargeting/encode.shl

    r56 r837  
    44# granted under this license. 
    55#
    6 # Copyright (c) 2010-2012, ITU/ISO/IEC
     6# Copyright (c) 2010-2014, ITU/ISO/IEC
    77# All rights reserved.
    88#
  • branches/HTM-10.0rc1-dev0/source/App/utils/BitrateTargeting/encodeCommand.sh

    r56 r837  
    66# granted under this license. 
    77#
    8 # Copyright (c) 2010-2012, ITU/ISO/IEC
     8# Copyright (c) 2010-2014, ITU/ISO/IEC
    99# All rights reserved.
    1010#
  • branches/HTM-10.0rc1-dev0/source/App/utils/BitrateTargeting/makefile

    r56 r837  
    44# granted under this license. 
    55#
    6 # Copyright (c) 2010-2012, ITU/ISO/IEC
     6# Copyright (c) 2010-2014, ITU/ISO/IEC
    77# All rights reserved.
    88#
  • branches/HTM-10.0rc1-dev0/source/App/utils/BitrateTargeting/targetBitrates.sh

    r56 r837  
    66# granted under this license. 
    77#
    8 # Copyright (c) 2010-2012, ITU/ISO/IEC
     8# Copyright (c) 2010-2014, ITU/ISO/IEC
    99# All rights reserved.
    1010#
  • branches/HTM-10.0rc1-dev0/source/App/utils/annexBbytecount.cpp

    r56 r837  
    44 * granted under this license. 
    55 *
    6  * Copyright (c) 2010-2012, ITU/ISO/IEC
     6 * Copyright (c) 2010-2014, ITU/ISO/IEC
    77 * All rights reserved.
    88 *
  • branches/HTM-10.0rc1-dev0/source/App/utils/convert_NtoMbit_YCbCr.cpp

    r608 r837  
    44 * granted under this license. 
    55 *
    6  * Copyright (c) 2010-2012, ITU/ISO/IEC
     6 * Copyright (c) 2010-2014, ITU/ISO/IEC
    77 * All rights reserved.
    88 *
  • branches/HTM-10.0rc1-dev0/source/Lib/TAppCommon/program_options_lite.cpp

    r608 r837  
    44 * granted under this license. 
    55 *
    6  * Copyright (c) 2010-2013, ITU/ISO/IEC
     6* Copyright (c) 2010-2014, ITU/ISO/IEC
    77 * All rights reserved.
    88 *
     
    3838#include <list>
    3939#include <map>
     40#include <algorithm>
    4041#include "program_options_lite.h"
    4142#include  "../TLibCommon/TypeDef.h"
  • branches/HTM-10.0rc1-dev0/source/Lib/TAppCommon/program_options_lite.h

    r608 r837  
    44 * granted under this license. 
    55 *
    6  * Copyright (c) 2010-2013, ITU/ISO/IEC
     6* Copyright (c) 2010-2014, ITU/ISO/IEC
    77 * All rights reserved.
    88 *
  • branches/HTM-10.0rc1-dev0/source/Lib/TLibCommon/AccessUnit.h

    r608 r837  
    44 * granted under this license.
    55 *
    6  * Copyright (c) 2010-2013, ITU/ISO/IEC
     6* Copyright (c) 2010-2014, ITU/ISO/IEC
    77 * All rights reserved.
    88 *
  • branches/HTM-10.0rc1-dev0/source/Lib/TLibCommon/CommonDef.h

    r834 r837  
    44 * granted under this license. 
    55 *
    6  * Copyright (c) 2010-2013, ITU/ISO/IEC
     6* Copyright (c) 2010-2014, ITU/ISO/IEC
    77 * All rights reserved.
    88 *
     
    6161#if H_MV
    6262#define NV_VERSION        "10.0rc1"              ///< Current software version
    63 #define HM_VERSION        "12.0"                ///<
     63#define HM_VERSION        "13.0"                ///<
    6464#else
    65 #define NV_VERSION        "12.0"                 ///< Current software version
     65#define NV_VERSION        "13.0"                 ///< Current software version
    6666#endif
    6767
     
    247247 
    248248  NAL_UNIT_CODED_SLICE_TSA_N,     // 2
    249   NAL_UNIT_CODED_SLICE_TLA_R,       // 3
     249  NAL_UNIT_CODED_SLICE_TSA_R,       // 3
    250250 
    251251  NAL_UNIT_CODED_SLICE_STSA_N,    // 4
  • branches/HTM-10.0rc1-dev0/source/Lib/TLibCommon/ContextModel.cpp

    r608 r837  
    44 * granted under this license. 
    55 *
    6  * Copyright (c) 2010-2013, ITU/ISO/IEC
     6* Copyright (c) 2010-2014, ITU/ISO/IEC
    77 * All rights reserved.
    88 *
  • branches/HTM-10.0rc1-dev0/source/Lib/TLibCommon/ContextModel.h

    r608 r837  
    44 * granted under this license. 
    55 *
    6  * Copyright (c) 2010-2013, ITU/ISO/IEC
     6* Copyright (c) 2010-2014, ITU/ISO/IEC
    77 * All rights reserved.
    88 *
  • branches/HTM-10.0rc1-dev0/source/Lib/TLibCommon/ContextModel3DBuffer.cpp

    r608 r837  
    44 * granted under this license. 
    55 *
    6  * Copyright (c) 2010-2013, ITU/ISO/IEC
     6* Copyright (c) 2010-2014, ITU/ISO/IEC
    77 * All rights reserved.
    88 *
  • branches/HTM-10.0rc1-dev0/source/Lib/TLibCommon/ContextModel3DBuffer.h

    r608 r837  
    44 * granted under this license. 
    55 *
    6  * Copyright (c) 2010-2013, ITU/ISO/IEC
     6* Copyright (c) 2010-2014, ITU/ISO/IEC
    77 * All rights reserved.
    88 *
  • branches/HTM-10.0rc1-dev0/source/Lib/TLibCommon/ContextTables.h

    r833 r837  
    44 * granted under this license. 
    55 *
    6  * Copyright (c) 2010-2013, ITU/ISO/IEC
     6* Copyright (c) 2010-2014, ITU/ISO/IEC
    77 * All rights reserved.
    88 *
     
    4242//! \ingroup TLibCommon
    4343//! \{
    44 #define FIX827 1 ///< Fix for issue #827: CABAC init tables
    45 #define FIX712 1 ///< Fix for issue #712: CABAC init tables
    4644
    4745// ====================================================================================================================
     
    5856
    5957#define NUM_PART_SIZE_CTX             4       ///< number of context models for partition size
    60 #define NUM_CU_AMP_CTX                1       ///< number of context models for partition size (AMP)
    6158#define NUM_PRED_MODE_CTX             1       ///< number of context models for prediction mode
    6259
     
    6966#define NUM_REF_NO_CTX                2       ///< number of context models for reference index
    7067#define NUM_TRANS_SUBDIV_FLAG_CTX     3       ///< number of context models for transform subdivision flags
    71 #define NUM_QT_CBF_CTX                5       ///< number of context models for QT CBF
     68#define NUM_QT_CBF_CTX                4       ///< number of context models for QT CBF
    7269#define NUM_QT_ROOT_CBF_CTX           1       ///< number of context models for QT ROOT CBF
    7370#define NUM_DELTA_QP_CTX              3       ///< number of context models for dQP
     
    8885#define NUM_ABS_FLAG_CTX_CHROMA        2      ///< number of context models for greater than 2 flag of chroma
    8986
    90 #define NUM_MVP_IDX_CTX               2       ///< number of context models for MVP index
     87#define NUM_MVP_IDX_CTX               1       ///< number of context models for MVP index
    9188
    9289#define NUM_SAO_MERGE_FLAG_CTX        1       ///< number of context models for SAO merge flags
     
    199196INIT_PART_SIZE[3][NUM_PART_SIZE_CTX] = 
    200197{
    201   { 154,  139,  CNU,  CNU, },
    202   { 154,  139,  CNU,  CNU, },
    203   { 184,  CNU,  CNU,  CNU, },
    204 };
    205 
    206 static const UChar
    207 INIT_CU_AMP_POS[3][NUM_CU_AMP_CTX] = 
    208 {
    209   { 154, },
    210   { 154, },
    211   { CNU, },
     198  { 154,  139,  154,  154 },
     199  { 154,  139,  154,  154 },
     200  { 184,  CNU,  CNU,  CNU },
    212201};
    213202
     
    271260INIT_QT_CBF[3][2*NUM_QT_CBF_CTX] = 
    272261{
    273   { 153,  111,  CNU,  CNU,  CNU,  149,   92,  167,  CNU,  CNU, },
    274   { 153,  111,  CNU,  CNU,  CNU,  149,  107,  167,  CNU,  CNU, },
    275   { 111,  141,  CNU,  CNU,  CNU,   94,  138,  182,  CNU,  CNU, },
     262  { 153,  111,  CNU,  CNU,   149,   92,  167,  154 },
     263  { 153,  111,  CNU,  CNU,   149,  107,  167,  154 },
     264  { 111,  141,  CNU,  CNU,    94,  138,  182,  154 },
    276265};
    277266
     
    339328INIT_MVP_IDX[3][NUM_MVP_IDX_CTX] = 
    340329{
    341   { 168,  CNU, },
    342   { 168,  CNU, },
    343   { CNU,  CNU, },
     330  { 168 },
     331  { 168 },
     332  { CNU },
    344333};
    345334
     
    355344INIT_SAO_TYPE_IDX[3][NUM_SAO_TYPE_IDX_CTX] =
    356345{
    357 #if FIX827
    358346  { 160, },
    359347  { 185, },
    360348  { 200, },
    361 #else
    362   { 200, },
    363   { 185, },
    364   { 160, },
    365 #endif
    366349};
    367350
     
    369352INIT_TRANS_SUBDIV_FLAG[3][NUM_TRANS_SUBDIV_FLAG_CTX] =
    370353{
    371 #if FIX712
    372354  { 224,  167,  122, },
    373355  { 124,  138,   94, },
    374356  { 153,  138,  138, },
    375 #else
    376   { 153,  138,  138, },
    377   { 124,  138,   94, },
    378   { 224,  167,  122, },
    379 #endif
    380357};
    381358
  • branches/HTM-10.0rc1-dev0/source/Lib/TLibCommon/NAL.h

    r608 r837  
    44 * granted under this license.
    55 *
    6  * Copyright (c) 2010-2013, ITU/ISO/IEC
     6* Copyright (c) 2010-2014, ITU/ISO/IEC
    77 * All rights reserved.
    88 *
     
    7979    return m_nalUnitType == NAL_UNIT_CODED_SLICE_TRAIL_R
    8080        || m_nalUnitType == NAL_UNIT_CODED_SLICE_TRAIL_N
    81         || m_nalUnitType == NAL_UNIT_CODED_SLICE_TLA_R
     81        || m_nalUnitType == NAL_UNIT_CODED_SLICE_TSA_R
    8282        || m_nalUnitType == NAL_UNIT_CODED_SLICE_TSA_N
    8383        || m_nalUnitType == NAL_UNIT_CODED_SLICE_STSA_R
  • branches/HTM-10.0rc1-dev0/source/Lib/TLibCommon/SEI.cpp

    r608 r837  
    44 * granted under this license. 
    55 *
    6  * Copyright (c) 2010-2013, ITU/ISO/IEC
     6* Copyright (c) 2010-2014, ITU/ISO/IEC
    77 * All rights reserved.
    88 *
  • branches/HTM-10.0rc1-dev0/source/Lib/TLibCommon/SEI.h

    r608 r837  
    44 * granted under this license.
    55 *
    6  * Copyright (c) 2010-2013, ITU/ISO/IEC
     6* Copyright (c) 2010-2014, ITU/ISO/IEC
    77 * All rights reserved.
    88 *
  • branches/HTM-10.0rc1-dev0/source/Lib/TLibCommon/TComBitCounter.h

    r608 r837  
    44 * granted under this license. 
    55 *
    6  * Copyright (c) 2010-2013, ITU/ISO/IEC
     6* Copyright (c) 2010-2014, ITU/ISO/IEC
    77 * All rights reserved.
    88 *
  • branches/HTM-10.0rc1-dev0/source/Lib/TLibCommon/TComBitStream.cpp

    r608 r837  
    44 * granted under this license. 
    55 *
    6  * Copyright (c) 2010-2013, ITU/ISO/IEC
     6* Copyright (c) 2010-2014, ITU/ISO/IEC
    77 * All rights reserved.
    88 *
  • branches/HTM-10.0rc1-dev0/source/Lib/TLibCommon/TComBitStream.h

    r608 r837  
    44 * granted under this license. 
    55 *
    6  * Copyright (c) 2010-2013, ITU/ISO/IEC
     6* Copyright (c) 2010-2014, ITU/ISO/IEC
    77 * All rights reserved.
    88 *
  • branches/HTM-10.0rc1-dev0/source/Lib/TLibCommon/TComCABACTables.cpp

    r608 r837  
    44 * granted under this license. 
    55 *
    6  * Copyright (c) 2010-2013, ITU/ISO/IEC
     6* Copyright (c) 2010-2014, ITU/ISO/IEC
    77 * All rights reserved.
    88 *
  • branches/HTM-10.0rc1-dev0/source/Lib/TLibCommon/TComCABACTables.h

    r608 r837  
    44 * granted under this license. 
    55 *
    6  * Copyright (c) 2010-2013, ITU/ISO/IEC
     6* Copyright (c) 2010-2014, ITU/ISO/IEC
    77 * All rights reserved.
    88 *
  • branches/HTM-10.0rc1-dev0/source/Lib/TLibCommon/TComDataCU.cpp

    r833 r837  
    44 * granted under this license. 
    55 *
    6  * Copyright (c) 2010-2013, ITU/ISO/IEC
     6* Copyright (c) 2010-2014, ITU/ISO/IEC
    77 * All rights reserved.
    88 *
     
    488488}
    489489
    490 const NDBFBlockInfo& NDBFBlockInfo::operator= (const NDBFBlockInfo& src)
    491 {
    492   this->tileID = src.tileID;
    493   this->sliceID= src.sliceID;
    494   this->startSU= src.startSU;
    495   this->endSU  = src.endSU;
    496   this->widthSU= src.widthSU;
    497   this->heightSU=src.heightSU;
    498   this->posX   = src.posX;
    499   this->posY   = src.posY;
    500   this->width  = src.width;
    501   this->height = src.height;
    502   ::memcpy(this->isBorderAvailable, src.isBorderAvailable, sizeof(Bool)*((Int)NUM_SGU_BORDER));
    503   this->allBordersAvailable = src.allBordersAvailable;
    504 
    505   return *this;
    506 }
    507 
    508 
    509490// ====================================================================================================================
    510491// Public member functions
     
    801782*- set last-coded qp value according to input last-coded qp
    802783*/
    803 Void TComDataCU::initEstData( UInt uiDepth, Int qp )
     784Void TComDataCU::initEstData( UInt uiDepth, Int qp, Bool bTransquantBypass )
    804785{
    805786  m_dTotalCost         = MAX_DOUBLE;
     
    829810      m_pePartSize[ui] = SIZE_NONE;
    830811      m_pePredMode[ui] = MODE_NONE;
    831       m_CUTransquantBypass[ui] = false;
     812      m_CUTransquantBypass[ui] = bTransquantBypass;
    832813      m_pbIPCMFlag[ui] = 0;
    833814      m_phQP[ui] = qp;
     
    59805961    xAddMVPCand( pInfo, eRefPicList, iRefIdx, uiPartIdxLT, MD_ABOVE_LEFT);
    59815962  }
    5982   bAdded = bAddedSmvp;
    5983   if (pInfo->iN==2) bAdded = true;
    5984 
    5985   if(!bAdded)
     5963
     5964  if (!bAddedSmvp)
    59865965  {
    59875966    bAdded = xAddMVPCandOrder( pInfo, eRefPicList, iRefIdx, uiPartIdxRT, MD_ABOVE_RIGHT);
     
    66416620{
    66426621  return getPic()->getPicSym()->getInverseCUOrderMap(m_uiCUAddr)*(1<<(m_pcSlice->getSPS()->getMaxCUDepth()<<1))+m_uiAbsIdxInLCU;
    6643 }
    6644 
    6645 /** Set neighboring blocks availabilities for non-deblocked filtering
    6646  * \param numLCUInPicWidth number of LCUs in picture width
    6647  * \param numLCUInPicHeight number of LCUs in picture height
    6648  * \param numSUInLCUWidth number of SUs in LCU width
    6649  * \param numSUInLCUHeight number of SUs in LCU height
    6650  * \param picWidth picture width
    6651  * \param picHeight picture height
    6652  * \param bIndependentSliceBoundaryEnabled true for independent slice boundary enabled
    6653  * \param bTopTileBoundary true means that top boundary coincides tile boundary
    6654  * \param bDownTileBoundary true means that bottom boundary coincides tile boundary
    6655  * \param bLeftTileBoundary true means that left boundary coincides tile boundary
    6656  * \param bRightTileBoundary true means that right boundary coincides tile boundary
    6657  * \param bIndependentTileBoundaryEnabled true for independent tile boundary enabled
    6658  */
    6659 Void TComDataCU::setNDBFilterBlockBorderAvailability(UInt numLCUInPicWidth, UInt /*numLCUInPicHeight*/, UInt numSUInLCUWidth, UInt numSUInLCUHeight, UInt picWidth, UInt picHeight
    6660                                                     ,std::vector<Bool>& LFCrossSliceBoundary
    6661                                                     ,Bool bTopTileBoundary, Bool bDownTileBoundary, Bool bLeftTileBoundary, Bool bRightTileBoundary
    6662                                                     ,Bool bIndependentTileBoundaryEnabled)
    6663 {
    6664   UInt numSUInLCU = numSUInLCUWidth*numSUInLCUHeight;
    6665   Int* pSliceIDMapLCU = m_piSliceSUMap;
    6666   Bool onlyOneSliceInPic = ((Int)LFCrossSliceBoundary.size() == 1);
    6667   UInt uiLPelX, uiTPelY;
    6668   UInt width, height;
    6669   Bool bPicRBoundary, bPicBBoundary, bPicTBoundary, bPicLBoundary;
    6670   Bool bLCURBoundary= false, bLCUBBoundary= false, bLCUTBoundary= false, bLCULBoundary= false;
    6671   Bool* pbAvailBorder;
    6672   Bool* pbAvail;
    6673   UInt rTLSU, rBRSU, widthSU, heightSU;
    6674   UInt zRefSU;
    6675   Int* pRefID;
    6676   Int* pRefMapLCU;
    6677   UInt rTRefSU= 0, rBRefSU= 0, rLRefSU= 0, rRRefSU= 0;
    6678   Int* pRRefMapLCU= NULL;
    6679   Int* pLRefMapLCU= NULL;
    6680   Int* pTRefMapLCU= NULL;
    6681   Int* pBRefMapLCU= NULL;
    6682   Int  sliceID;
    6683   UInt numSGU = (UInt)m_vNDFBlock.size();
    6684 
    6685   for(Int i=0; i< numSGU; i++)
    6686   {
    6687     NDBFBlockInfo& rSGU = m_vNDFBlock[i];
    6688 
    6689     sliceID = rSGU.sliceID;
    6690     uiLPelX = rSGU.posX;
    6691     uiTPelY = rSGU.posY;
    6692     width   = rSGU.width;
    6693     height  = rSGU.height;
    6694     rTLSU     = g_auiZscanToRaster[ rSGU.startSU ];
    6695     rBRSU     = g_auiZscanToRaster[ rSGU.endSU   ];
    6696     widthSU   = rSGU.widthSU;
    6697     heightSU  = rSGU.heightSU;
    6698 
    6699     pbAvailBorder = rSGU.isBorderAvailable;
    6700 
    6701     bPicTBoundary= (uiTPelY == 0                       )?(true):(false);
    6702     bPicLBoundary= (uiLPelX == 0                       )?(true):(false);
    6703     bPicRBoundary= (!(uiLPelX+ width < picWidth )  )?(true):(false);
    6704     bPicBBoundary= (!(uiTPelY + height < picHeight))?(true):(false);
    6705 
    6706     bLCULBoundary = (rTLSU % numSUInLCUWidth == 0)?(true):(false);
    6707     bLCURBoundary = ( (rTLSU+ widthSU) % numSUInLCUWidth == 0)?(true):(false);
    6708     bLCUTBoundary = ( (UInt)(rTLSU / numSUInLCUWidth)== 0)?(true):(false);
    6709     bLCUBBoundary = ( (UInt)(rBRSU / numSUInLCUWidth) == (numSUInLCUHeight-1) )?(true):(false);
    6710 
    6711     //       SGU_L
    6712     pbAvail = &(pbAvailBorder[SGU_L]);
    6713     if(bPicLBoundary)
    6714     {
    6715       *pbAvail = false;
    6716     }
    6717     else if (onlyOneSliceInPic)
    6718     {
    6719       *pbAvail = true;
    6720     }
    6721     else
    6722     {
    6723       //      bLCULBoundary = (rTLSU % uiNumSUInLCUWidth == 0)?(true):(false);
    6724       if(bLCULBoundary)
    6725       {
    6726         rLRefSU     = rTLSU + numSUInLCUWidth -1;
    6727         zRefSU      = g_auiRasterToZscan[rLRefSU];
    6728         pRefMapLCU = pLRefMapLCU= (pSliceIDMapLCU - numSUInLCU);
    6729       }
    6730       else
    6731       {
    6732         zRefSU   = g_auiRasterToZscan[rTLSU - 1];
    6733         pRefMapLCU  = pSliceIDMapLCU;
    6734       }
    6735       pRefID = pRefMapLCU + zRefSU;
    6736       *pbAvail = (*pRefID == sliceID)?(true):((*pRefID > sliceID)?(LFCrossSliceBoundary[*pRefID]):(LFCrossSliceBoundary[sliceID]));
    6737     }
    6738 
    6739     //       SGU_R
    6740     pbAvail = &(pbAvailBorder[SGU_R]);
    6741     if(bPicRBoundary)
    6742     {
    6743       *pbAvail = false;
    6744     }
    6745     else if (onlyOneSliceInPic)
    6746     {
    6747       *pbAvail = true;
    6748     }
    6749     else
    6750     {
    6751       //       bLCURBoundary = ( (rTLSU+ uiWidthSU) % uiNumSUInLCUWidth == 0)?(true):(false);
    6752       if(bLCURBoundary)
    6753       {
    6754         rRRefSU      = rTLSU + widthSU - numSUInLCUWidth;
    6755         zRefSU       = g_auiRasterToZscan[rRRefSU];
    6756         pRefMapLCU  = pRRefMapLCU= (pSliceIDMapLCU + numSUInLCU);
    6757       }
    6758       else
    6759       {
    6760         zRefSU       = g_auiRasterToZscan[rTLSU + widthSU];
    6761         pRefMapLCU  = pSliceIDMapLCU;
    6762       }
    6763       pRefID = pRefMapLCU + zRefSU;
    6764       *pbAvail = (*pRefID == sliceID)?(true):((*pRefID > sliceID)?(LFCrossSliceBoundary[*pRefID]):(LFCrossSliceBoundary[sliceID]));
    6765     }
    6766 
    6767     //       SGU_T
    6768     pbAvail = &(pbAvailBorder[SGU_T]);
    6769     if(bPicTBoundary)
    6770     {
    6771       *pbAvail = false;
    6772     }
    6773     else if (onlyOneSliceInPic)
    6774     {
    6775       *pbAvail = true;
    6776     }
    6777     else
    6778     {
    6779       //      bLCUTBoundary = ( (UInt)(rTLSU / uiNumSUInLCUWidth)== 0)?(true):(false);
    6780       if(bLCUTBoundary)
    6781       {
    6782         rTRefSU      = numSUInLCU - (numSUInLCUWidth - rTLSU);
    6783         zRefSU       = g_auiRasterToZscan[rTRefSU];
    6784         pRefMapLCU  = pTRefMapLCU= (pSliceIDMapLCU - (numLCUInPicWidth*numSUInLCU));
    6785       }
    6786       else
    6787       {
    6788         zRefSU       = g_auiRasterToZscan[rTLSU - numSUInLCUWidth];
    6789         pRefMapLCU  = pSliceIDMapLCU;
    6790       }
    6791       pRefID = pRefMapLCU + zRefSU;
    6792       *pbAvail = (*pRefID == sliceID)?(true):((*pRefID > sliceID)?(LFCrossSliceBoundary[*pRefID]):(LFCrossSliceBoundary[sliceID]));
    6793     }
    6794 
    6795     //       SGU_B
    6796     pbAvail = &(pbAvailBorder[SGU_B]);
    6797     if(bPicBBoundary)
    6798     {
    6799       *pbAvail = false;
    6800     }
    6801     else if (onlyOneSliceInPic)
    6802     {
    6803       *pbAvail = true;
    6804     }
    6805     else
    6806     {
    6807       //      bLCUBBoundary = ( (UInt)(rBRSU / uiNumSUInLCUWidth) == (uiNumSUInLCUHeight-1) )?(true):(false);
    6808       if(bLCUBBoundary)
    6809       {
    6810         rBRefSU      = rTLSU % numSUInLCUWidth;
    6811         zRefSU       = g_auiRasterToZscan[rBRefSU];
    6812         pRefMapLCU  = pBRefMapLCU= (pSliceIDMapLCU + (numLCUInPicWidth*numSUInLCU));
    6813       }
    6814       else
    6815       {
    6816         zRefSU       = g_auiRasterToZscan[rTLSU + (heightSU*numSUInLCUWidth)];
    6817         pRefMapLCU  = pSliceIDMapLCU;
    6818       }
    6819       pRefID = pRefMapLCU + zRefSU;
    6820       *pbAvail = (*pRefID == sliceID)?(true):((*pRefID > sliceID)?(LFCrossSliceBoundary[*pRefID]):(LFCrossSliceBoundary[sliceID]));
    6821     }
    6822 
    6823     //       SGU_TL
    6824     pbAvail = &(pbAvailBorder[SGU_TL]);
    6825     if(bPicTBoundary || bPicLBoundary)
    6826     {
    6827       *pbAvail = false;
    6828     }
    6829     else if (onlyOneSliceInPic)
    6830     {
    6831       *pbAvail = true;
    6832     }
    6833     else
    6834     {
    6835       if(bLCUTBoundary && bLCULBoundary)
    6836       {
    6837         zRefSU       = numSUInLCU -1;
    6838         pRefMapLCU  = pSliceIDMapLCU - ( (numLCUInPicWidth+1)*numSUInLCU);
    6839       }
    6840       else if(bLCUTBoundary)
    6841       {
    6842         zRefSU       = g_auiRasterToZscan[ rTRefSU- 1];
    6843         pRefMapLCU  = pTRefMapLCU;
    6844       }
    6845       else if(bLCULBoundary)
    6846       {
    6847         zRefSU       = g_auiRasterToZscan[ rLRefSU- numSUInLCUWidth ];
    6848         pRefMapLCU  = pLRefMapLCU;
    6849       }
    6850       else //inside LCU
    6851       {
    6852         zRefSU       = g_auiRasterToZscan[ rTLSU - numSUInLCUWidth -1];
    6853         pRefMapLCU  = pSliceIDMapLCU;
    6854       }
    6855       pRefID = pRefMapLCU + zRefSU;
    6856       *pbAvail = (*pRefID == sliceID)?(true):((*pRefID > sliceID)?(LFCrossSliceBoundary[*pRefID]):(LFCrossSliceBoundary[sliceID]));
    6857     }
    6858 
    6859     //       SGU_TR
    6860     pbAvail = &(pbAvailBorder[SGU_TR]);
    6861     if(bPicTBoundary || bPicRBoundary)
    6862     {
    6863       *pbAvail = false;
    6864     }
    6865     else if (onlyOneSliceInPic)
    6866     {
    6867       *pbAvail = true;
    6868     }
    6869     else
    6870     {
    6871       if(bLCUTBoundary && bLCURBoundary)
    6872       {
    6873         zRefSU      = g_auiRasterToZscan[numSUInLCU - numSUInLCUWidth];
    6874         pRefMapLCU  = pSliceIDMapLCU - ( (numLCUInPicWidth-1)*numSUInLCU);       
    6875       }
    6876       else if(bLCUTBoundary)
    6877       {
    6878         zRefSU       = g_auiRasterToZscan[ rTRefSU+ widthSU];
    6879         pRefMapLCU  = pTRefMapLCU;
    6880       }
    6881       else if(bLCURBoundary)
    6882       {
    6883         zRefSU       = g_auiRasterToZscan[ rRRefSU- numSUInLCUWidth ];
    6884         pRefMapLCU  = pRRefMapLCU;
    6885       }
    6886       else //inside LCU
    6887       {
    6888         zRefSU       = g_auiRasterToZscan[ rTLSU - numSUInLCUWidth +widthSU];
    6889         pRefMapLCU  = pSliceIDMapLCU;
    6890       }
    6891       pRefID = pRefMapLCU + zRefSU;
    6892       *pbAvail = (*pRefID == sliceID)?(true):((*pRefID > sliceID)?(LFCrossSliceBoundary[*pRefID]):(LFCrossSliceBoundary[sliceID]));
    6893     }
    6894 
    6895     //       SGU_BL
    6896     pbAvail = &(pbAvailBorder[SGU_BL]);
    6897     if(bPicBBoundary || bPicLBoundary)
    6898     {
    6899       *pbAvail = false;
    6900     }
    6901     else if (onlyOneSliceInPic)
    6902     {
    6903       *pbAvail = true;
    6904     }
    6905     else
    6906     {
    6907       if(bLCUBBoundary && bLCULBoundary)
    6908       {
    6909         zRefSU      = g_auiRasterToZscan[numSUInLCUWidth - 1];
    6910         pRefMapLCU  = pSliceIDMapLCU + ( (numLCUInPicWidth-1)*numSUInLCU);       
    6911       }
    6912       else if(bLCUBBoundary)
    6913       {
    6914         zRefSU       = g_auiRasterToZscan[ rBRefSU - 1];
    6915         pRefMapLCU  = pBRefMapLCU;
    6916       }
    6917       else if(bLCULBoundary)
    6918       {
    6919         zRefSU       = g_auiRasterToZscan[ rLRefSU+ heightSU*numSUInLCUWidth ];
    6920         pRefMapLCU  = pLRefMapLCU;
    6921       }
    6922       else //inside LCU
    6923       {
    6924         zRefSU       = g_auiRasterToZscan[ rTLSU + heightSU*numSUInLCUWidth -1];
    6925         pRefMapLCU  = pSliceIDMapLCU;
    6926       }
    6927       pRefID = pRefMapLCU + zRefSU;
    6928       *pbAvail = (*pRefID == sliceID)?(true):((*pRefID > sliceID)?(LFCrossSliceBoundary[*pRefID]):(LFCrossSliceBoundary[sliceID]));
    6929     }
    6930 
    6931     //       SGU_BR
    6932     pbAvail = &(pbAvailBorder[SGU_BR]);
    6933     if(bPicBBoundary || bPicRBoundary)
    6934     {
    6935       *pbAvail = false;
    6936     }
    6937     else if (onlyOneSliceInPic)
    6938     {
    6939       *pbAvail = true;
    6940     }
    6941     else
    6942     {
    6943       if(bLCUBBoundary && bLCURBoundary)
    6944       {
    6945         zRefSU = 0;
    6946         pRefMapLCU = pSliceIDMapLCU+ ( (numLCUInPicWidth+1)*numSUInLCU);
    6947       }
    6948       else if(bLCUBBoundary)
    6949       {
    6950         zRefSU      = g_auiRasterToZscan[ rBRefSU + widthSU];
    6951         pRefMapLCU = pBRefMapLCU;
    6952       }
    6953       else if(bLCURBoundary)
    6954       {
    6955         zRefSU      = g_auiRasterToZscan[ rRRefSU + (heightSU*numSUInLCUWidth)];
    6956         pRefMapLCU = pRRefMapLCU;
    6957       }
    6958       else //inside LCU
    6959       {
    6960         zRefSU      = g_auiRasterToZscan[ rTLSU + (heightSU*numSUInLCUWidth)+ widthSU];
    6961         pRefMapLCU = pSliceIDMapLCU;
    6962       }
    6963       pRefID = pRefMapLCU + zRefSU;
    6964       *pbAvail = (*pRefID == sliceID)?(true):((*pRefID > sliceID)?(LFCrossSliceBoundary[*pRefID]):(LFCrossSliceBoundary[sliceID]));
    6965     }
    6966 
    6967     if(bIndependentTileBoundaryEnabled)
    6968     {
    6969       //left LCU boundary
    6970       if(!bPicLBoundary && bLCULBoundary)
    6971       {
    6972         if(bLeftTileBoundary)
    6973         {
    6974           pbAvailBorder[SGU_L] = pbAvailBorder[SGU_TL] = pbAvailBorder[SGU_BL] = false;
    6975         }
    6976       }
    6977       //right LCU boundary
    6978       if(!bPicRBoundary && bLCURBoundary)
    6979       {
    6980         if(bRightTileBoundary)
    6981         {
    6982           pbAvailBorder[SGU_R] = pbAvailBorder[SGU_TR] = pbAvailBorder[SGU_BR] = false;
    6983         }
    6984       }
    6985       //top LCU boundary
    6986       if(!bPicTBoundary && bLCUTBoundary)
    6987       {
    6988         if(bTopTileBoundary)
    6989         {
    6990           pbAvailBorder[SGU_T] = pbAvailBorder[SGU_TL] = pbAvailBorder[SGU_TR] = false;
    6991         }
    6992       }
    6993       //down LCU boundary
    6994       if(!bPicBBoundary && bLCUBBoundary)
    6995       {
    6996         if(bDownTileBoundary)
    6997         {
    6998           pbAvailBorder[SGU_B] = pbAvailBorder[SGU_BL] = pbAvailBorder[SGU_BR] = false;
    6999         }
    7000       }
    7001     }
    7002     rSGU.allBordersAvailable = true;
    7003     for(Int b=0; b< NUM_SGU_BORDER; b++)
    7004     {
    7005       if(pbAvailBorder[b] == false)
    7006       {
    7007         rSGU.allBordersAvailable = false;
    7008         break;
    7009       }
    7010     }
    7011   }
    70126622}
    70136623
  • branches/HTM-10.0rc1-dev0/source/Lib/TLibCommon/TComDataCU.h

    r833 r837  
    44 * granted under this license. 
    55 *
    6  * Copyright (c) 2010-2013, ITU/ISO/IEC
     6* Copyright (c) 2010-2014, ITU/ISO/IEC
    77 * All rights reserved.
    88 *
     
    5959//! \{
    6060
    61 // ====================================================================================================================
    62 // Non-deblocking in-loop filter processing block data structure
    63 // ====================================================================================================================
    64 
    65 /// Non-deblocking filter processing block border tag
    66 enum NDBFBlockBorderTag
    67 {
    68   SGU_L = 0,
    69   SGU_R,
    70   SGU_T,
    71   SGU_B,
    72   SGU_TL,
    73   SGU_TR,
    74   SGU_BL,
    75   SGU_BR,
    76   NUM_SGU_BORDER
    77 };
    78 
    79 /// Non-deblocking filter processing block information
    80 struct NDBFBlockInfo
    81 {
    82   Int   tileID;   //!< tile ID
    83   Int   sliceID;  //!< slice ID
    84   UInt  startSU;  //!< starting SU z-scan address in LCU
    85   UInt  endSU;    //!< ending SU z-scan address in LCU
    86   UInt  widthSU;  //!< number of SUs in width
    87   UInt  heightSU; //!< number of SUs in height
    88   UInt  posX;     //!< top-left X coordinate in picture
    89   UInt  posY;     //!< top-left Y coordinate in picture
    90   UInt  width;    //!< number of pixels in width
    91   UInt  height;   //!< number of pixels in height
    92   Bool  isBorderAvailable[NUM_SGU_BORDER];  //!< the border availabilities
    93   Bool  allBordersAvailable;
    94 
    95   NDBFBlockInfo():tileID(0), sliceID(0), startSU(0), endSU(0) {} //!< constructor
    96   const NDBFBlockInfo& operator= (const NDBFBlockInfo& src);  //!< "=" operator
    97 };
    9861
    9962#if H_3D_DBBP
     
    176139  Pel*          m_pcIPCMSampleCr;     ///< PCM sample buffer (Cr)
    177140
    178   Int*          m_piSliceSUMap;       ///< pointer of slice ID map
    179   std::vector<NDBFBlockInfo> m_vNDFBlock;
    180 
    181141  // -------------------------------------------------------------------------------------------------------------------
    182142  // neighbour access variables
     
    342302 
    343303  Void          initCU                ( TComPic* pcPic, UInt uiCUAddr );
    344   Void          initEstData           ( UInt uiDepth, Int qp );
     304  Void          initEstData           ( UInt uiDepth, Int qp, Bool bTransquantBypass );
    345305  Void          initSubCU             ( TComDataCU* pcCU, UInt uiPartUnitIdx, UInt uiDepth, Int qp );
    346306  Void          setOutsideCUPart      ( UInt uiAbsPartIdx, UInt uiDepth );
     
    522482  DisInfo       getDvInfo             (UInt uiIdx)              { return m_pDvInfo[uiIdx];          }
    523483#endif
    524   /// get slice ID for SU
    525   Int           getSUSliceID          (UInt uiIdx)              {return m_piSliceSUMap[uiIdx];      }
    526 
    527   /// get the pointer of slice ID map
    528   Int*          getSliceSUMap         ()                        {return m_piSliceSUMap;             }
    529 
    530   /// set the pointer of slice ID map
    531   Void          setSliceSUMap         (Int *pi)                 {m_piSliceSUMap = pi;               }
    532 
    533   std::vector<NDBFBlockInfo>* getNDBFilterBlocks()      {return &m_vNDFBlock;}
    534   Void setNDBFilterBlockBorderAvailability(UInt numLCUInPicWidth, UInt numLCUInPicHeight, UInt numSUInLCUWidth, UInt numSUInLCUHeight, UInt picWidth, UInt picHeight
    535                                           ,std::vector<Bool>& LFCrossSliceBoundary
    536                                           ,Bool bTopTileBoundary, Bool bDownTileBoundary, Bool bLeftTileBoundary, Bool bRightTileBoundary
    537                                           ,Bool bIndependentTileBoundaryEnabled );
    538484#if H_3D_NBDV
    539485  Void          xDeriveRightBottomNbIdx(Int &uiLCUIdxRBNb, Int &uiPartIdxRBNb );
  • branches/HTM-10.0rc1-dev0/source/Lib/TLibCommon/TComInterpolationFilter.cpp

    r608 r837  
    44 * granted under this license. 
    55 *
    6  * Copyright (c) 2010-2013, ITU/ISO/IEC
     6* Copyright (c) 2010-2014, ITU/ISO/IEC
    77 * All rights reserved.
    88 *
  • branches/HTM-10.0rc1-dev0/source/Lib/TLibCommon/TComInterpolationFilter.h

    r608 r837  
    44 * granted under this license. 
    55 *
    6  * Copyright (c) 2010-2013, ITU/ISO/IEC
     6* Copyright (c) 2010-2014, ITU/ISO/IEC
    77 * All rights reserved.
    88 *
  • branches/HTM-10.0rc1-dev0/source/Lib/TLibCommon/TComList.h

    r608 r837  
    44 * granted under this license. 
    55 *
    6  * Copyright (c) 2010-2013, ITU/ISO/IEC
     6* Copyright (c) 2010-2014, ITU/ISO/IEC
    77 * All rights reserved.
    88 *
  • branches/HTM-10.0rc1-dev0/source/Lib/TLibCommon/TComLoopFilter.cpp

    r608 r837  
    44 * granted under this license. 
    55 *
    6  * Copyright (c) 2010-2013, ITU/ISO/IEC
     6* Copyright (c) 2010-2014, ITU/ISO/IEC
    77 * All rights reserved.
    88 *
  • branches/HTM-10.0rc1-dev0/source/Lib/TLibCommon/TComLoopFilter.h

    r608 r837  
    44 * granted under this license. 
    55 *
    6  * Copyright (c) 2010-2013, ITU/ISO/IEC
     6* Copyright (c) 2010-2014, ITU/ISO/IEC
    77 * All rights reserved.
    88 *
  • branches/HTM-10.0rc1-dev0/source/Lib/TLibCommon/TComMotionInfo.cpp

    r773 r837  
    44 * granted under this license. 
    55 *
    6  * Copyright (c) 2010-2013, ITU/ISO/IEC
     6* Copyright (c) 2010-2014, ITU/ISO/IEC
    77 * All rights reserved.
    88 *
  • branches/HTM-10.0rc1-dev0/source/Lib/TLibCommon/TComMotionInfo.h

    r833 r837  
    44 * granted under this license. 
    55 *
    6  * Copyright (c) 2010-2013, ITU/ISO/IEC
     6* Copyright (c) 2010-2014, ITU/ISO/IEC
    77 * All rights reserved.
    88 *
  • branches/HTM-10.0rc1-dev0/source/Lib/TLibCommon/TComMv.h

    r655 r837  
    44 * granted under this license. 
    55 *
    6  * Copyright (c) 2010-2013, ITU/ISO/IEC
     6* Copyright (c) 2010-2014, ITU/ISO/IEC
    77 * All rights reserved.
    88 *
  • branches/HTM-10.0rc1-dev0/source/Lib/TLibCommon/TComPattern.cpp

    r608 r837  
    44 * granted under this license. 
    55 *
    6  * Copyright (c) 2010-2013, ITU/ISO/IEC
     6* Copyright (c) 2010-2014, ITU/ISO/IEC
    77 * All rights reserved.
    88 *
  • branches/HTM-10.0rc1-dev0/source/Lib/TLibCommon/TComPattern.h

    r655 r837  
    44 * granted under this license. 
    55 *
    6  * Copyright (c) 2010-2013, ITU/ISO/IEC
     6* Copyright (c) 2010-2014, ITU/ISO/IEC
    77 * All rights reserved.
    88 *
  • branches/HTM-10.0rc1-dev0/source/Lib/TLibCommon/TComPic.cpp

    r738 r837  
    44 * granted under this license. 
    55 *
    6  * Copyright (c) 2010-2013, ITU/ISO/IEC
     6* Copyright (c) 2010-2014, ITU/ISO/IEC
    77 * All rights reserved.
    88 *
     
    5656, m_bNeededForOutput                      (false)
    5757, m_uiCurrSliceIdx                        (0)
    58 , m_pSliceSUMap                           (NULL)
    59 , m_pbValidSlice                          (NULL)
    60 , m_sliceGranularityForNDBFilter          (0)
    61 , m_bIndependentSliceBoundaryForNDBFilter (false)
    62 , m_bIndependentTileBoundaryForNDBFilter  (false)
    63 , m_pNDBFilterYuvTmp                      (NULL)
    6458, m_bCheckLTMSB                           (false)
    6559#if H_MV
     
    174168}
    175169
    176 /** Create non-deblocked filter information
    177  * \param pSliceStartAddress array for storing slice start addresses
    178  * \param numSlices number of slices in picture
    179  * \param sliceGranularityDepth slice granularity
    180  * \param bNDBFilterCrossSliceBoundary cross-slice-boundary in-loop filtering; true for "cross".
    181  * \param numTiles number of tiles in picture
    182  * \param bNDBFilterCrossTileBoundary cross-tile-boundary in-loop filtering; true for "cross".
    183  */
    184 Void TComPic::createNonDBFilterInfo(std::vector<Int> sliceStartAddress, Int sliceGranularityDepth
    185                                     ,std::vector<Bool>* LFCrossSliceBoundary
    186                                     ,Int numTiles
    187                                     ,Bool bNDBFilterCrossTileBoundary)
    188 {
    189   UInt maxNumSUInLCU = getNumPartInCU();
    190   UInt numLCUInPic   = getNumCUsInFrame();
    191   UInt picWidth      = getSlice(0)->getSPS()->getPicWidthInLumaSamples();
    192   UInt picHeight     = getSlice(0)->getSPS()->getPicHeightInLumaSamples();
    193   Int  numLCUsInPicWidth = getFrameWidthInCU();
    194   Int  numLCUsInPicHeight= getFrameHeightInCU();
    195   UInt maxNumSUInLCUWidth = getNumPartInWidth();
    196   UInt maxNumSUInLCUHeight= getNumPartInHeight();
    197   Int  numSlices = (Int) sliceStartAddress.size() - 1;
    198   m_bIndependentSliceBoundaryForNDBFilter = false;
    199   if(numSlices > 1)
    200   {
    201     for(Int s=0; s< numSlices; s++)
    202     {
    203       if((*LFCrossSliceBoundary)[s] == false)
    204       {
    205         m_bIndependentSliceBoundaryForNDBFilter = true;
    206       }
    207     }
    208   }
    209   m_sliceGranularityForNDBFilter = sliceGranularityDepth;
    210   m_bIndependentTileBoundaryForNDBFilter  = (bNDBFilterCrossTileBoundary)?(false) :((numTiles > 1)?(true):(false));
    211 
    212   m_pbValidSlice = new Bool[numSlices];
    213   for(Int s=0; s< numSlices; s++)
    214   {
    215     m_pbValidSlice[s] = true;
    216   }
    217   m_pSliceSUMap = new Int[maxNumSUInLCU * numLCUInPic];
    218 
    219   //initialization
    220   for(UInt i=0; i< (maxNumSUInLCU * numLCUInPic); i++ )
    221   {
    222     m_pSliceSUMap[i] = -1;
    223   }
    224   for( UInt CUAddr = 0; CUAddr < numLCUInPic ; CUAddr++ )
    225   {
    226     TComDataCU* pcCU = getCU( CUAddr );
    227     pcCU->setSliceSUMap(m_pSliceSUMap + (CUAddr* maxNumSUInLCU));
    228     pcCU->getNDBFilterBlocks()->clear();
    229   }
    230   m_vSliceCUDataLink.clear();
    231 
    232   m_vSliceCUDataLink.resize(numSlices);
    233 
    234   UInt startAddr, endAddr, firstCUInStartLCU, startLCU, endLCU, lastCUInEndLCU, uiAddr;
    235   UInt LPelX, TPelY, LCUX, LCUY;
    236   UInt currSU;
    237   UInt startSU, endSU;
    238 
    239   for(Int s=0; s< numSlices; s++)
    240   {
    241     //1st step: decide the real start address
    242     startAddr = sliceStartAddress[s];
    243     endAddr   = sliceStartAddress[s+1] -1;
    244 
    245     startLCU            = startAddr / maxNumSUInLCU;
    246     firstCUInStartLCU   = startAddr % maxNumSUInLCU;
    247 
    248     endLCU              = endAddr   / maxNumSUInLCU;
    249     lastCUInEndLCU      = endAddr   % maxNumSUInLCU;   
    250 
    251     uiAddr = m_apcPicSym->getCUOrderMap(startLCU);
    252 
    253     LCUX      = getCU(uiAddr)->getCUPelX();
    254     LCUY      = getCU(uiAddr)->getCUPelY();
    255     LPelX     = LCUX + g_auiRasterToPelX[ g_auiZscanToRaster[firstCUInStartLCU] ];
    256     TPelY     = LCUY + g_auiRasterToPelY[ g_auiZscanToRaster[firstCUInStartLCU] ];
    257     currSU    = firstCUInStartLCU;
    258 
    259     Bool bMoveToNextLCU = false;
    260     Bool bSliceInOneLCU = (startLCU == endLCU);
    261 
    262     while(!( LPelX < picWidth ) || !( TPelY < picHeight ))
    263     {
    264       currSU ++;
    265 
    266       if(bSliceInOneLCU)
    267       {
    268         if(currSU > lastCUInEndLCU)
    269         {
    270           m_pbValidSlice[s] = false;
    271           break;
    272         }
    273       }
    274 
    275       if(currSU >= maxNumSUInLCU )
    276       {
    277         bMoveToNextLCU = true;
    278         break;
    279       }
    280 
    281       LPelX = LCUX + g_auiRasterToPelX[ g_auiZscanToRaster[currSU] ];
    282       TPelY = LCUY + g_auiRasterToPelY[ g_auiZscanToRaster[currSU] ];
    283 
    284     }
    285 
    286 
    287     if(!m_pbValidSlice[s])
    288     {
    289       continue;
    290     }
    291 
    292     if(currSU != firstCUInStartLCU)
    293     {
    294       if(!bMoveToNextLCU)
    295       {
    296         firstCUInStartLCU = currSU;
    297       }
    298       else
    299       {
    300         startLCU++;
    301         firstCUInStartLCU = 0;
    302         assert( startLCU < getNumCUsInFrame());
    303       }
    304       assert(startLCU*maxNumSUInLCU + firstCUInStartLCU < endAddr);
    305     }
    306 
    307 
    308     //2nd step: assign NonDBFilterInfo to each processing block
    309     for(UInt i= startLCU; i <= endLCU; i++)
    310     {
    311       startSU = (i == startLCU)?(firstCUInStartLCU):(0);
    312       endSU   = (i == endLCU  )?(lastCUInEndLCU   ):(maxNumSUInLCU -1);
    313 
    314       uiAddr = m_apcPicSym->getCUOrderMap(i);
    315       Int iTileID= m_apcPicSym->getTileIdxMap(uiAddr);
    316 
    317       TComDataCU* pcCU = getCU(uiAddr);
    318       m_vSliceCUDataLink[s].push_back(pcCU);
    319 
    320       createNonDBFilterInfoLCU(iTileID, s, pcCU, startSU, endSU, m_sliceGranularityForNDBFilter, picWidth, picHeight);
    321     }
    322   }
    323 
    324   //step 3: border availability
    325   for(Int s=0; s< numSlices; s++)
    326   {
    327     if(!m_pbValidSlice[s])
    328     {
    329       continue;
    330     }
    331 
    332     for(Int i=0; i< m_vSliceCUDataLink[s].size(); i++)
    333     {
    334       TComDataCU* pcCU = m_vSliceCUDataLink[s][i];
    335       uiAddr = pcCU->getAddr();
    336 
    337       if(pcCU->getPic()==0)
    338       {
    339         continue;
    340       }
    341       Int iTileID= m_apcPicSym->getTileIdxMap(uiAddr);
    342       Bool bTopTileBoundary = false, bDownTileBoundary= false, bLeftTileBoundary= false, bRightTileBoundary= false;
    343 
    344       if(m_bIndependentTileBoundaryForNDBFilter)
    345       {
    346         //left
    347         if( uiAddr % numLCUsInPicWidth != 0)
    348         {
    349           bLeftTileBoundary = ( m_apcPicSym->getTileIdxMap(uiAddr -1) != iTileID )?true:false;
    350         }
    351         //right
    352         if( (uiAddr % numLCUsInPicWidth) != (numLCUsInPicWidth -1) )
    353         {
    354           bRightTileBoundary = ( m_apcPicSym->getTileIdxMap(uiAddr +1) != iTileID)?true:false;
    355         }
    356         //top
    357         if( uiAddr >= numLCUsInPicWidth)
    358         {
    359           bTopTileBoundary = (m_apcPicSym->getTileIdxMap(uiAddr - numLCUsInPicWidth) !=  iTileID )?true:false;
    360         }
    361         //down
    362         if( uiAddr + numLCUsInPicWidth < numLCUInPic )
    363         {
    364           bDownTileBoundary = (m_apcPicSym->getTileIdxMap(uiAddr + numLCUsInPicWidth) != iTileID)?true:false;
    365         }
    366 
    367       }
    368 
    369       pcCU->setNDBFilterBlockBorderAvailability(numLCUsInPicWidth, numLCUsInPicHeight, maxNumSUInLCUWidth, maxNumSUInLCUHeight,picWidth, picHeight
    370         , *LFCrossSliceBoundary
    371         ,bTopTileBoundary, bDownTileBoundary, bLeftTileBoundary, bRightTileBoundary
    372         ,m_bIndependentTileBoundaryForNDBFilter);
    373 
    374     }
    375 
    376   }
    377 
    378   if( m_bIndependentSliceBoundaryForNDBFilter || m_bIndependentTileBoundaryForNDBFilter)
    379   {
    380     m_pNDBFilterYuvTmp = new TComPicYuv();
    381     m_pNDBFilterYuvTmp->create(picWidth, picHeight, g_uiMaxCUWidth, g_uiMaxCUHeight, g_uiMaxCUDepth);
    382   }
    383 
    384 }
    385 
    386 /** Create non-deblocked filter information for LCU
    387  * \param tileID tile index
    388  * \param sliceID slice index
    389  * \param pcCU CU data pointer
    390  * \param startSU start SU index in LCU
    391  * \param endSU end SU index in LCU
    392  * \param sliceGranularyDepth slice granularity
    393  * \param picWidth picture width
    394  * \param picHeight picture height
    395  */
    396 Void TComPic::createNonDBFilterInfoLCU(Int tileID, Int sliceID, TComDataCU* pcCU, UInt startSU, UInt endSU, Int sliceGranularyDepth, UInt picWidth, UInt picHeight)
    397 {
    398   UInt LCUX          = pcCU->getCUPelX();
    399   UInt LCUY          = pcCU->getCUPelY();
    400   Int* pCUSliceMap    = pcCU->getSliceSUMap();
    401   UInt maxNumSUInLCU = getNumPartInCU();
    402   UInt maxNumSUInSGU = maxNumSUInLCU >> (sliceGranularyDepth << 1);
    403   UInt maxNumSUInLCUWidth = getNumPartInWidth();
    404   UInt LPelX, TPelY;
    405   UInt currSU;
    406 
    407 
    408   //get the number of valid NBFilterBLock
    409   currSU   = startSU;
    410   while(currSU <= endSU)
    411   {
    412     LPelX = LCUX + g_auiRasterToPelX[ g_auiZscanToRaster[currSU] ];
    413     TPelY = LCUY + g_auiRasterToPelY[ g_auiZscanToRaster[currSU] ];
    414 
    415     while(!( LPelX < picWidth ) || !( TPelY < picHeight ))
    416     {
    417       currSU += maxNumSUInSGU;
    418       if(currSU >= maxNumSUInLCU || currSU > endSU)
    419       {
    420         break;
    421       }
    422       LPelX = LCUX + g_auiRasterToPelX[ g_auiZscanToRaster[currSU] ];
    423       TPelY = LCUY + g_auiRasterToPelY[ g_auiZscanToRaster[currSU] ];
    424     }
    425 
    426     if(currSU >= maxNumSUInLCU || currSU > endSU)
    427     {
    428       break;
    429     }
    430 
    431     NDBFBlockInfo NDBFBlock;
    432 
    433     NDBFBlock.tileID  = tileID;
    434     NDBFBlock.sliceID = sliceID;
    435     NDBFBlock.posY    = TPelY;
    436     NDBFBlock.posX    = LPelX;
    437     NDBFBlock.startSU = currSU;
    438 
    439     UInt uiLastValidSU  = currSU;
    440     UInt uiIdx, uiLPelX_su, uiTPelY_su;
    441     for(uiIdx = currSU; uiIdx < currSU + maxNumSUInSGU; uiIdx++)
    442     {
    443       if(uiIdx > endSU)
    444       {
    445         break;       
    446       }
    447       uiLPelX_su   = LCUX + g_auiRasterToPelX[ g_auiZscanToRaster[uiIdx] ];
    448       uiTPelY_su   = LCUY + g_auiRasterToPelY[ g_auiZscanToRaster[uiIdx] ];
    449       if( !(uiLPelX_su < picWidth ) || !( uiTPelY_su < picHeight ))
    450       {
    451         continue;
    452       }
    453       pCUSliceMap[uiIdx] = sliceID;
    454       uiLastValidSU = uiIdx;
    455     }
    456     NDBFBlock.endSU = uiLastValidSU;
    457 
    458     UInt rTLSU = g_auiZscanToRaster[ NDBFBlock.startSU ];
    459     UInt rBRSU = g_auiZscanToRaster[ NDBFBlock.endSU   ];
    460     NDBFBlock.widthSU  = (rBRSU % maxNumSUInLCUWidth) - (rTLSU % maxNumSUInLCUWidth)+ 1;
    461     NDBFBlock.heightSU = (UInt)(rBRSU / maxNumSUInLCUWidth) - (UInt)(rTLSU / maxNumSUInLCUWidth)+ 1;
    462     NDBFBlock.width    = NDBFBlock.widthSU  * getMinCUWidth();
    463     NDBFBlock.height   = NDBFBlock.heightSU * getMinCUHeight();
    464 
    465     pcCU->getNDBFilterBlocks()->push_back(NDBFBlock);
    466 
    467     currSU += maxNumSUInSGU;
    468   }
    469 
    470 }
    471 
    472 /** destroy non-deblocked filter information for LCU
    473  */
    474 Void TComPic::destroyNonDBFilterInfo()
    475 {
    476   if(m_pbValidSlice != NULL)
    477   {
    478     delete[] m_pbValidSlice;
    479     m_pbValidSlice = NULL;
    480   }
    481 
    482   if(m_pSliceSUMap != NULL)
    483   {
    484     delete[] m_pSliceSUMap;
    485     m_pSliceSUMap = NULL;
    486   }
    487   for( UInt CUAddr = 0; CUAddr < getNumCUsInFrame() ; CUAddr++ )
    488   {
    489     TComDataCU* pcCU = getCU( CUAddr );
    490     pcCU->getNDBFilterBlocks()->clear();
    491   }
    492 
    493   if( m_bIndependentSliceBoundaryForNDBFilter || m_bIndependentTileBoundaryForNDBFilter)
    494   {
    495     m_pNDBFilterYuvTmp->destroy();
    496     delete m_pNDBFilterYuvTmp;
    497     m_pNDBFilterYuvTmp = NULL;
    498   }
    499 
    500 }
     170Bool  TComPic::getSAOMergeAvailability(Int currAddr, Int mergeAddr)
     171{
     172  Bool mergeCtbInSliceSeg = (mergeAddr >= getPicSym()->getCUOrderMap(getCU(currAddr)->getSlice()->getSliceCurStartCUAddr()/getNumPartInCU()));
     173  Bool mergeCtbInTile     = (getPicSym()->getTileIdxMap(mergeAddr) == getPicSym()->getTileIdxMap(currAddr));
     174  return (mergeCtbInSliceSeg && mergeCtbInTile);
     175}
     176
    501177#if H_MV
    502178Void TComPic::print( Bool legend )
  • branches/HTM-10.0rc1-dev0/source/Lib/TLibCommon/TComPic.h

    r655 r837  
    44 * granted under this license. 
    55 *
    6  * Copyright (c) 2010-2013, ITU/ISO/IEC
     6* Copyright (c) 2010-2014, ITU/ISO/IEC
    77 * All rights reserved.
    88 *
     
    7070  Bool                  m_bNeededForOutput;
    7171  UInt                  m_uiCurrSliceIdx;         // Index of current slice
    72   Int*                  m_pSliceSUMap;
    73   Bool*                 m_pbValidSlice;
    74   Int                   m_sliceGranularityForNDBFilter;
    75   Bool                  m_bIndependentSliceBoundaryForNDBFilter;
    76   Bool                  m_bIndependentTileBoundaryForNDBFilter;
    77   TComPicYuv*           m_pNDBFilterYuvTmp;    //!< temporary picture buffer when non-cross slice/tile boundary in-loop filtering is enabled
    7872  Bool                  m_bCheckLTMSB;
    7973 
     
    197191  Window&       getConformanceWindow()  { return m_conformanceWindow; }
    198192  Window&       getDefDisplayWindow()   { return m_defaultDisplayWindow; }
    199 
    200   Void          createNonDBFilterInfo   (std::vector<Int> sliceStartAddress, Int sliceGranularityDepth
    201                                         ,std::vector<Bool>* LFCrossSliceBoundary
    202                                         ,Int  numTiles = 1
    203                                         ,Bool bNDBFilterCrossTileBoundary = true);
    204   Void          createNonDBFilterInfoLCU(Int tileID, Int sliceID, TComDataCU* pcCU, UInt startSU, UInt endSU, Int sliceGranularyDepth, UInt picWidth, UInt picHeight);
    205   Void          destroyNonDBFilterInfo();
    206 
    207   Bool          getValidSlice                                  (Int sliceID)  {return m_pbValidSlice[sliceID];}
    208   Bool          getIndependentSliceBoundaryForNDBFilter        ()             {return m_bIndependentSliceBoundaryForNDBFilter;}
    209   Bool          getIndependentTileBoundaryForNDBFilter         ()             {return m_bIndependentTileBoundaryForNDBFilter; }
    210   TComPicYuv*   getYuvPicBufferForIndependentBoundaryProcessing()             {return m_pNDBFilterYuvTmp;}
    211   std::vector<TComDataCU*>& getOneSliceCUDataForNDBFilter      (Int sliceID) { return m_vSliceCUDataLink[sliceID];}
    212193
    213194
  • branches/HTM-10.0rc1-dev0/source/Lib/TLibCommon/TComPicSym.cpp

    r655 r837  
    44 * granted under this license. 
    55 *
    6  * Copyright (c) 2010-2013, ITU/ISO/IEC
     6* Copyright (c) 2010-2014, ITU/ISO/IEC
    77 * All rights reserved.
    88 *
     
    6767,m_puiTileIdxMap(NULL)
    6868,m_puiInverseCUOrderMap(NULL)
     69,m_saoBlkParams(NULL)
    6970{};
    7071
     
    122123    m_puiInverseCUOrderMap[i] = i;
    123124  }
    124   m_saoParam = NULL;
    125125}
    126126
     
    163163  m_puiInverseCUOrderMap = NULL;
    164164 
    165   if (m_saoParam)
    166   {
    167     TComSampleAdaptiveOffset::freeSaoParam(m_saoParam);
    168     delete m_saoParam;
    169     m_saoParam = NULL;
     165  if(m_saoBlkParams)
     166  {
     167    delete[] m_saoBlkParams; m_saoBlkParams = NULL;
    170168  }
    171169}
     
    308306}
    309307
    310 Void TComPicSym::allocSaoParam(TComSampleAdaptiveOffset *sao)
    311 {
    312   m_saoParam = new SAOParam;
    313   sao->allocSaoParam(m_saoParam);
     308Void TComPicSym::deriveLoopFilterBoundaryAvailibility(Int ctu,
     309                                                      Bool& isLeftAvail,
     310                                                      Bool& isRightAvail,
     311                                                      Bool& isAboveAvail,
     312                                                      Bool& isBelowAvail,
     313                                                      Bool& isAboveLeftAvail,
     314                                                      Bool& isAboveRightAvail,
     315                                                      Bool& isBelowLeftAvail,
     316                                                      Bool& isBelowRightAvail
     317                                                      )
     318{
     319
     320  isLeftAvail      = (ctu % m_uiWidthInCU != 0);
     321  isRightAvail     = (ctu % m_uiWidthInCU != m_uiWidthInCU-1);
     322  isAboveAvail     = (ctu >= m_uiWidthInCU );
     323  isBelowAvail     = (ctu <  m_uiNumCUsInFrame - m_uiWidthInCU);
     324  isAboveLeftAvail = (isAboveAvail && isLeftAvail);
     325  isAboveRightAvail= (isAboveAvail && isRightAvail);
     326  isBelowLeftAvail = (isBelowAvail && isLeftAvail);
     327  isBelowRightAvail= (isBelowAvail && isRightAvail);
     328
     329  Bool isLoopFiltAcrossTilePPS = getCU(ctu)->getSlice()->getPPS()->getLoopFilterAcrossTilesEnabledFlag();
     330
     331  {
     332    TComDataCU* ctuCurr  = getCU(ctu);
     333    TComDataCU* ctuLeft  = isLeftAvail ?getCU(ctu-1):NULL;
     334    TComDataCU* ctuRight = isRightAvail?getCU(ctu+1):NULL;
     335    TComDataCU* ctuAbove = isAboveAvail?getCU(ctu-m_uiWidthInCU):NULL;
     336    TComDataCU* ctuBelow = isBelowAvail?getCU(ctu+m_uiWidthInCU):NULL;
     337    TComDataCU* ctuAboveLeft  = isAboveLeftAvail ? getCU(ctu-m_uiWidthInCU-1):NULL;
     338    TComDataCU* ctuAboveRigtht= isAboveRightAvail? getCU(ctu-m_uiWidthInCU+1):NULL;
     339    TComDataCU* ctuBelowLeft  = isBelowLeftAvail ? getCU(ctu+m_uiWidthInCU-1):NULL;
     340    TComDataCU* ctuBelowRight = isBelowRightAvail? getCU(ctu+m_uiWidthInCU+1):NULL;
     341
     342    {
     343      //left
     344      if(ctuLeft != NULL)
     345      {
     346        isLeftAvail = (ctuCurr->getSlice()->getSliceCurStartCUAddr() != ctuLeft->getSlice()->getSliceCurStartCUAddr())?ctuCurr->getSlice()->getLFCrossSliceBoundaryFlag():true;
     347      }
     348      //above
     349      if(ctuAbove != NULL)
     350      {
     351        isAboveAvail = (ctuCurr->getSlice()->getSliceCurStartCUAddr() != ctuAbove->getSlice()->getSliceCurStartCUAddr())?ctuCurr->getSlice()->getLFCrossSliceBoundaryFlag():true;
     352      }
     353      //right
     354      if(ctuRight != NULL)
     355      {
     356        isRightAvail = (ctuCurr->getSlice()->getSliceCurStartCUAddr() != ctuRight->getSlice()->getSliceCurStartCUAddr())?ctuRight->getSlice()->getLFCrossSliceBoundaryFlag():true;
     357      }
     358      //below
     359      if(ctuBelow != NULL)
     360      {
     361        isBelowAvail = (ctuCurr->getSlice()->getSliceCurStartCUAddr() != ctuBelow->getSlice()->getSliceCurStartCUAddr())?ctuBelow->getSlice()->getLFCrossSliceBoundaryFlag():true;
     362      }
     363      //above-left
     364      if(ctuAboveLeft != NULL)
     365      {
     366        isAboveLeftAvail = (ctuCurr->getSlice()->getSliceCurStartCUAddr() != ctuAboveLeft->getSlice()->getSliceCurStartCUAddr())?ctuCurr->getSlice()->getLFCrossSliceBoundaryFlag():true;
     367      }
     368      //below-right
     369      if(ctuBelowRight != NULL)
     370{
     371        isBelowRightAvail = (ctuCurr->getSlice()->getSliceCurStartCUAddr() != ctuBelowRight->getSlice()->getSliceCurStartCUAddr())?ctuBelowRight->getSlice()->getLFCrossSliceBoundaryFlag():true;
     372      }
     373
     374
     375      //above-right
     376      if(ctuAboveRigtht != NULL)
     377      {
     378        Int curSliceStartEncOrder  = ctuCurr->getSlice()->getSliceCurStartCUAddr();
     379        Int aboveRigthtSliceStartEncOrder = ctuAboveRigtht->getSlice()->getSliceCurStartCUAddr();
     380
     381        isAboveRightAvail = (curSliceStartEncOrder == aboveRigthtSliceStartEncOrder)?(true):
     382          (
     383          (curSliceStartEncOrder > aboveRigthtSliceStartEncOrder)?(ctuCurr->getSlice()->getLFCrossSliceBoundaryFlag())
     384          :(ctuAboveRigtht->getSlice()->getLFCrossSliceBoundaryFlag())
     385          );         
     386      }
     387      //below-left
     388      if(ctuBelowLeft != NULL)
     389      {
     390        Int curSliceStartEncOrder  = ctuCurr->getSlice()->getSliceCurStartCUAddr();
     391        Int belowLeftSliceStartEncOrder = ctuBelowLeft->getSlice()->getSliceCurStartCUAddr();
     392
     393        isBelowLeftAvail = (curSliceStartEncOrder == belowLeftSliceStartEncOrder)?(true):
     394          (
     395          (curSliceStartEncOrder > belowLeftSliceStartEncOrder)?(ctuCurr->getSlice()->getLFCrossSliceBoundaryFlag())
     396          :(ctuBelowLeft->getSlice()->getLFCrossSliceBoundaryFlag())
     397          );
     398      }       
     399    }
     400
     401    if(!isLoopFiltAcrossTilePPS)
     402    {     
     403      isLeftAvail      = (!isLeftAvail      ) ?false:(getTileIdxMap( ctuLeft->getAddr()         ) == getTileIdxMap( ctu ));
     404      isAboveAvail     = (!isAboveAvail     ) ?false:(getTileIdxMap( ctuAbove->getAddr()        ) == getTileIdxMap( ctu ));
     405      isRightAvail     = (!isRightAvail     ) ?false:(getTileIdxMap( ctuRight->getAddr()        ) == getTileIdxMap( ctu ));
     406      isBelowAvail     = (!isBelowAvail     ) ?false:(getTileIdxMap( ctuBelow->getAddr()        ) == getTileIdxMap( ctu ));
     407      isAboveLeftAvail = (!isAboveLeftAvail ) ?false:(getTileIdxMap( ctuAboveLeft->getAddr()    ) == getTileIdxMap( ctu ));
     408      isAboveRightAvail= (!isAboveRightAvail) ?false:(getTileIdxMap( ctuAboveRigtht->getAddr()  ) == getTileIdxMap( ctu ));
     409      isBelowLeftAvail = (!isBelowLeftAvail ) ?false:(getTileIdxMap( ctuBelowLeft->getAddr()    ) == getTileIdxMap( ctu ));
     410      isBelowRightAvail= (!isBelowRightAvail) ?false:(getTileIdxMap( ctuBelowRight->getAddr()   ) == getTileIdxMap( ctu ));
     411    }
     412  }
     413
    314414}
    315415
  • branches/HTM-10.0rc1-dev0/source/Lib/TLibCommon/TComPicSym.h

    r655 r837  
    44 * granted under this license. 
    55 *
    6  * Copyright (c) 2010-2013, ITU/ISO/IEC
     6* Copyright (c) 2010-2014, ITU/ISO/IEC
    77 * All rights reserved.
    88 *
     
    107107  UInt*         m_puiInverseCUOrderMap;
    108108
    109   SAOParam *m_saoParam;
     109  SAOBlkParam *m_saoBlkParams;
    110110public:
    111111  Void        create  ( Int iPicWidth, Int iPicHeight, UInt uiMaxWidth, UInt uiMaxHeight, UInt uiMaxDepth );
     
    144144  Void         xInitTiles();
    145145  UInt         xCalculateNxtCUAddr( UInt uiCurrCUAddr );
    146   Void allocSaoParam(TComSampleAdaptiveOffset *sao);
    147   SAOParam *getSaoParam() { return m_saoParam; }
     146  SAOBlkParam* getSAOBlkParam() { return m_saoBlkParams;}
     147  Void deriveLoopFilterBoundaryAvailibility(Int ctu, Bool& isLeftAvail,Bool& isRightAvail,Bool& isAboveAvail,Bool& isBelowAvail,Bool& isAboveLeftAvail,Bool& isAboveRightAvail,Bool& isBelowLeftAvail,Bool& isBelowRightAvail);
     148
     149
    148150};// END CLASS DEFINITION TComPicSym
    149151
  • branches/HTM-10.0rc1-dev0/source/Lib/TLibCommon/TComPicYuv.cpp

    r608 r837  
    44 * granted under this license. 
    55 *
    6  * Copyright (c) 2010-2013, ITU/ISO/IEC
     6* Copyright (c) 2010-2014, ITU/ISO/IEC
    77 * All rights reserved.
    88 *
  • branches/HTM-10.0rc1-dev0/source/Lib/TLibCommon/TComPicYuv.h

    r608 r837  
    44 * granted under this license. 
    55 *
    6  * Copyright (c) 2010-2013, ITU/ISO/IEC
     6* Copyright (c) 2010-2014, ITU/ISO/IEC
    77 * All rights reserved.
    88 *
  • branches/HTM-10.0rc1-dev0/source/Lib/TLibCommon/TComPicYuvMD5.cpp

    r608 r837  
    44 * granted under this license.
    55 *
    6  * Copyright (c) 2010-2013, ITU/ISO/IEC
     6* Copyright (c) 2010-2014, ITU/ISO/IEC
    77 * All rights reserved.
    88 *
  • branches/HTM-10.0rc1-dev0/source/Lib/TLibCommon/TComPrediction.cpp

    r833 r837  
    44 * granted under this license. 
    55 *
    6  * Copyright (c) 2010-2013, ITU/ISO/IEC
     6* Copyright (c) 2010-2014, ITU/ISO/IEC
    77 * All rights reserved.
    88 *
  • branches/HTM-10.0rc1-dev0/source/Lib/TLibCommon/TComPrediction.h

    r833 r837  
    44 * granted under this license. 
    55 *
    6  * Copyright (c) 2010-2013, ITU/ISO/IEC
     6* Copyright (c) 2010-2014, ITU/ISO/IEC
    77 * All rights reserved.
    88 *
  • branches/HTM-10.0rc1-dev0/source/Lib/TLibCommon/TComRdCost.cpp

    r833 r837  
    44 * granted under this license. 
    55 *
    6  * Copyright (c) 2010-2013, ITU/ISO/IEC
     6* Copyright (c) 2010-2014, ITU/ISO/IEC
    77 * All rights reserved.
    88 *
     
    5151Double TComRdCost::m_dDisparityCoeff = 1.0;
    5252#endif
    53 
    5453TComRdCost::TComRdCost()
    5554{
     
    354353  }
    355354#endif
    356  
    357355  // initialize
    358356  rcDistParam.iSubShift  = 0;
     
    395393  }
    396394#endif
    397 
    398395  // initialize
    399396  rcDistParam.iSubShift  = 0;
     
    401398
    402399// Setting the Distortion Parameter for Inter (subpel ME with step)
    403 #if NS_HAD
    404 Void TComRdCost::setDistParam( TComPattern* pcPatternKey, Pel* piRefY, Int iRefStride, Int iStep, DistParam& rcDistParam, Bool bHADME, Bool bUseNSHAD )
    405 #else
    406400Void TComRdCost::setDistParam( TComPattern* pcPatternKey, Pel* piRefY, Int iRefStride, Int iStep, DistParam& rcDistParam, Bool bHADME )
    407 #endif
    408401{
    409402  // set Original & Curr Pointer / Stride
     
    420413  rcDistParam.iCols    = pcPatternKey->getROIYWidth();
    421414  rcDistParam.iRows    = pcPatternKey->getROIYHeight();
    422 #if NS_HAD
    423   rcDistParam.bUseNSHAD = bUseNSHAD;
    424 #endif
    425415 
    426416  // set distortion function
     
    454444  }
    455445#endif
    456  
    457446  // initialize
    458447  rcDistParam.iSubShift  = 0;
     
    460449
    461450Void
    462 #if NS_HAD
    463 TComRdCost::setDistParam( DistParam& rcDP, Pel* p1, Int iStride1, Pel* p2, Int iStride2, Int iWidth, Int iHeight, Bool bHadamard, Bool bUseNSHAD )
    464 #else
    465451TComRdCost::setDistParam( DistParam& rcDP, Int bitDepth, Pel* p1, Int iStride1, Pel* p2, Int iStride2, Int iWidth, Int iHeight, Bool bHadamard )
    466 #endif
    467452{
    468453  rcDP.pOrg       = p1;
     
    476461  rcDP.bitDepth   = bitDepth;
    477462  rcDP.DistFunc   = m_afpDistortFunc[ ( bHadamard ? DF_HADS : DF_SADS ) + g_aucConvertToBit[ iWidth ] + 1 ];
    478  
    479463#if H_3D_DBBP
    480464  if( m_bUseMask )
     
    482466    rcDP.DistFunc = (bHadamard)?TComRdCost::xGetMaskedHADs:TComRdCost::xGetMaskedSAD;
    483467  }
    484 #endif
    485  
    486 #if NS_HAD
    487   rcDP.bUseNSHAD  = bUseNSHAD;
    488468#endif
    489469}
     
    506486    }
    507487  }
    508   else if ( ( (iWidth % 4) == 0 ) && ( (iHeight % 4) == 0 ) )
    509   {
     488  else
     489  {
     490    assert(iWidth % 4 == 0 && iHeight % 4 == 0);
     491   
    510492    for ( y=0; y<iHeight; y+= 4 )
    511493    {
     
    518500    }
    519501  }
    520   else
    521   {
    522     for ( y=0; y<iHeight; y+= 2 )
    523     {
    524       for ( x=0; x<iWidth; x+= 2 )
    525       {
    526         uiSum += xCalcHADs8x8( &pi0[x], &pi1[x], iStride0, iStride1, 1 );
    527       }
    528       pi0 += iStride0*2;
    529       pi1 += iStride1*2;
    530     }
    531   }
    532502 
    533503  return uiSum >> DISTORTION_PRECISION_ADJUSTMENT(bitDepth-8);
     
    572542
    573543
    574 #if WEIGHTED_CHROMA_DISTORTION
    575544UInt TComRdCost::getDistPart(Int bitDepth, Pel* piCur, Int iCurStride,  Pel* piOrg, Int iOrgStride, UInt uiBlkWidth, UInt uiBlkHeight, TextType eText, DFunc eDFunc)
    576 #else
    577 UInt TComRdCost::getDistPart(Int bitDepth, Pel* piCur, Int iCurStride,  Pel* piOrg, Int iOrgStride, UInt uiBlkWidth, UInt uiBlkHeight, DFunc eDFunc )
    578 #endif
    579545{
    580546  DistParam cDtParam;
     
    596562  cDtParam.bUseSDCMRSAD = false;
    597563#endif
    598 #if WEIGHTED_CHROMA_DISTORTION
    599564  if (eText == TEXT_CHROMA_U)
    600565  {
     
    609574    return cDtParam.DistFunc( &cDtParam );
    610575  }
    611 #else
    612   return cDtParam.DistFunc( &cDtParam );
    613 #endif
    614576}
    615577#if H_3D_VSO
     
    664626#endif
    665627
    666 #if (RATE_CONTROL_LAMBDA_DOMAIN && !M0036_RC_IMPROVEMENT) || KWU_RC_MADPRED_E0227
     628#if KWU_RC_MADPRED_E0227
    667629UInt TComRdCost::getSADPart ( Int bitDepth, Pel* pelCur, Int curStride,  Pel* pelOrg, Int orgStride, UInt width, UInt height )
    668630{
     
    908870}
    909871#endif
    910 
    911872// --------------------------------------------------------------------------------------------------------------------
    912873// SAD
     
    34673428}
    34683429
    3469 #if NS_HAD
    3470 UInt TComRdCost::xCalcHADs16x4( Pel *piOrg, Pel *piCur, Int iStrideOrg, Int iStrideCur, Int iStep )
    3471 {
    3472   Int k, i, j, jj, sad=0;
    3473   Int diff[64], m1[4][16], m2[4][16];
    3474   assert( iStep == 1 );
    3475   for( k = 0; k < 64; k += 16 )
    3476   {
    3477     diff[k+0] = piOrg[0] - piCur[0];
    3478     diff[k+1] = piOrg[1] - piCur[1];
    3479     diff[k+2] = piOrg[2] - piCur[2];
    3480     diff[k+3] = piOrg[3] - piCur[3];
    3481     diff[k+4] = piOrg[4] - piCur[4];
    3482     diff[k+5] = piOrg[5] - piCur[5];
    3483     diff[k+6] = piOrg[6] - piCur[6];
    3484     diff[k+7] = piOrg[7] - piCur[7];
    3485 
    3486     diff[k+8]  = piOrg[8]  - piCur[8] ;
    3487     diff[k+9]  = piOrg[9]  - piCur[9] ;
    3488     diff[k+10] = piOrg[10] - piCur[10];
    3489     diff[k+11] = piOrg[11] - piCur[11];
    3490     diff[k+12] = piOrg[12] - piCur[12];
    3491     diff[k+13] = piOrg[13] - piCur[13];
    3492     diff[k+14] = piOrg[14] - piCur[14];
    3493     diff[k+15] = piOrg[15] - piCur[15];
    3494 
    3495     piCur += iStrideCur;
    3496     piOrg += iStrideOrg;
    3497   }
    3498 
    3499   //horizontal
    3500   for (j=0; j < 4; j++)
    3501   {
    3502     jj = j << 4;
    3503 
    3504     m2[j][0]  = diff[jj  ] + diff[jj+8];
    3505     m2[j][1]  = diff[jj+1] + diff[jj+9];
    3506     m2[j][2]  = diff[jj+2] + diff[jj+10];
    3507     m2[j][3]  = diff[jj+3] + diff[jj+11];
    3508     m2[j][4]  = diff[jj+4] + diff[jj+12];
    3509     m2[j][5]  = diff[jj+5] + diff[jj+13];
    3510     m2[j][6]  = diff[jj+6] + diff[jj+14];
    3511     m2[j][7]  = diff[jj+7] + diff[jj+15];
    3512     m2[j][8]  = diff[jj  ] - diff[jj+8];
    3513     m2[j][9]  = diff[jj+1] - diff[jj+9];
    3514     m2[j][10] = diff[jj+2] - diff[jj+10];
    3515     m2[j][11] = diff[jj+3] - diff[jj+11];
    3516     m2[j][12] = diff[jj+4] - diff[jj+12];
    3517     m2[j][13] = diff[jj+5] - diff[jj+13];
    3518     m2[j][14] = diff[jj+6] - diff[jj+14];
    3519     m2[j][15] = diff[jj+7] - diff[jj+15];
    3520 
    3521     m1[j][0]  = m2[j][0]  + m2[j][4];
    3522     m1[j][1]  = m2[j][1]  + m2[j][5];
    3523     m1[j][2]  = m2[j][2]  + m2[j][6];
    3524     m1[j][3]  = m2[j][3]  + m2[j][7];
    3525     m1[j][4]  = m2[j][0]  - m2[j][4];
    3526     m1[j][5]  = m2[j][1]  - m2[j][5];
    3527     m1[j][6]  = m2[j][2]  - m2[j][6];
    3528     m1[j][7]  = m2[j][3]  - m2[j][7];
    3529     m1[j][8]  = m2[j][8]  + m2[j][12];
    3530     m1[j][9]  = m2[j][9]  + m2[j][13];
    3531     m1[j][10] = m2[j][10] + m2[j][14];
    3532     m1[j][11] = m2[j][11] + m2[j][15];
    3533     m1[j][12] = m2[j][8]  - m2[j][12];
    3534     m1[j][13] = m2[j][9]  - m2[j][13];
    3535     m1[j][14] = m2[j][10] - m2[j][14];
    3536     m1[j][15] = m2[j][11] - m2[j][15];
    3537 
    3538     m2[j][0]  = m1[j][0]  + m1[j][2];
    3539     m2[j][1]  = m1[j][1]  + m1[j][3];
    3540     m2[j][2]  = m1[j][0]  - m1[j][2];
    3541     m2[j][3]  = m1[j][1]  - m1[j][3];
    3542     m2[j][4]  = m1[j][4]  + m1[j][6];
    3543     m2[j][5]  = m1[j][5]  + m1[j][7];
    3544     m2[j][6]  = m1[j][4]  - m1[j][6];
    3545     m2[j][7]  = m1[j][5]  - m1[j][7];
    3546     m2[j][8]  = m1[j][8]  + m1[j][10];
    3547     m2[j][9]  = m1[j][9]  + m1[j][11];
    3548     m2[j][10] = m1[j][8]  - m1[j][10];
    3549     m2[j][11] = m1[j][9]  - m1[j][11];
    3550     m2[j][12] = m1[j][12] + m1[j][14];
    3551     m2[j][13] = m1[j][13] + m1[j][15];
    3552     m2[j][14] = m1[j][12] - m1[j][14];
    3553     m2[j][15] = m1[j][13] - m1[j][15];
    3554 
    3555     m1[j][0]  = m2[j][0]  + m2[j][1];
    3556     m1[j][1]  = m2[j][0]  - m2[j][1];
    3557     m1[j][2]  = m2[j][2]  + m2[j][3];
    3558     m1[j][3]  = m2[j][2]  - m2[j][3];
    3559     m1[j][4]  = m2[j][4]  + m2[j][5];
    3560     m1[j][5]  = m2[j][4]  - m2[j][5];
    3561     m1[j][6]  = m2[j][6]  + m2[j][7];
    3562     m1[j][7]  = m2[j][6]  - m2[j][7];
    3563     m1[j][8]  = m2[j][8]  + m2[j][9];
    3564     m1[j][9]  = m2[j][8]  - m2[j][9];
    3565     m1[j][10] = m2[j][10] + m2[j][11];
    3566     m1[j][11] = m2[j][10] - m2[j][11];
    3567     m1[j][12] = m2[j][12] + m2[j][13];
    3568     m1[j][13] = m2[j][12] - m2[j][13];
    3569     m1[j][14] = m2[j][14] + m2[j][15];
    3570     m1[j][15] = m2[j][14] - m2[j][15];
    3571   }
    3572 
    3573   //vertical
    3574   for (i=0; i < 16; i++)
    3575   {   
    3576     m2[0][i] = m1[0][i] + m1[2][i];
    3577     m2[1][i] = m1[1][i] + m1[3][i];
    3578     m2[2][i] = m1[0][i] - m1[2][i];
    3579     m2[3][i] = m1[1][i] - m1[3][i];
    3580 
    3581     m1[0][i] = m2[0][i] + m2[1][i];
    3582     m1[1][i] = m2[0][i] - m2[1][i];
    3583     m1[2][i] = m2[2][i] + m2[3][i];
    3584     m1[3][i] = m2[2][i] - m2[3][i];
    3585   }
    3586 
    3587   for (i = 0; i < 4; i++)
    3588   {
    3589     for (j = 0; j < 16; j++)
    3590     {
    3591       sad += abs(m1[i][j]);
    3592     }
    3593   }
    3594 
    3595   sad=((sad+2)>>2);
    3596 
    3597   return sad;
    3598 }
    3599 
    3600 UInt TComRdCost::xCalcHADs4x16( Pel *piOrg, Pel *piCur, Int iStrideOrg, Int iStrideCur, Int iStep )
    3601 {
    3602   Int k, i, j, jj, sad=0;
    3603   Int diff[64], m1[16][4], m2[16][4], m3[16][4];
    3604   assert( iStep == 1 );
    3605   for( k = 0; k < 64; k += 4 )
    3606   {
    3607     diff[k+0] = piOrg[0] - piCur[0];
    3608     diff[k+1] = piOrg[1] - piCur[1];
    3609     diff[k+2] = piOrg[2] - piCur[2];
    3610     diff[k+3] = piOrg[3] - piCur[3];
    3611 
    3612     piCur += iStrideCur;
    3613     piOrg += iStrideOrg;
    3614   }
    3615 
    3616   //horizontal
    3617   for (j=0; j < 16; j++)
    3618   {
    3619     jj = j << 2;
    3620     m2[j][0] = diff[jj  ] + diff[jj+2];
    3621     m2[j][1] = diff[jj+1] + diff[jj+3];
    3622     m2[j][2] = diff[jj  ] - diff[jj+2];
    3623     m2[j][3] = diff[jj+1] - diff[jj+3];
    3624 
    3625     m1[j][0] = m2[j][0] + m2[j][1];
    3626     m1[j][1] = m2[j][0] - m2[j][1];
    3627     m1[j][2] = m2[j][2] + m2[j][3];
    3628     m1[j][3] = m2[j][2] - m2[j][3];
    3629   }
    3630 
    3631   //vertical
    3632   for (i=0; i < 4; i++)
    3633   {
    3634     m2[0][i]  = m1[0][i] + m1[8][i];
    3635     m2[1][i]  = m1[1][i] + m1[9][i];
    3636     m2[2][i]  = m1[2][i] + m1[10][i];
    3637     m2[3][i]  = m1[3][i] + m1[11][i];
    3638     m2[4][i]  = m1[4][i] + m1[12][i];
    3639     m2[5][i]  = m1[5][i] + m1[13][i];
    3640     m2[6][i]  = m1[6][i] + m1[14][i];
    3641     m2[7][i]  = m1[7][i] + m1[15][i];
    3642     m2[8][i]  = m1[0][i] - m1[8][i];
    3643     m2[9][i]  = m1[1][i] - m1[9][i];
    3644     m2[10][i] = m1[2][i] - m1[10][i];
    3645     m2[11][i] = m1[3][i] - m1[11][i];
    3646     m2[12][i] = m1[4][i] - m1[12][i];
    3647     m2[13][i] = m1[5][i] - m1[13][i];
    3648     m2[14][i] = m1[6][i] - m1[14][i];
    3649     m2[15][i] = m1[7][i] - m1[15][i];
    3650 
    3651     m3[0][i]  = m2[0][i]  + m2[4][i];
    3652     m3[1][i]  = m2[1][i]  + m2[5][i];
    3653     m3[2][i]  = m2[2][i]  + m2[6][i];
    3654     m3[3][i]  = m2[3][i]  + m2[7][i];
    3655     m3[4][i]  = m2[0][i]  - m2[4][i];
    3656     m3[5][i]  = m2[1][i]  - m2[5][i];
    3657     m3[6][i]  = m2[2][i]  - m2[6][i];
    3658     m3[7][i]  = m2[3][i]  - m2[7][i];
    3659     m3[8][i]  = m2[8][i]  + m2[12][i];
    3660     m3[9][i]  = m2[9][i]  + m2[13][i];
    3661     m3[10][i] = m2[10][i] + m2[14][i];
    3662     m3[11][i] = m2[11][i] + m2[15][i];
    3663     m3[12][i] = m2[8][i]  - m2[12][i];
    3664     m3[13][i] = m2[9][i]  - m2[13][i];
    3665     m3[14][i] = m2[10][i] - m2[14][i];
    3666     m3[15][i] = m2[11][i] - m2[15][i];
    3667 
    3668     m1[0][i]  = m3[0][i]  + m3[2][i];
    3669     m1[1][i]  = m3[1][i]  + m3[3][i];
    3670     m1[2][i]  = m3[0][i]  - m3[2][i];
    3671     m1[3][i]  = m3[1][i]  - m3[3][i];
    3672     m1[4][i]  = m3[4][i]  + m3[6][i];
    3673     m1[5][i]  = m3[5][i]  + m3[7][i];
    3674     m1[6][i]  = m3[4][i]  - m3[6][i];
    3675     m1[7][i]  = m3[5][i]  - m3[7][i];
    3676     m1[8][i]  = m3[8][i]  + m3[10][i];
    3677     m1[9][i]  = m3[9][i]  + m3[11][i];
    3678     m1[10][i] = m3[8][i]  - m3[10][i];
    3679     m1[11][i] = m3[9][i]  - m3[11][i];
    3680     m1[12][i] = m3[12][i] + m3[14][i];
    3681     m1[13][i] = m3[13][i] + m3[15][i];
    3682     m1[14][i] = m3[12][i] - m3[14][i];
    3683     m1[15][i] = m3[13][i] - m3[15][i];
    3684 
    3685     m2[0][i]  = m1[0][i]  + m1[1][i];
    3686     m2[1][i]  = m1[0][i]  - m1[1][i];
    3687     m2[2][i]  = m1[2][i]  + m1[3][i];
    3688     m2[3][i]  = m1[2][i]  - m1[3][i];
    3689     m2[4][i]  = m1[4][i]  + m1[5][i];
    3690     m2[5][i]  = m1[4][i]  - m1[5][i];
    3691     m2[6][i]  = m1[6][i]  + m1[7][i];
    3692     m2[7][i]  = m1[6][i]  - m1[7][i];
    3693     m2[8][i]  = m1[8][i]  + m1[9][i];
    3694     m2[9][i]  = m1[8][i]  - m1[9][i];
    3695     m2[10][i] = m1[10][i] + m1[11][i];
    3696     m2[11][i] = m1[10][i] - m1[11][i];
    3697     m2[12][i] = m1[12][i] + m1[13][i];
    3698     m2[13][i] = m1[12][i] - m1[13][i];
    3699     m2[14][i] = m1[14][i] + m1[15][i];
    3700     m2[15][i] = m1[14][i] - m1[15][i];
    3701   }
    3702 
    3703   for (i = 0; i < 16; i++)
    3704   {
    3705     for (j = 0; j < 4; j++)
    3706     {
    3707       sad += abs(m2[i][j]);
    3708     }
    3709   }
    3710 
    3711   sad=((sad+2)>>2);
    3712 
    3713   return sad;
    3714 }
    3715 #endif
    3716 
    37173430UInt TComRdCost::xGetHADs4( DistParam* pcDtParam )
    37183431{
     
    38093522  UInt uiSum = 0;
    38103523 
    3811 #if NS_HAD
    3812   if( ( ( iRows % 8 == 0) && (iCols % 8 == 0) && ( iRows == iCols ) ) || ( ( iRows % 8 == 0 ) && (iCols % 8 == 0) && !pcDtParam->bUseNSHAD ) )
    3813 #else
    38143524  if( ( iRows % 8 == 0) && (iCols % 8 == 0) )
    3815 #endif
    38163525  {
    38173526    Int  iOffsetOrg = iStrideOrg<<3;
     
    38273536    }
    38283537  }
    3829 #if NS_HAD
    3830   else if ( ( iCols > 8 ) && ( iCols > iRows ) && pcDtParam->bUseNSHAD )
    3831   {
    3832     Int  iOffsetOrg = iStrideOrg<<2;
    3833     Int  iOffsetCur = iStrideCur<<2;
    3834     for ( y=0; y<iRows; y+= 4 )
    3835     {
    3836       for ( x=0; x<iCols; x+= 16 )
    3837       {
    3838         uiSum += xCalcHADs16x4( &piOrg[x], &piCur[x*iStep], iStrideOrg, iStrideCur, iStep );
    3839       }
    3840       piOrg += iOffsetOrg;
    3841       piCur += iOffsetCur;
    3842     }
    3843   }
    3844   else if ( ( iRows > 8 ) && ( iCols < iRows ) && pcDtParam->bUseNSHAD )
    3845   {
    3846     Int  iOffsetOrg = iStrideOrg<<4;
    3847     Int  iOffsetCur = iStrideCur<<4;
    3848     for ( y=0; y<iRows; y+= 16 )
    3849     {
    3850       for ( x=0; x<iCols; x+= 4 )
    3851       {
    3852         uiSum += xCalcHADs4x16( &piOrg[x], &piCur[x*iStep], iStrideOrg, iStrideCur, iStep );
    3853       }
    3854       piOrg += iOffsetOrg;
    3855       piCur += iOffsetCur;
    3856     }
    3857   }
    3858 #endif
    38593538  else if( ( iRows % 4 == 0) && (iCols % 4 == 0) )
    38603539  {
  • branches/HTM-10.0rc1-dev0/source/Lib/TLibCommon/TComRdCost.h

    r833 r837  
    44 * granted under this license. 
    55 *
    6  * Copyright (c) 2010-2013, ITU/ISO/IEC
     6* Copyright (c) 2010-2014, ITU/ISO/IEC
    77 * All rights reserved.
    88 *
     
    107107  UInt            uiComp;           // uiComp = 0 (luma Y), 1 (chroma U), 2 (chroma V)
    108108
    109 #if NS_HAD
    110   Bool            bUseNSHAD;
    111 #endif
    112 
    113109  // (vertical) subsampling shift (for reducing complexity)
    114110  // - 0 = no subsampling, 1 = even rows, 2 = every 4th, etc.
     
    127123    iSubShift = 0;
    128124    bitDepth = 0;
    129 #if NS_HAD
    130     bUseNSHAD = false;
    131 #endif
    132125#if H_3D_VSO
    133126    // SAIT_VSO_EST_A0033
     
    155148#endif 
    156149 
    157 #if WEIGHTED_CHROMA_DISTORTION
    158150  Double                  m_cbDistortionWeight;
    159151  Double                  m_crDistortionWeight;
    160 #endif
    161152  Double                  m_dLambda;
    162153  Double                  m_sqrtLambda;
     
    201192
    202193 
    203 #if WEIGHTED_CHROMA_DISTORTION
    204194  Void    setCbDistortionWeight      ( Double cbDistortionWeight) { m_cbDistortionWeight = cbDistortionWeight; };
    205195  Void    setCrDistortionWeight      ( Double crDistortionWeight) { m_crDistortionWeight = crDistortionWeight; };
    206 #endif
    207196  Void    setLambda      ( Double dLambda );
    208197  Void    setFrameLambda ( Double dLambda ) { m_dFrameLambda = dLambda; }
     
    215204#endif
    216205
    217 #if RATE_CONTROL_LAMBDA_DOMAIN
    218206  Double  getLambda() { return m_dLambda; }
    219 #if M0036_RC_IMPROVEMENT
    220207  Double  getChromaWeight () {return((m_cbDistortionWeight+m_crDistortionWeight)/2.0);}
    221 #endif
    222 #endif
    223208 
    224209  // Distortion Functions
     
    227212  Void    setDistParam( UInt uiBlkWidth, UInt uiBlkHeight, DFunc eDFunc, DistParam& rcDistParam );
    228213  Void    setDistParam( TComPattern* pcPatternKey, Pel* piRefY, Int iRefStride,            DistParam& rcDistParam );
    229 #if NS_HAD
    230   Void    setDistParam( TComPattern* pcPatternKey, Pel* piRefY, Int iRefStride, Int iStep, DistParam& rcDistParam, Bool bHADME=false, Bool bUseNSHAD=false );
    231   Void    setDistParam( DistParam& rcDP, Int bitDepth, Pel* p1, Int iStride1, Pel* p2, Int iStride2, Int iWidth, Int iHeight, Bool bHadamard = false, Bool bUseNSHAD=false );
    232 #else
    233214  Void    setDistParam( TComPattern* pcPatternKey, Pel* piRefY, Int iRefStride, Int iStep, DistParam& rcDistParam, Bool bHADME=false );
    234215  Void    setDistParam( DistParam& rcDP, Int bitDepth, Pel* p1, Int iStride1, Pel* p2, Int iStride2, Int iWidth, Int iHeight, Bool bHadamard = false );
    235 #endif
    236216 
    237217#if H_3D_DBBP
     
    337317  static UInt xCalcHADs4x4      ( Pel *piOrg, Pel *piCurr, Int iStrideOrg, Int iStrideCur, Int iStep );
    338318  static UInt xCalcHADs8x8      ( Pel *piOrg, Pel *piCurr, Int iStrideOrg, Int iStrideCur, Int iStep );
    339 #if NS_HAD
    340   static UInt xCalcHADs16x4     ( Pel *piOrg, Pel *piCurr, Int iStrideOrg, Int iStrideCur, Int iStep );
    341   static UInt xCalcHADs4x16     ( Pel *piOrg, Pel *piCurr, Int iStrideOrg, Int iStrideCur, Int iStep );
    342 #endif
    343  
    344319#if H_3D_DBBP
    345320  static UInt xGetMaskedSSE     ( DistParam* pcDtParam );
     
    350325 
    351326public:
    352 #if WEIGHTED_CHROMA_DISTORTION
    353327  UInt   getDistPart(Int bitDepth, Pel* piCur, Int iCurStride,  Pel* piOrg, Int iOrgStride, UInt uiBlkWidth, UInt uiBlkHeight, TextType eText = TEXT_LUMA, DFunc eDFunc = DF_SSE );
    354 #else
    355   UInt   getDistPart(Int bitDepth, Pel* piCur, Int iCurStride,  Pel* piOrg, Int iOrgStride, UInt uiBlkWidth, UInt uiBlkHeight, DFunc eDFunc = DF_SSE );
    356 #endif
    357 
    358 #if (RATE_CONTROL_LAMBDA_DOMAIN && !M0036_RC_IMPROVEMENT) || KWU_RC_MADPRED_E0227
     328
     329#if KWU_RC_MADPRED_E0227
    359330  UInt   getSADPart ( Int bitDepth, Pel* pelCur, Int curStride,  Pel* pelOrg, Int orgStride, UInt width, UInt height );
    360331#endif
  • branches/HTM-10.0rc1-dev0/source/Lib/TLibCommon/TComRdCostWeightPrediction.cpp

    r608 r837  
    44 * granted under this license. 
    55 *
    6  * Copyright (c) 2010-2013, ITU/ISO/IEC
     6* Copyright (c) 2010-2014, ITU/ISO/IEC
    77 * All rights reserved.
    88 *
  • branches/HTM-10.0rc1-dev0/source/Lib/TLibCommon/TComRdCostWeightPrediction.h

    r608 r837  
    44 * granted under this license. 
    55 *
    6  * Copyright (c) 2010-2013, ITU/ISO/IEC
     6* Copyright (c) 2010-2014, ITU/ISO/IEC
    77 * All rights reserved.
    88 *
  • branches/HTM-10.0rc1-dev0/source/Lib/TLibCommon/TComRom.cpp

    r773 r837  
    44 * granted under this license. 
    55 *
    6  * Copyright (c) 2010-2013, ITU/ISO/IEC
     6* Copyright (c) 2010-2014, ITU/ISO/IEC
    77 * All rights reserved.
    88 *
     
    396396const UInt g_uiGroupIdx[ 32 ]   = {0,1,2,3,4,4,5,5,6,6,6,6,7,7,7,7,8,8,8,8,8,8,8,8,9,9,9,9,9,9,9,9};
    397397
    398 // Rice parameters for absolute transform levels
    399 const UInt g_auiGoRiceRange[5] =
    400 {
    401   7, 14, 26, 46, 78
    402 };
    403 
    404 const UInt g_auiGoRicePrefixLen[5] =
    405 {
    406   8, 7, 6, 5, 4
    407 };
    408 
    409398Void initSigLastScan(UInt* pBuffD, UInt* pBuffH, UInt* pBuffV, Int iWidth, Int iHeight)
    410399{
  • branches/HTM-10.0rc1-dev0/source/Lib/TLibCommon/TComRom.h

    r773 r837  
    44 * granted under this license. 
    55 *
    6  * Copyright (c) 2010-2013, ITU/ISO/IEC
     6* Copyright (c) 2010-2014, ITU/ISO/IEC
    77 * All rights reserved.
    88 *
     
    126126extern const UInt   g_uiMinInGroup[ 10 ];
    127127
    128 extern const UInt   g_auiGoRiceRange[5];                  //!< maximum value coded with Rice codes
    129 extern const UInt   g_auiGoRicePrefixLen[5];              //!< prefix length for each maximum value
    130  
    131128extern const UInt   g_sigLastScan8x8[ 3 ][ 4 ];           //!< coefficient group scan order for 8x8 TUs
    132129extern       UInt   g_sigLastScanCG32x32[ 64 ];
  • branches/HTM-10.0rc1-dev0/source/Lib/TLibCommon/TComSampleAdaptiveOffset.cpp

    r608 r837  
    44 * granted under this license. 
    55 *
    6  * Copyright (c) 2010-2013, ITU/ISO/IEC
     6 * Copyright (c) 2010-2014, ITU/ISO/IEC
    77 * All rights reserved.
    88 *
     
    4444//! \ingroup TLibCommon
    4545//! \{
    46 
    47 SAOParam::~SAOParam()
    48 {
    49   for (Int i = 0 ; i<3; i++)
    50   {
    51     if (psSaoPart[i])
    52     {
    53       delete [] psSaoPart[i];
    54     }
    55   }
    56 }
    57 
    58 // ====================================================================================================================
    59 // Tables
    60 // ====================================================================================================================
     46UInt g_saoMaxOffsetQVal[NUM_SAO_COMPONENTS];
     47
     48SAOOffset::SAOOffset()
     49{
     50  reset();
     51}
     52
     53SAOOffset::~SAOOffset()
     54{
     55
     56}
     57
     58Void SAOOffset::reset()
     59{
     60  modeIdc = SAO_MODE_OFF;
     61  typeIdc = -1;
     62  typeAuxInfo = -1;
     63  ::memset(offset, 0, sizeof(Int)* MAX_NUM_SAO_CLASSES);
     64}
     65
     66const SAOOffset& SAOOffset::operator= (const SAOOffset& src)
     67{
     68  modeIdc = src.modeIdc;
     69  typeIdc = src.typeIdc;
     70  typeAuxInfo = src.typeAuxInfo;
     71  ::memcpy(offset, src.offset, sizeof(Int)* MAX_NUM_SAO_CLASSES);
     72
     73  return *this;
     74}
     75
     76
     77SAOBlkParam::SAOBlkParam()
     78{
     79  reset();
     80}
     81
     82SAOBlkParam::~SAOBlkParam()
     83{
     84
     85}
     86
     87Void SAOBlkParam::reset()
     88{
     89  for(Int compIdx=0; compIdx< 3; compIdx++)
     90  {
     91    offsetParam[compIdx].reset();
     92  }
     93}
     94
     95const SAOBlkParam& SAOBlkParam::operator= (const SAOBlkParam& src)
     96{
     97  for(Int compIdx=0; compIdx< 3; compIdx++)
     98  {
     99    offsetParam[compIdx] = src.offsetParam[compIdx];
     100  }
     101  return *this;
     102
     103}
    61104
    62105TComSampleAdaptiveOffset::TComSampleAdaptiveOffset()
    63106{
    64   m_pClipTable = NULL;
    65   m_pClipTableBase = NULL;
    66   m_pChromaClipTable = NULL;
    67   m_pChromaClipTableBase = NULL;
    68   m_iOffsetBo = NULL;
    69   m_iChromaOffsetBo = NULL;
    70   m_lumaTableBo = NULL;
    71   m_chromaTableBo = NULL;
    72   m_iUpBuff1 = NULL;
    73   m_iUpBuff2 = NULL;
    74   m_iUpBufft = NULL;
    75   ipSwap = NULL;
    76 
    77   m_pTmpU1 = NULL;
    78   m_pTmpU2 = NULL;
    79   m_pTmpL1 = NULL;
    80   m_pTmpL2 = NULL;
    81 }
     107  m_tempPicYuv = NULL;
     108  for(Int compIdx=0; compIdx < NUM_SAO_COMPONENTS; compIdx++)
     109  {
     110    m_offsetClipTable[compIdx] = NULL;
     111  }
     112  m_signTable = NULL;
     113
     114 
     115  m_lineBufWidth = 0;
     116  m_signLineBuf1 = NULL;
     117  m_signLineBuf2 = NULL;
     118}
     119
    82120
    83121TComSampleAdaptiveOffset::~TComSampleAdaptiveOffset()
    84122{
    85 
    86 }
    87 
    88 const Int TComSampleAdaptiveOffset::m_aiNumCulPartsLevel[5] =
    89 {
    90   1,   //level 0
    91   5,   //level 1
    92   21,  //level 2
    93   85,  //level 3
    94   341, //level 4
    95 };
    96 
    97 const UInt TComSampleAdaptiveOffset::m_auiEoTable[9] =
    98 {
    99   1, //0   
    100   2, //1   
    101   0, //2
    102   3, //3
    103   4, //4
    104   0, //5 
    105   0, //6 
    106   0, //7
    107   0
    108 };
    109 
    110 const Int TComSampleAdaptiveOffset::m_iNumClass[MAX_NUM_SAO_TYPE] =
    111 {
    112   SAO_EO_LEN,
    113   SAO_EO_LEN,
    114   SAO_EO_LEN,
    115   SAO_EO_LEN,
    116   SAO_BO_LEN
    117 };
    118 
    119 const UInt TComSampleAdaptiveOffset::m_uiMaxDepth = SAO_MAX_DEPTH;
    120 
    121 
    122 /** convert Level Row Col to Idx
    123  * \param   level,  row,  col
    124  */
    125 Int  TComSampleAdaptiveOffset::convertLevelRowCol2Idx(Int level, Int row, Int col)
    126 {
    127   Int idx;
    128   if (level == 0)
    129   {
    130     idx = 0;
    131   }
    132   else if (level == 1)
    133   {
    134     idx = 1 + row*2 + col;
    135   }
    136   else if (level == 2)
    137   {
    138     idx = 5 + row*4 + col;
    139   }
    140   else if (level == 3)
    141   {
    142     idx = 21 + row*8 + col;
    143   }
    144   else // (level == 4)
    145   {
    146     idx = 85 + row*16 + col;
    147   }
    148   return idx;
    149 }
    150 
    151 /** create SampleAdaptiveOffset memory.
    152  * \param
    153  */
    154 Void TComSampleAdaptiveOffset::create( UInt uiSourceWidth, UInt uiSourceHeight, UInt uiMaxCUWidth, UInt uiMaxCUHeight )
    155 {
    156   m_iPicWidth  = uiSourceWidth;
    157   m_iPicHeight = uiSourceHeight;
    158 
    159   m_uiMaxCUWidth  = uiMaxCUWidth;
    160   m_uiMaxCUHeight = uiMaxCUHeight;
    161 
    162   m_iNumCuInWidth  = m_iPicWidth / m_uiMaxCUWidth;
    163   m_iNumCuInWidth += ( m_iPicWidth % m_uiMaxCUWidth ) ? 1 : 0;
    164 
    165   m_iNumCuInHeight  = m_iPicHeight / m_uiMaxCUHeight;
    166   m_iNumCuInHeight += ( m_iPicHeight % m_uiMaxCUHeight ) ? 1 : 0;
    167 
    168   Int iMaxSplitLevelHeight = (Int)(logf((Float)m_iNumCuInHeight)/logf(2.0));
    169   Int iMaxSplitLevelWidth  = (Int)(logf((Float)m_iNumCuInWidth )/logf(2.0));
    170 
    171   m_uiMaxSplitLevel = (iMaxSplitLevelHeight < iMaxSplitLevelWidth)?(iMaxSplitLevelHeight):(iMaxSplitLevelWidth);
    172   m_uiMaxSplitLevel = (m_uiMaxSplitLevel< m_uiMaxDepth)?(m_uiMaxSplitLevel):(m_uiMaxDepth);
    173   /* various structures are overloaded to store per component data.
    174    * m_iNumTotalParts must allow for sufficient storage in any allocated arrays */
    175   m_iNumTotalParts  = max(3,m_aiNumCulPartsLevel[m_uiMaxSplitLevel]);
    176 
    177   UInt uiPixelRangeY = 1 << g_bitDepthY;
    178   UInt uiBoRangeShiftY = g_bitDepthY - SAO_BO_BITS;
    179 
    180   m_lumaTableBo = new Pel [uiPixelRangeY];
    181   for (Int k2=0; k2<uiPixelRangeY; k2++)
    182   {
    183     m_lumaTableBo[k2] = 1 + (k2>>uiBoRangeShiftY);
    184   }
    185 
    186   UInt uiPixelRangeC = 1 << g_bitDepthC;
    187   UInt uiBoRangeShiftC = g_bitDepthC - SAO_BO_BITS;
    188 
    189   m_chromaTableBo = new Pel [uiPixelRangeC];
    190   for (Int k2=0; k2<uiPixelRangeC; k2++)
    191   {
    192     m_chromaTableBo[k2] = 1 + (k2>>uiBoRangeShiftC);
    193   }
    194 
    195   m_iUpBuff1 = new Int[m_iPicWidth+2];
    196   m_iUpBuff2 = new Int[m_iPicWidth+2];
    197   m_iUpBufft = new Int[m_iPicWidth+2];
    198 
    199   m_iUpBuff1++;
    200   m_iUpBuff2++;
    201   m_iUpBufft++;
    202   Pel i;
    203 
    204   UInt uiMaxY  = (1 << g_bitDepthY) - 1;;
    205   UInt uiMinY  = 0;
    206 
    207   Int iCRangeExt = uiMaxY>>1;
    208 
    209   m_pClipTableBase = new Pel[uiMaxY+2*iCRangeExt];
    210   m_iOffsetBo      = new Int[uiMaxY+2*iCRangeExt];
    211 
    212   for(i=0;i<(uiMinY+iCRangeExt);i++)
    213   {
    214     m_pClipTableBase[i] = uiMinY;
    215   }
    216 
    217   for(i=uiMinY+iCRangeExt;i<(uiMaxY+  iCRangeExt);i++)
    218   {
    219     m_pClipTableBase[i] = i-iCRangeExt;
    220   }
    221 
    222   for(i=uiMaxY+iCRangeExt;i<(uiMaxY+2*iCRangeExt);i++)
    223   {
    224     m_pClipTableBase[i] = uiMaxY;
    225   }
    226 
    227   m_pClipTable = &(m_pClipTableBase[iCRangeExt]);
    228 
    229   UInt uiMaxC  = (1 << g_bitDepthC) - 1;
    230   UInt uiMinC  = 0;
    231 
    232   Int iCRangeExtC = uiMaxC>>1;
    233 
    234   m_pChromaClipTableBase = new Pel[uiMaxC+2*iCRangeExtC];
    235   m_iChromaOffsetBo      = new Int[uiMaxC+2*iCRangeExtC];
    236 
    237   for(i=0;i<(uiMinC+iCRangeExtC);i++)
    238   {
    239     m_pChromaClipTableBase[i] = uiMinC;
    240   }
    241 
    242   for(i=uiMinC+iCRangeExtC;i<(uiMaxC+  iCRangeExtC);i++)
    243   {
    244     m_pChromaClipTableBase[i] = i-iCRangeExtC;
    245   }
    246 
    247   for(i=uiMaxC+iCRangeExtC;i<(uiMaxC+2*iCRangeExtC);i++)
    248   {
    249     m_pChromaClipTableBase[i] = uiMaxC;
    250   }
    251 
    252   m_pChromaClipTable = &(m_pChromaClipTableBase[iCRangeExtC]);
    253 
    254   m_pTmpL1 = new Pel [m_uiMaxCUHeight+1];
    255   m_pTmpL2 = new Pel [m_uiMaxCUHeight+1];
    256   m_pTmpU1 = new Pel [m_iPicWidth];
    257   m_pTmpU2 = new Pel [m_iPicWidth];
    258 }
    259 
    260 /** destroy SampleAdaptiveOffset memory.
    261  * \param
    262  */
     123  destroy();
     124 
     125  if (m_signLineBuf1) delete[] m_signLineBuf1; m_signLineBuf1 = NULL;
     126  if (m_signLineBuf2) delete[] m_signLineBuf2; m_signLineBuf2 = NULL;
     127}
     128
     129Void TComSampleAdaptiveOffset::create( Int picWidth, Int picHeight, UInt maxCUWidth, UInt maxCUHeight, UInt maxCUDepth )
     130{
     131  destroy();
     132
     133  m_picWidth = picWidth;   
     134  m_picHeight= picHeight;
     135  m_maxCUWidth= maxCUWidth;
     136  m_maxCUHeight= maxCUHeight;
     137
     138  m_numCTUInWidth = (m_picWidth/m_maxCUWidth) + ((m_picWidth % m_maxCUWidth)?1:0);
     139  m_numCTUInHeight= (m_picHeight/m_maxCUHeight) + ((m_picHeight % m_maxCUHeight)?1:0);
     140  m_numCTUsPic = m_numCTUInHeight*m_numCTUInWidth;
     141
     142  //temporary picture buffer
     143  if ( !m_tempPicYuv )
     144  {
     145    m_tempPicYuv = new TComPicYuv;
     146    m_tempPicYuv->create( m_picWidth, m_picHeight, m_maxCUWidth, m_maxCUHeight, maxCUDepth );
     147  }
     148
     149  //bit-depth related
     150  for(Int compIdx =0; compIdx < NUM_SAO_COMPONENTS; compIdx++)
     151  {
     152    Int bitDepthSample = (compIdx == SAO_Y)?g_bitDepthY:g_bitDepthC;
     153    m_offsetStepLog2  [compIdx] = max(bitDepthSample - MAX_SAO_TRUNCATED_BITDEPTH, 0);
     154    g_saoMaxOffsetQVal[compIdx] = (1<<(min(bitDepthSample,MAX_SAO_TRUNCATED_BITDEPTH)-5))-1; //Table 9-32, inclusive
     155  }
     156
     157  //look-up table for clipping
     158  for(Int compIdx =0; compIdx < NUM_SAO_COMPONENTS; compIdx++)
     159  {
     160    Int bitDepthSample = (compIdx == SAO_Y)?g_bitDepthY:g_bitDepthC; //exclusive
     161    Int maxSampleValue = (1<< bitDepthSample); //exclusive
     162    Int maxOffsetValue = (g_saoMaxOffsetQVal[compIdx] << m_offsetStepLog2[compIdx]);
     163
     164    m_offsetClipTable[compIdx] = new Int[(maxSampleValue + maxOffsetValue -1)+ (maxOffsetValue)+1 ]; //positive & negative range plus 0
     165    m_offsetClip[compIdx] = &(m_offsetClipTable[compIdx][maxOffsetValue]);
     166
     167    //assign clipped values
     168    Int* offsetClipPtr = m_offsetClip[compIdx];
     169    for(Int k=0; k< maxSampleValue; k++)
     170    {
     171      *(offsetClipPtr + k) = k;
     172    }
     173    for(Int k=0; k< maxOffsetValue; k++ )
     174    {
     175      *(offsetClipPtr + maxSampleValue+ k) = maxSampleValue-1;
     176      *(offsetClipPtr -k -1 )              = 0;
     177    }
     178    if(compIdx == SAO_Y) //g_bitDepthY is always larger than or equal to g_bitDepthC
     179    {
     180      m_signTable = new Short[ 2*(maxSampleValue-1) + 1 ];
     181      m_sign = &(m_signTable[maxSampleValue-1]);
     182
     183      m_sign[0] = 0;
     184      for(Int k=1; k< maxSampleValue; k++)
     185      {
     186        m_sign[k] = 1;
     187        m_sign[-k]= -1;
     188      }
     189    }
     190  } 
     191
     192}
     193
    263194Void TComSampleAdaptiveOffset::destroy()
    264195{
    265   if (m_pClipTableBase)
    266   {
    267     delete [] m_pClipTableBase; m_pClipTableBase = NULL;
    268   }
    269   if (m_iOffsetBo)
    270   {
    271     delete [] m_iOffsetBo; m_iOffsetBo = NULL;
    272   }
    273   if (m_lumaTableBo)
    274   {
    275     delete[] m_lumaTableBo; m_lumaTableBo = NULL;
    276   }
    277 
    278   if (m_pChromaClipTableBase)
    279   {
    280     delete [] m_pChromaClipTableBase; m_pChromaClipTableBase = NULL;
    281   }
    282   if (m_iChromaOffsetBo)
    283   {
    284     delete [] m_iChromaOffsetBo; m_iChromaOffsetBo = NULL;
    285   }
    286   if (m_chromaTableBo)
    287   {
    288     delete[] m_chromaTableBo; m_chromaTableBo = NULL;
    289   }
    290 
    291   if (m_iUpBuff1)
    292   {
    293     m_iUpBuff1--;
    294     delete [] m_iUpBuff1; m_iUpBuff1 = NULL;
    295   }
    296   if (m_iUpBuff2)
    297   {
    298     m_iUpBuff2--;
    299     delete [] m_iUpBuff2; m_iUpBuff2 = NULL;
    300   }
    301   if (m_iUpBufft)
    302   {
    303     m_iUpBufft--;
    304     delete [] m_iUpBufft; m_iUpBufft = NULL;
    305   }
    306   if (m_pTmpL1)
    307   {
    308     delete [] m_pTmpL1; m_pTmpL1 = NULL;
    309   }
    310   if (m_pTmpL2)
    311   {
    312     delete [] m_pTmpL2; m_pTmpL2 = NULL;
    313   }
    314   if (m_pTmpU1)
    315   {
    316     delete [] m_pTmpU1; m_pTmpU1 = NULL;
    317   }
    318   if (m_pTmpU2)
    319   {
    320     delete [] m_pTmpU2; m_pTmpU2 = NULL;
    321   }
    322 }
    323 
    324 /** allocate memory for SAO parameters
    325  * \param    *pcSaoParam
    326  */
    327 Void TComSampleAdaptiveOffset::allocSaoParam(SAOParam *pcSaoParam)
    328 {
    329   pcSaoParam->iMaxSplitLevel = m_uiMaxSplitLevel;
    330   pcSaoParam->psSaoPart[0] = new SAOQTPart[ m_aiNumCulPartsLevel[pcSaoParam->iMaxSplitLevel] ];
    331   initSAOParam(pcSaoParam, 0, 0, 0, -1, 0, m_iNumCuInWidth-1,  0, m_iNumCuInHeight-1,0);
    332   pcSaoParam->psSaoPart[1] = new SAOQTPart[ m_aiNumCulPartsLevel[pcSaoParam->iMaxSplitLevel] ];
    333   pcSaoParam->psSaoPart[2] = new SAOQTPart[ m_aiNumCulPartsLevel[pcSaoParam->iMaxSplitLevel] ];
    334   initSAOParam(pcSaoParam, 0, 0, 0, -1, 0, m_iNumCuInWidth-1,  0, m_iNumCuInHeight-1,1);
    335   initSAOParam(pcSaoParam, 0, 0, 0, -1, 0, m_iNumCuInWidth-1,  0, m_iNumCuInHeight-1,2);
    336   pcSaoParam->numCuInWidth  = m_iNumCuInWidth;
    337   pcSaoParam->numCuInHeight = m_iNumCuInHeight;
    338   pcSaoParam->saoLcuParam[0] = new SaoLcuParam [m_iNumCuInHeight*m_iNumCuInWidth];
    339   pcSaoParam->saoLcuParam[1] = new SaoLcuParam [m_iNumCuInHeight*m_iNumCuInWidth];
    340   pcSaoParam->saoLcuParam[2] = new SaoLcuParam [m_iNumCuInHeight*m_iNumCuInWidth];
    341 }
    342 
    343 /** initialize SAO parameters
    344  * \param    *pcSaoParam,  iPartLevel,  iPartRow,  iPartCol,  iParentPartIdx,  StartCUX,  EndCUX,  StartCUY,  EndCUY,  iYCbCr
    345  */
    346 Void TComSampleAdaptiveOffset::initSAOParam(SAOParam *pcSaoParam, Int iPartLevel, Int iPartRow, Int iPartCol, Int iParentPartIdx, Int StartCUX, Int EndCUX, Int StartCUY, Int EndCUY, Int iYCbCr)
    347 {
    348   Int j;
    349   Int iPartIdx = convertLevelRowCol2Idx(iPartLevel, iPartRow, iPartCol);
    350 
    351   SAOQTPart* pSaoPart;
    352 
    353   pSaoPart = &(pcSaoParam->psSaoPart[iYCbCr][iPartIdx]);
    354 
    355   pSaoPart->PartIdx   = iPartIdx;
    356   pSaoPart->PartLevel = iPartLevel;
    357   pSaoPart->PartRow   = iPartRow;
    358   pSaoPart->PartCol   = iPartCol;
    359 
    360   pSaoPart->StartCUX  = StartCUX;
    361   pSaoPart->EndCUX    = EndCUX;
    362   pSaoPart->StartCUY  = StartCUY;
    363   pSaoPart->EndCUY    = EndCUY;
    364 
    365   pSaoPart->UpPartIdx = iParentPartIdx;
    366   pSaoPart->iBestType   = -1;
    367   pSaoPart->iLength     =  0;
    368 
    369   pSaoPart->subTypeIdx = 0;
    370 
    371   for (j=0;j<MAX_NUM_SAO_OFFSETS;j++)
    372   {
    373     pSaoPart->iOffset[j] = 0;
    374   }
    375 
    376   if(pSaoPart->PartLevel != m_uiMaxSplitLevel)
    377   {
    378     Int DownLevel    = (iPartLevel+1 );
    379     Int DownRowStart = (iPartRow << 1);
    380     Int DownColStart = (iPartCol << 1);
    381 
    382     Int iDownRowIdx, iDownColIdx;
    383     Int NumCUWidth,  NumCUHeight;
    384     Int NumCULeft;
    385     Int NumCUTop;
    386 
    387     Int DownStartCUX, DownStartCUY;
    388     Int DownEndCUX, DownEndCUY;
    389 
    390     NumCUWidth  = EndCUX - StartCUX +1;
    391     NumCUHeight = EndCUY - StartCUY +1;
    392     NumCULeft   = (NumCUWidth  >> 1);
    393     NumCUTop    = (NumCUHeight >> 1);
    394 
    395     DownStartCUX= StartCUX;
    396     DownEndCUX  = DownStartCUX + NumCULeft - 1;
    397     DownStartCUY= StartCUY;
    398     DownEndCUY  = DownStartCUY + NumCUTop  - 1;
    399     iDownRowIdx = DownRowStart + 0;
    400     iDownColIdx = DownColStart + 0;
    401 
    402     pSaoPart->DownPartsIdx[0]= convertLevelRowCol2Idx(DownLevel, iDownRowIdx, iDownColIdx);
    403 
    404     initSAOParam(pcSaoParam, DownLevel, iDownRowIdx, iDownColIdx, iPartIdx, DownStartCUX, DownEndCUX, DownStartCUY, DownEndCUY, iYCbCr);
    405 
    406     DownStartCUX = StartCUX + NumCULeft;
    407     DownEndCUX   = EndCUX;
    408     DownStartCUY = StartCUY;
    409     DownEndCUY   = DownStartCUY + NumCUTop -1;
    410     iDownRowIdx  = DownRowStart + 0;
    411     iDownColIdx  = DownColStart + 1;
    412 
    413     pSaoPart->DownPartsIdx[1] = convertLevelRowCol2Idx(DownLevel, iDownRowIdx, iDownColIdx);
    414 
    415     initSAOParam(pcSaoParam, DownLevel, iDownRowIdx, iDownColIdx, iPartIdx,  DownStartCUX, DownEndCUX, DownStartCUY, DownEndCUY, iYCbCr);
    416 
    417     DownStartCUX = StartCUX;
    418     DownEndCUX   = DownStartCUX + NumCULeft -1;
    419     DownStartCUY = StartCUY + NumCUTop;
    420     DownEndCUY   = EndCUY;
    421     iDownRowIdx  = DownRowStart + 1;
    422     iDownColIdx  = DownColStart + 0;
    423 
    424     pSaoPart->DownPartsIdx[2] = convertLevelRowCol2Idx(DownLevel, iDownRowIdx, iDownColIdx);
    425 
    426     initSAOParam(pcSaoParam, DownLevel, iDownRowIdx, iDownColIdx, iPartIdx, DownStartCUX, DownEndCUX, DownStartCUY, DownEndCUY, iYCbCr);
    427 
    428     DownStartCUX = StartCUX+ NumCULeft;
    429     DownEndCUX   = EndCUX;
    430     DownStartCUY = StartCUY + NumCUTop;
    431     DownEndCUY   = EndCUY;
    432     iDownRowIdx  = DownRowStart + 1;
    433     iDownColIdx  = DownColStart + 1;
    434 
    435     pSaoPart->DownPartsIdx[3] = convertLevelRowCol2Idx(DownLevel, iDownRowIdx, iDownColIdx);
    436 
    437     initSAOParam(pcSaoParam, DownLevel, iDownRowIdx, iDownColIdx, iPartIdx,DownStartCUX, DownEndCUX, DownStartCUY, DownEndCUY, iYCbCr);
    438   }
    439   else
    440   {
    441     pSaoPart->DownPartsIdx[0]=pSaoPart->DownPartsIdx[1]= pSaoPart->DownPartsIdx[2]= pSaoPart->DownPartsIdx[3]= -1;
    442   }
    443 }
    444 
    445 /** free memory of SAO parameters
    446  * \param   pcSaoParam
    447  */
    448 Void TComSampleAdaptiveOffset::freeSaoParam(SAOParam *pcSaoParam)
    449 {
    450   delete [] pcSaoParam->psSaoPart[0];
    451   delete [] pcSaoParam->psSaoPart[1];
    452   delete [] pcSaoParam->psSaoPart[2];
    453   pcSaoParam->psSaoPart[0] = 0;
    454   pcSaoParam->psSaoPart[1] = 0;
    455   pcSaoParam->psSaoPart[2] = 0;
    456   if( pcSaoParam->saoLcuParam[0])
    457   {
    458     delete [] pcSaoParam->saoLcuParam[0]; pcSaoParam->saoLcuParam[0] = NULL;
    459   }
    460   if( pcSaoParam->saoLcuParam[1])
    461   {
    462     delete [] pcSaoParam->saoLcuParam[1]; pcSaoParam->saoLcuParam[1] = NULL;
    463   }
    464   if( pcSaoParam->saoLcuParam[2])
    465   {
    466     delete [] pcSaoParam->saoLcuParam[2]; pcSaoParam->saoLcuParam[2] = NULL;
    467   }
    468 }
    469 
    470 /** reset SAO parameters
    471  * \param   pcSaoParam
    472  */
    473 Void TComSampleAdaptiveOffset::resetSAOParam(SAOParam *pcSaoParam)
    474 {
    475   Int iNumComponet = 3;
    476   for(Int c=0; c<iNumComponet; c++)
    477   {
    478 if (c<2)
    479   {
    480     pcSaoParam->bSaoFlag[c] = 0;
    481   }
    482     for(Int i=0; i< m_aiNumCulPartsLevel[m_uiMaxSplitLevel]; i++)
    483     {
    484       pcSaoParam->psSaoPart[c][i].iBestType     = -1;
    485       pcSaoParam->psSaoPart[c][i].iLength       =  0;
    486       pcSaoParam->psSaoPart[c][i].bSplit        = false;
    487       pcSaoParam->psSaoPart[c][i].bProcessed    = false;
    488       pcSaoParam->psSaoPart[c][i].dMinCost      = MAX_DOUBLE;
    489       pcSaoParam->psSaoPart[c][i].iMinDist      = MAX_INT;
    490       pcSaoParam->psSaoPart[c][i].iMinRate      = MAX_INT;
    491       pcSaoParam->psSaoPart[c][i].subTypeIdx    = 0;
    492       for (Int j=0;j<MAX_NUM_SAO_OFFSETS;j++)
    493       {
    494         pcSaoParam->psSaoPart[c][i].iOffset[j] = 0;
    495         pcSaoParam->psSaoPart[c][i].iOffset[j] = 0;
    496         pcSaoParam->psSaoPart[c][i].iOffset[j] = 0;
    497       }
    498     }
    499     pcSaoParam->oneUnitFlag[0]   = 0;
    500     pcSaoParam->oneUnitFlag[1]   = 0;
    501     pcSaoParam->oneUnitFlag[2]   = 0;
    502     resetLcuPart(pcSaoParam->saoLcuParam[0]);
    503     resetLcuPart(pcSaoParam->saoLcuParam[1]);
    504     resetLcuPart(pcSaoParam->saoLcuParam[2]);
    505   }
    506 }
    507 
    508 /** get the sign of input variable
    509  * \param   x
    510  */
    511 inline Int xSign(Int x)
    512 {
    513   return ((x >> 31) | ((Int)( (((UInt) -x)) >> 31)));
    514 }
    515 
    516 /** initialize variables for SAO process
    517  * \param  pcPic picture data pointer
    518  */
    519 Void TComSampleAdaptiveOffset::createPicSaoInfo(TComPic* pcPic)
    520 {
    521   m_pcPic   = pcPic;
    522   m_bUseNIF = ( pcPic->getIndependentSliceBoundaryForNDBFilter() || pcPic->getIndependentTileBoundaryForNDBFilter() );
    523   if(m_bUseNIF)
    524   {
    525     m_pcYuvTmp = pcPic->getYuvPicBufferForIndependentBoundaryProcessing();
    526   }
    527 }
    528 
    529 Void TComSampleAdaptiveOffset::destroyPicSaoInfo()
    530 {
    531 
    532 }
    533 
    534 /** sample adaptive offset process for one LCU
    535  * \param   iAddr, iSaoType, iYCbCr
    536  */
    537 Void TComSampleAdaptiveOffset::processSaoCu(Int iAddr, Int iSaoType, Int iYCbCr)
    538 {
    539   if(!m_bUseNIF)
    540   {
    541     processSaoCuOrg( iAddr, iSaoType, iYCbCr);
    542   }
    543   else
    544   { 
    545     Int  isChroma = (iYCbCr != 0)? 1:0;
    546     Int  stride   = (iYCbCr != 0)?(m_pcPic->getCStride()):(m_pcPic->getStride());
    547     Pel* pPicRest = getPicYuvAddr(m_pcPic->getPicYuvRec(), iYCbCr);
    548     Pel* pPicDec  = getPicYuvAddr(m_pcYuvTmp, iYCbCr);
    549 
    550     std::vector<NDBFBlockInfo>& vFilterBlocks = *(m_pcPic->getCU(iAddr)->getNDBFilterBlocks());
    551 
    552     //variables
    553     UInt  xPos, yPos, width, height;
    554     Bool* pbBorderAvail;
    555     UInt  posOffset;
    556 
    557     for(Int i=0; i< vFilterBlocks.size(); i++)
    558     {
    559       xPos        = vFilterBlocks[i].posX   >> isChroma;
    560       yPos        = vFilterBlocks[i].posY   >> isChroma;
    561       width       = vFilterBlocks[i].width  >> isChroma;
    562       height      = vFilterBlocks[i].height >> isChroma;
    563       pbBorderAvail = vFilterBlocks[i].isBorderAvailable;
    564 
    565       posOffset = (yPos* stride) + xPos;
    566 
    567       processSaoBlock(pPicDec+ posOffset, pPicRest+ posOffset, stride, iSaoType, width, height, pbBorderAvail, iYCbCr);
    568     }
    569   }
    570 }
    571 
    572 /** Perform SAO for non-cross-slice or non-cross-tile process
    573  * \param  pDec to-be-filtered block buffer pointer
    574  * \param  pRest filtered block buffer pointer
    575  * \param  stride picture buffer stride
    576  * \param  saoType SAO offset type
    577  * \param  xPos x coordinate
    578  * \param  yPos y coordinate
    579  * \param  width block width
    580  * \param  height block height
    581  * \param  pbBorderAvail availabilities of block border pixels
    582  */
    583 Void TComSampleAdaptiveOffset::processSaoBlock(Pel* pDec, Pel* pRest, Int stride, Int saoType, UInt width, UInt height, Bool* pbBorderAvail, Int iYCbCr)
    584 {
    585   //variables
    586   Int startX, startY, endX, endY, x, y;
    587   Int signLeft,signRight,signDown,signDown1;
    588   UInt edgeType;
    589   Pel *pClipTbl = (iYCbCr==0)?m_pClipTable:m_pChromaClipTable;
    590   Int *pOffsetBo = (iYCbCr==0)?m_iOffsetBo: m_iChromaOffsetBo;
    591 
    592   switch (saoType)
    593   {
    594   case SAO_EO_0: // dir: -
    595     {
    596 
    597       startX = (pbBorderAvail[SGU_L]) ? 0 : 1;
    598       endX   = (pbBorderAvail[SGU_R]) ? width : (width -1);
     196  if ( m_tempPicYuv )
     197  {
     198    m_tempPicYuv->destroy();
     199    delete m_tempPicYuv;
     200    m_tempPicYuv = NULL;
     201  }
     202
     203  for(Int compIdx=0; compIdx < NUM_SAO_COMPONENTS; compIdx++)
     204  {
     205    if(m_offsetClipTable[compIdx])
     206    {
     207      delete[] m_offsetClipTable[compIdx]; m_offsetClipTable[compIdx] = NULL;
     208    }
     209  }
     210  if( m_signTable )
     211  {
     212    delete[] m_signTable; m_signTable = NULL;
     213  }
     214}
     215
     216Void TComSampleAdaptiveOffset::invertQuantOffsets(Int compIdx, Int typeIdc, Int typeAuxInfo, Int* dstOffsets, Int* srcOffsets)
     217{
     218  Int codedOffset[MAX_NUM_SAO_CLASSES];
     219
     220  ::memcpy(codedOffset, srcOffsets, sizeof(Int)*MAX_NUM_SAO_CLASSES);
     221  ::memset(dstOffsets, 0, sizeof(Int)*MAX_NUM_SAO_CLASSES);
     222
     223  if(typeIdc == SAO_TYPE_START_BO)
     224  {
     225    for(Int i=0; i< 4; i++)
     226    {
     227      dstOffsets[(typeAuxInfo+ i)%NUM_SAO_BO_CLASSES] = codedOffset[(typeAuxInfo+ i)%NUM_SAO_BO_CLASSES]*(1<<m_offsetStepLog2[compIdx]);
     228    }
     229  }
     230  else //EO
     231  {
     232    for(Int i=0; i< NUM_SAO_EO_CLASSES; i++)
     233    {
     234      dstOffsets[i] = codedOffset[i] *(1<<m_offsetStepLog2[compIdx]);
     235    }
     236    assert(dstOffsets[SAO_CLASS_EO_PLAIN] == 0); //keep EO plain offset as zero
     237  }
     238
     239}
     240
     241Int TComSampleAdaptiveOffset::getMergeList(TComPic* pic, Int ctu, SAOBlkParam* blkParams, std::vector<SAOBlkParam*>& mergeList)
     242{
     243  Int ctuX = ctu % m_numCTUInWidth;
     244  Int ctuY = ctu / m_numCTUInWidth;
     245  Int mergedCTUPos;
     246  Int numValidMergeCandidates = 0;
     247
     248  for(Int mergeType=0; mergeType< NUM_SAO_MERGE_TYPES; mergeType++)
     249  {
     250    SAOBlkParam* mergeCandidate = NULL;
     251
     252    switch(mergeType)
     253    {
     254    case SAO_MERGE_ABOVE:
     255      {
     256        if(ctuY > 0)
     257        {
     258          mergedCTUPos = ctu- m_numCTUInWidth;
     259          if( pic->getSAOMergeAvailability(ctu, mergedCTUPos) )
     260          {
     261            mergeCandidate = &(blkParams[mergedCTUPos]);
     262          }
     263        }
     264      }
     265      break;
     266    case SAO_MERGE_LEFT:
     267      {
     268        if(ctuX > 0)
     269        {
     270          mergedCTUPos = ctu- 1;
     271          if( pic->getSAOMergeAvailability(ctu, mergedCTUPos) )
     272          {
     273            mergeCandidate = &(blkParams[mergedCTUPos]);
     274          }
     275        }
     276      }
     277      break;
     278    default:
     279      {
     280        printf("not a supported merge type");
     281        assert(0);
     282        exit(-1);
     283      }
     284    }
     285
     286    mergeList.push_back(mergeCandidate);
     287    if (mergeCandidate != NULL)
     288    {
     289      numValidMergeCandidates++;
     290    }
     291  }
     292
     293  return numValidMergeCandidates;
     294}
     295
     296
     297Void TComSampleAdaptiveOffset::reconstructBlkSAOParam(SAOBlkParam& recParam, std::vector<SAOBlkParam*>& mergeList)
     298{
     299  for(Int compIdx=0; compIdx< NUM_SAO_COMPONENTS; compIdx++)
     300  {
     301    SAOOffset& offsetParam = recParam[compIdx];
     302
     303    if(offsetParam.modeIdc == SAO_MODE_OFF)
     304    {
     305      continue;
     306    }
     307
     308    switch(offsetParam.modeIdc)
     309    {
     310    case SAO_MODE_NEW:
     311      {
     312        invertQuantOffsets(compIdx, offsetParam.typeIdc, offsetParam.typeAuxInfo, offsetParam.offset, offsetParam.offset);
     313      }
     314      break;
     315    case SAO_MODE_MERGE:
     316      {
     317        SAOBlkParam* mergeTarget = mergeList[offsetParam.typeIdc];
     318        assert(mergeTarget != NULL);
     319
     320        offsetParam = (*mergeTarget)[compIdx];
     321      }
     322      break;
     323    default:
     324      {
     325        printf("Not a supported mode");
     326        assert(0);
     327        exit(-1);
     328      }
     329    }
     330  }
     331}
     332
     333Void TComSampleAdaptiveOffset::reconstructBlkSAOParams(TComPic* pic, SAOBlkParam* saoBlkParams)
     334{
     335  m_picSAOEnabled[SAO_Y] = m_picSAOEnabled[SAO_Cb] = m_picSAOEnabled[SAO_Cr] = false;
     336
     337  for(Int ctu=0; ctu< m_numCTUsPic; ctu++)
     338  {
     339    std::vector<SAOBlkParam*> mergeList;
     340    getMergeList(pic, ctu, saoBlkParams, mergeList);
     341
     342    reconstructBlkSAOParam(saoBlkParams[ctu], mergeList);
     343
     344    for(Int compIdx=0; compIdx< NUM_SAO_COMPONENTS; compIdx++)
     345    {
     346      if(saoBlkParams[ctu][compIdx].modeIdc != SAO_MODE_OFF)
     347      {
     348        m_picSAOEnabled[compIdx] = true;
     349      }
     350    }
     351  }
     352
     353
     354}
     355
     356
     357Void TComSampleAdaptiveOffset::offsetBlock(Int compIdx, Int typeIdx, Int* offset 
     358                                          , Pel* srcBlk, Pel* resBlk, Int srcStride, Int resStride,  Int width, Int height
     359                                          , Bool isLeftAvail,  Bool isRightAvail, Bool isAboveAvail, Bool isBelowAvail, Bool isAboveLeftAvail, Bool isAboveRightAvail, Bool isBelowLeftAvail, Bool isBelowRightAvail)
     360{
     361  if(m_lineBufWidth != m_maxCUWidth)
     362  {
     363    m_lineBufWidth = m_maxCUWidth;
     364   
     365    if (m_signLineBuf1) delete[] m_signLineBuf1; m_signLineBuf1 = NULL;
     366    m_signLineBuf1 = new Char[m_lineBufWidth+1];
     367   
     368    if (m_signLineBuf2) delete[] m_signLineBuf2; m_signLineBuf2 = NULL;
     369    m_signLineBuf2 = new Char[m_lineBufWidth+1];
     370  }
     371
     372  Int* offsetClip = m_offsetClip[compIdx];
     373
     374  Int x,y, startX, startY, endX, endY, edgeType;
     375  Int firstLineStartX, firstLineEndX, lastLineStartX, lastLineEndX;
     376  Char signLeft, signRight, signDown;
     377
     378  Pel* srcLine = srcBlk;
     379  Pel* resLine = resBlk;
     380
     381  switch(typeIdx)
     382  {
     383  case SAO_TYPE_EO_0:
     384    {
     385      offset += 2;
     386      startX = isLeftAvail ? 0 : 1;
     387      endX   = isRightAvail ? width : (width -1);
    599388      for (y=0; y< height; y++)
    600389      {
    601         signLeft = xSign(pDec[startX] - pDec[startX-1]);
     390        signLeft = (Char)m_sign[srcLine[startX] - srcLine[startX-1]];
    602391        for (x=startX; x< endX; x++)
    603392        {
    604           signRight =  xSign(pDec[x] - pDec[x+1]);
    605           edgeType =  signRight + signLeft + 2;
     393          signRight = (Char)m_sign[srcLine[x] - srcLine[x+1]];
     394          edgeType =  signRight + signLeft;
    606395          signLeft  = -signRight;
    607396
    608           pRest[x] = pClipTbl[pDec[x] + m_iOffsetEo[edgeType]];
     397          resLine[x] = offsetClip[srcLine[x] + offset[edgeType]];
    609398        }
    610         pDec  += stride;
    611         pRest += stride;
    612       }
    613       break;
    614     }
    615   case SAO_EO_1: // dir: |
    616     {
    617       startY = (pbBorderAvail[SGU_T]) ? 0 : 1;
    618       endY   = (pbBorderAvail[SGU_B]) ? height : height-1;
    619       if (!pbBorderAvail[SGU_T])
    620       {
    621         pDec  += stride;
    622         pRest += stride;
    623       }
     399        srcLine  += srcStride;
     400        resLine += resStride;
     401      }
     402
     403    }
     404    break;
     405  case SAO_TYPE_EO_90:
     406    {
     407      offset += 2;
     408      Char *signUpLine = m_signLineBuf1;
     409
     410      startY = isAboveAvail ? 0 : 1;
     411      endY   = isBelowAvail ? height : height-1;
     412      if (!isAboveAvail)
     413      {
     414        srcLine += srcStride;
     415        resLine += resStride;
     416      }
     417
     418      Pel* srcLineAbove= srcLine- srcStride;
    624419      for (x=0; x< width; x++)
    625420      {
    626         m_iUpBuff1[x] = xSign(pDec[x] - pDec[x-stride]);
    627       }
     421        signUpLine[x] = (Char)m_sign[srcLine[x] - srcLineAbove[x]];
     422      }
     423
     424      Pel* srcLineBelow;
    628425      for (y=startY; y<endY; y++)
    629426      {
     427        srcLineBelow= srcLine+ srcStride;
     428
    630429        for (x=0; x< width; x++)
    631430        {
    632           signDown  = xSign(pDec[x] - pDec[x+stride]);
    633           edgeType = signDown + m_iUpBuff1[x] + 2;
    634           m_iUpBuff1[x]= -signDown;
    635 
    636           pRest[x] = pClipTbl[pDec[x] + m_iOffsetEo[edgeType]];
     431          signDown  = (Char)m_sign[srcLine[x] - srcLineBelow[x]];
     432          edgeType = signDown + signUpLine[x];
     433          signUpLine[x]= -signDown;
     434
     435          resLine[x] = offsetClip[srcLine[x] + offset[edgeType]];
    637436        }
    638         pDec  += stride;
    639         pRest += stride;
    640       }
    641       break;
    642     }
    643   case SAO_EO_2: // dir: 135
    644     {
    645       Int posShift= stride + 1;
    646 
    647       startX = (pbBorderAvail[SGU_L]) ? 0 : 1 ;
    648       endX   = (pbBorderAvail[SGU_R]) ? width : (width-1);
    649 
    650       //prepare 2nd line upper sign
    651       pDec += stride;
     437        srcLine += srcStride;
     438        resLine += resStride;
     439      }
     440
     441    }
     442    break;
     443  case SAO_TYPE_EO_135:
     444    {
     445      offset += 2;
     446      Char *signUpLine, *signDownLine, *signTmpLine;
     447
     448      signUpLine  = m_signLineBuf1;
     449      signDownLine= m_signLineBuf2;
     450
     451      startX = isLeftAvail ? 0 : 1 ;
     452      endX   = isRightAvail ? width : (width-1);
     453
     454      //prepare 2nd line's upper sign
     455      Pel* srcLineBelow= srcLine+ srcStride;
    652456      for (x=startX; x< endX+1; x++)
    653457      {
    654         m_iUpBuff1[x] = xSign(pDec[x] - pDec[x- posShift]);
     458        signUpLine[x] = (Char)m_sign[srcLineBelow[x] - srcLine[x- 1]];
    655459      }
    656460
    657461      //1st line
    658       pDec -= stride;
    659       if(pbBorderAvail[SGU_TL])
    660       {
    661         x= 0;
    662         edgeType      =  xSign(pDec[x] - pDec[x- posShift]) - m_iUpBuff1[x+1] + 2;
    663         pRest[x] = pClipTbl[pDec[x] + m_iOffsetEo[edgeType]];
    664 
    665       }
    666       if(pbBorderAvail[SGU_T])
    667       {
    668         for(x= 1; x< endX; x++)
    669         {
    670           edgeType      =  xSign(pDec[x] - pDec[x- posShift]) - m_iUpBuff1[x+1] + 2;
    671           pRest[x] = pClipTbl[pDec[x] + m_iOffsetEo[edgeType]];
    672         }
    673       }
    674       pDec   += stride;
    675       pRest  += stride;
     462      Pel* srcLineAbove= srcLine- srcStride;
     463      firstLineStartX = isAboveLeftAvail ? 0 : 1;
     464      firstLineEndX   = isAboveAvail? endX: 1;
     465      for(x= firstLineStartX; x< firstLineEndX; x++)
     466      {
     467        edgeType  =  m_sign[srcLine[x] - srcLineAbove[x- 1]] - signUpLine[x+1];
     468        resLine[x] = offsetClip[srcLine[x] + offset[edgeType]];
     469      }
     470      srcLine  += srcStride;
     471      resLine  += resStride;
    676472
    677473
     
    679475      for (y= 1; y< height-1; y++)
    680476      {
     477        srcLineBelow= srcLine+ srcStride;
     478
    681479        for (x=startX; x<endX; x++)
    682480        {
    683           signDown1      =  xSign(pDec[x] - pDec[x+ posShift]) ;
    684           edgeType      =  signDown1 + m_iUpBuff1[x] + 2;
    685           pRest[x] = pClipTbl[pDec[x] + m_iOffsetEo[edgeType]];
    686 
    687           m_iUpBufft[x+1] = -signDown1;
     481          signDown =  (Char)m_sign[srcLine[x] - srcLineBelow[x+ 1]] ;
     482          edgeType =  signDown + signUpLine[x];
     483          resLine[x] = offsetClip[srcLine[x] + offset[edgeType]];
     484
     485          signDownLine[x+1] = -signDown;
    688486        }
    689         m_iUpBufft[startX] = xSign(pDec[stride+startX] - pDec[startX-1]);
    690 
    691         ipSwap     = m_iUpBuff1;
    692         m_iUpBuff1 = m_iUpBufft;
    693         m_iUpBufft = ipSwap;
    694 
    695         pDec  += stride;
    696         pRest += stride;
     487        signDownLine[startX] = (Char)m_sign[srcLineBelow[startX] - srcLine[startX-1]];
     488
     489        signTmpLine  = signUpLine;
     490        signUpLine   = signDownLine;
     491        signDownLine = signTmpLine;
     492
     493        srcLine += srcStride;
     494        resLine += resStride;
    697495      }
    698496
    699497      //last line
    700       if(pbBorderAvail[SGU_B])
    701       {
    702         for(x= startX; x< width-1; x++)
    703         {
    704           edgeType =  xSign(pDec[x] - pDec[x+ posShift]) + m_iUpBuff1[x] + 2;
    705           pRest[x] = pClipTbl[pDec[x] + m_iOffsetEo[edgeType]];
    706         }
    707       }
    708       if(pbBorderAvail[SGU_BR])
    709       {
    710         x= width -1;
    711         edgeType =  xSign(pDec[x] - pDec[x+ posShift]) + m_iUpBuff1[x] + 2;
    712         pRest[x] = pClipTbl[pDec[x] + m_iOffsetEo[edgeType]];
    713       }
    714       break;
    715     }
    716   case SAO_EO_3: // dir: 45
    717     {
    718       Int  posShift     = stride - 1;
    719       startX = (pbBorderAvail[SGU_L]) ? 0 : 1;
    720       endX   = (pbBorderAvail[SGU_R]) ? width : (width -1);
     498      srcLineBelow= srcLine+ srcStride;
     499      lastLineStartX = isBelowAvail ? startX : (width -1);
     500      lastLineEndX   = isBelowRightAvail ? width : (width -1);
     501      for(x= lastLineStartX; x< lastLineEndX; x++)
     502      {
     503        edgeType =  m_sign[srcLine[x] - srcLineBelow[x+ 1]] + signUpLine[x];
     504        resLine[x] = offsetClip[srcLine[x] + offset[edgeType]];
     505
     506      }
     507    }
     508    break;
     509  case SAO_TYPE_EO_45:
     510    {
     511      offset += 2;
     512      Char *signUpLine = m_signLineBuf1+1;
     513
     514      startX = isLeftAvail ? 0 : 1;
     515      endX   = isRightAvail ? width : (width -1);
    721516
    722517      //prepare 2nd line upper sign
    723       pDec += stride;
     518      Pel* srcLineBelow= srcLine+ srcStride;
    724519      for (x=startX-1; x< endX; x++)
    725520      {
    726         m_iUpBuff1[x] = xSign(pDec[x] - pDec[x- posShift]);
     521        signUpLine[x] = (Char)m_sign[srcLineBelow[x] - srcLine[x+1]];
    727522      }
    728523
    729524
    730525      //first line
    731       pDec -= stride;
    732       if(pbBorderAvail[SGU_T])
    733       {
    734         for(x= startX; x< width -1; x++)
    735         {
    736           edgeType = xSign(pDec[x] - pDec[x- posShift]) -m_iUpBuff1[x-1] + 2;
    737           pRest[x] = pClipTbl[pDec[x] + m_iOffsetEo[edgeType]];
    738         }
    739       }
    740       if(pbBorderAvail[SGU_TR])
    741       {
    742         x= width-1;
    743         edgeType = xSign(pDec[x] - pDec[x- posShift]) -m_iUpBuff1[x-1] + 2;
    744         pRest[x] = pClipTbl[pDec[x] + m_iOffsetEo[edgeType]];
    745       }
    746       pDec  += stride;
    747       pRest += stride;
     526      Pel* srcLineAbove= srcLine- srcStride;
     527      firstLineStartX = isAboveAvail ? startX : (width -1 );
     528      firstLineEndX   = isAboveRightAvail ? width : (width-1);
     529      for(x= firstLineStartX; x< firstLineEndX; x++)
     530      {
     531        edgeType = m_sign[srcLine[x] - srcLineAbove[x+1]] -signUpLine[x-1];
     532        resLine[x] = offsetClip[srcLine[x] + offset[edgeType]];
     533      }
     534      srcLine += srcStride;
     535      resLine += resStride;
    748536
    749537      //middle lines
    750538      for (y= 1; y< height-1; y++)
    751539      {
     540        srcLineBelow= srcLine+ srcStride;
     541
    752542        for(x= startX; x< endX; x++)
    753543        {
    754           signDown1      =  xSign(pDec[x] - pDec[x+ posShift]) ;
    755           edgeType      =  signDown1 + m_iUpBuff1[x] + 2;
    756 
    757           pRest[x] = pClipTbl[pDec[x] + m_iOffsetEo[edgeType]];
    758           m_iUpBuff1[x-1] = -signDown1;
     544          signDown =  (Char)m_sign[srcLine[x] - srcLineBelow[x-1]] ;
     545          edgeType =  signDown + signUpLine[x];
     546          resLine[x] = offsetClip[srcLine[x] + offset[edgeType]];
     547          signUpLine[x-1] = -signDown;
    759548        }
    760         m_iUpBuff1[endX-1] = xSign(pDec[endX-1 + stride] - pDec[endX]);
    761 
    762         pDec  += stride;
    763         pRest += stride;
     549        signUpLine[endX-1] = (Char)m_sign[srcLineBelow[endX-1] - srcLine[endX]];
     550        srcLine  += srcStride;
     551        resLine += resStride;
    764552      }
    765553
    766554      //last line
    767       if(pbBorderAvail[SGU_BL])
    768       {
    769         x= 0;
    770         edgeType = xSign(pDec[x] - pDec[x+ posShift]) + m_iUpBuff1[x] + 2;
    771         pRest[x] = pClipTbl[pDec[x] + m_iOffsetEo[edgeType]];
    772 
    773       }
    774       if(pbBorderAvail[SGU_B])
    775       {
    776         for(x= 1; x< endX; x++)
    777         {
    778           edgeType = xSign(pDec[x] - pDec[x+ posShift]) + m_iUpBuff1[x] + 2;
    779           pRest[x] = pClipTbl[pDec[x] + m_iOffsetEo[edgeType]];
    780         }
    781       }
    782       break;
    783     }   
    784   case SAO_BO:
    785     {
     555      srcLineBelow= srcLine+ srcStride;
     556      lastLineStartX = isBelowLeftAvail ? 0 : 1;
     557      lastLineEndX   = isBelowAvail ? endX : 1;
     558      for(x= lastLineStartX; x< lastLineEndX; x++)
     559      {
     560        edgeType = m_sign[srcLine[x] - srcLineBelow[x-1]] + signUpLine[x];
     561        resLine[x] = offsetClip[srcLine[x] + offset[edgeType]];
     562
     563      }
     564    }
     565    break;
     566  case SAO_TYPE_BO:
     567    {
     568      Int shiftBits = ((compIdx == SAO_Y)?g_bitDepthY:g_bitDepthC)- NUM_SAO_BO_CLASSES_LOG2;
    786569      for (y=0; y< height; y++)
    787570      {
    788571        for (x=0; x< width; x++)
    789572        {
    790           pRest[x] = pOffsetBo[pDec[x]];
     573          resLine[x] = offsetClip[ srcLine[x] + offset[srcLine[x] >> shiftBits] ];
    791574        }
    792         pRest += stride;
    793         pDec  += stride;
    794       }
    795       break;
    796     }
    797   default: break;
    798   }
    799 
    800 }
    801 
    802 /** sample adaptive offset process for one LCU crossing LCU boundary
    803  * \param   iAddr, iSaoType, iYCbCr
    804  */
    805 Void TComSampleAdaptiveOffset::processSaoCuOrg(Int iAddr, Int iSaoType, Int iYCbCr)
    806 {
    807   Int x,y;
    808   TComDataCU *pTmpCu = m_pcPic->getCU(iAddr);
    809   Pel* pRec;
    810   Int  iStride;
    811   Int  iLcuWidth  = m_uiMaxCUWidth;
    812   Int  iLcuHeight = m_uiMaxCUHeight;
    813   UInt uiLPelX    = pTmpCu->getCUPelX();
    814   UInt uiTPelY    = pTmpCu->getCUPelY();
    815   UInt uiRPelX;
    816   UInt uiBPelY;
    817   Int  iSignLeft;
    818   Int  iSignRight;
    819   Int  iSignDown;
    820   Int  iSignDown1;
    821   Int  iSignDown2;
    822   UInt uiEdgeType;
    823   Int iPicWidthTmp;
    824   Int iPicHeightTmp;
    825   Int iStartX;
    826   Int iStartY;
    827   Int iEndX;
    828   Int iEndY;
    829   Int iIsChroma = (iYCbCr!=0)? 1:0;
    830   Int iShift;
    831   Int iCuHeightTmp;
    832   Pel *pTmpLSwap;
    833   Pel *pTmpL;
    834   Pel *pTmpU;
    835   Pel *pClipTbl = NULL;
    836   Int *pOffsetBo = NULL;
    837 
    838   iPicWidthTmp  = m_iPicWidth  >> iIsChroma;
    839   iPicHeightTmp = m_iPicHeight >> iIsChroma;
    840   iLcuWidth     = iLcuWidth    >> iIsChroma;
    841   iLcuHeight    = iLcuHeight   >> iIsChroma;
    842   uiLPelX       = uiLPelX      >> iIsChroma;
    843   uiTPelY       = uiTPelY      >> iIsChroma;
    844   uiRPelX       = uiLPelX + iLcuWidth  ;
    845   uiBPelY       = uiTPelY + iLcuHeight ;
    846   uiRPelX       = uiRPelX > iPicWidthTmp  ? iPicWidthTmp  : uiRPelX;
    847   uiBPelY       = uiBPelY > iPicHeightTmp ? iPicHeightTmp : uiBPelY;
    848   iLcuWidth     = uiRPelX - uiLPelX;
    849   iLcuHeight    = uiBPelY - uiTPelY;
    850 
    851   if(pTmpCu->getPic()==0)
    852   {
    853     return;
    854   }
    855   if (iYCbCr == 0)
    856   {
    857     pRec       = m_pcPic->getPicYuvRec()->getLumaAddr(iAddr);
    858     iStride    = m_pcPic->getStride();
    859   }
    860   else if (iYCbCr == 1)
    861   {
    862     pRec       = m_pcPic->getPicYuvRec()->getCbAddr(iAddr);
    863     iStride    = m_pcPic->getCStride();
    864   }
    865   else
    866   {
    867     pRec       = m_pcPic->getPicYuvRec()->getCrAddr(iAddr);
    868     iStride    = m_pcPic->getCStride();
    869   }
    870 
    871 //   if (iSaoType!=SAO_BO_0 || iSaoType!=SAO_BO_1)
    872   {
    873     iCuHeightTmp = (m_uiMaxCUHeight >> iIsChroma);
    874     iShift = (m_uiMaxCUWidth>> iIsChroma)-1;
    875     for (Int i=0;i<iCuHeightTmp+1;i++)
    876     {
    877       m_pTmpL2[i] = pRec[iShift];
    878       pRec += iStride;
    879     }
    880     pRec -= (iStride*(iCuHeightTmp+1));
    881 
    882     pTmpL = m_pTmpL1;
    883     pTmpU = &(m_pTmpU1[uiLPelX]);
    884   }
    885 
    886   pClipTbl = (iYCbCr==0)? m_pClipTable:m_pChromaClipTable;
    887   pOffsetBo = (iYCbCr==0)? m_iOffsetBo:m_iChromaOffsetBo;
    888 
    889   switch (iSaoType)
    890   {
    891   case SAO_EO_0: // dir: -
    892     {
    893       iStartX = (uiLPelX == 0) ? 1 : 0;
    894       iEndX   = (uiRPelX == iPicWidthTmp) ? iLcuWidth-1 : iLcuWidth;
    895       for (y=0; y<iLcuHeight; y++)
    896       {
    897         iSignLeft = xSign(pRec[iStartX] - pTmpL[y]);
    898         for (x=iStartX; x< iEndX; x++)
    899         {
    900           iSignRight =  xSign(pRec[x] - pRec[x+1]);
    901           uiEdgeType =  iSignRight + iSignLeft + 2;
    902           iSignLeft  = -iSignRight;
    903 
    904           pRec[x] = pClipTbl[pRec[x] + m_iOffsetEo[uiEdgeType]];
    905         }
    906         pRec += iStride;
    907       }
    908       break;
    909     }
    910   case SAO_EO_1: // dir: |
    911     {
    912       iStartY = (uiTPelY == 0) ? 1 : 0;
    913       iEndY   = (uiBPelY == iPicHeightTmp) ? iLcuHeight-1 : iLcuHeight;
    914       if (uiTPelY == 0)
    915       {
    916         pRec += iStride;
    917       }
    918       for (x=0; x< iLcuWidth; x++)
    919       {
    920         m_iUpBuff1[x] = xSign(pRec[x] - pTmpU[x]);
    921       }
    922       for (y=iStartY; y<iEndY; y++)
    923       {
    924         for (x=0; x<iLcuWidth; x++)
    925         {
    926           iSignDown  = xSign(pRec[x] - pRec[x+iStride]);
    927           uiEdgeType = iSignDown + m_iUpBuff1[x] + 2;
    928           m_iUpBuff1[x]= -iSignDown;
    929 
    930           pRec[x] = pClipTbl[pRec[x] + m_iOffsetEo[uiEdgeType]];
    931         }
    932         pRec += iStride;
    933       }
    934       break;
    935     }
    936   case SAO_EO_2: // dir: 135
    937     {
    938       iStartX = (uiLPelX == 0)            ? 1 : 0;
    939       iEndX   = (uiRPelX == iPicWidthTmp) ? iLcuWidth-1 : iLcuWidth;
    940 
    941       iStartY = (uiTPelY == 0) ?             1 : 0;
    942       iEndY   = (uiBPelY == iPicHeightTmp) ? iLcuHeight-1 : iLcuHeight;
    943 
    944       if (uiTPelY == 0)
    945       {
    946         pRec += iStride;
    947       }
    948 
    949       for (x=iStartX; x<iEndX; x++)
    950       {
    951         m_iUpBuff1[x] = xSign(pRec[x] - pTmpU[x-1]);
    952       }
    953       for (y=iStartY; y<iEndY; y++)
    954       {
    955         iSignDown2 = xSign(pRec[iStride+iStartX] - pTmpL[y]);
    956         for (x=iStartX; x<iEndX; x++)
    957         {
    958           iSignDown1      =  xSign(pRec[x] - pRec[x+iStride+1]) ;
    959           uiEdgeType      =  iSignDown1 + m_iUpBuff1[x] + 2;
    960           m_iUpBufft[x+1] = -iSignDown1;
    961           pRec[x] = pClipTbl[pRec[x] + m_iOffsetEo[uiEdgeType]];
    962         }
    963         m_iUpBufft[iStartX] = iSignDown2;
    964 
    965         ipSwap     = m_iUpBuff1;
    966         m_iUpBuff1 = m_iUpBufft;
    967         m_iUpBufft = ipSwap;
    968 
    969         pRec += iStride;
    970       }
    971       break;
    972     }
    973   case SAO_EO_3: // dir: 45
    974     {
    975       iStartX = (uiLPelX == 0) ? 1 : 0;
    976       iEndX   = (uiRPelX == iPicWidthTmp) ? iLcuWidth-1 : iLcuWidth;
    977 
    978       iStartY = (uiTPelY == 0) ? 1 : 0;
    979       iEndY   = (uiBPelY == iPicHeightTmp) ? iLcuHeight-1 : iLcuHeight;
    980 
    981       if (iStartY == 1)
    982       {
    983         pRec += iStride;
    984       }
    985 
    986       for (x=iStartX-1; x<iEndX; x++)
    987       {
    988         m_iUpBuff1[x] = xSign(pRec[x] - pTmpU[x+1]);
    989       }
    990       for (y=iStartY; y<iEndY; y++)
    991       {
    992         x=iStartX;
    993         iSignDown1      =  xSign(pRec[x] - pTmpL[y+1]) ;
    994         uiEdgeType      =  iSignDown1 + m_iUpBuff1[x] + 2;
    995         m_iUpBuff1[x-1] = -iSignDown1;
    996         pRec[x] = pClipTbl[pRec[x] + m_iOffsetEo[uiEdgeType]];
    997         for (x=iStartX+1; x<iEndX; x++)
    998         {
    999           iSignDown1      =  xSign(pRec[x] - pRec[x+iStride-1]) ;
    1000           uiEdgeType      =  iSignDown1 + m_iUpBuff1[x] + 2;
    1001           m_iUpBuff1[x-1] = -iSignDown1;
    1002           pRec[x] = pClipTbl[pRec[x] + m_iOffsetEo[uiEdgeType]];
    1003         }
    1004         m_iUpBuff1[iEndX-1] = xSign(pRec[iEndX-1 + iStride] - pRec[iEndX]);
    1005 
    1006         pRec += iStride;
    1007       }
    1008       break;
    1009     }   
    1010   case SAO_BO:
    1011     {
    1012       for (y=0; y<iLcuHeight; y++)
    1013       {
    1014         for (x=0; x<iLcuWidth; x++)
    1015         {
    1016           pRec[x] = pOffsetBo[pRec[x]];
    1017         }
    1018         pRec += iStride;
    1019       }
    1020       break;
    1021     }
    1022   default: break;
    1023   }
    1024 //   if (iSaoType!=SAO_BO_0 || iSaoType!=SAO_BO_1)
    1025   {
    1026     pTmpLSwap = m_pTmpL1;
    1027     m_pTmpL1  = m_pTmpL2;
    1028     m_pTmpL2  = pTmpLSwap;
    1029   }
    1030 }
    1031 /** Sample adaptive offset process
    1032  * \param pcPic, pcSaoParam 
    1033  */
    1034 Void TComSampleAdaptiveOffset::SAOProcess(SAOParam* pcSaoParam)
    1035 {
    1036   {
    1037     m_uiSaoBitIncreaseY = max(g_bitDepthY - 10, 0);
    1038     m_uiSaoBitIncreaseC = max(g_bitDepthC - 10, 0);
    1039 
    1040     if(m_bUseNIF)
    1041     {
    1042       m_pcPic->getPicYuvRec()->copyToPic(m_pcYuvTmp);
    1043     }
    1044     if (m_saoLcuBasedOptimization)
    1045     {
    1046       pcSaoParam->oneUnitFlag[0] = 0; 
    1047       pcSaoParam->oneUnitFlag[1] = 0; 
    1048       pcSaoParam->oneUnitFlag[2] = 0; 
    1049     }
    1050     Int iY  = 0;
    1051     {
    1052       processSaoUnitAll( pcSaoParam->saoLcuParam[iY], pcSaoParam->oneUnitFlag[iY], iY);
    1053     }
    1054     {
    1055        processSaoUnitAll( pcSaoParam->saoLcuParam[1], pcSaoParam->oneUnitFlag[1], 1);//Cb
    1056        processSaoUnitAll( pcSaoParam->saoLcuParam[2], pcSaoParam->oneUnitFlag[2], 2);//Cr
    1057     }
    1058     m_pcPic = NULL;
    1059   }
    1060 }
    1061 
    1062 Pel* TComSampleAdaptiveOffset::getPicYuvAddr(TComPicYuv* pcPicYuv, Int iYCbCr, Int iAddr)
    1063 {
    1064   switch (iYCbCr)
    1065   {
    1066   case 0:
    1067     return pcPicYuv->getLumaAddr(iAddr);
    1068     break;
    1069   case 1:
    1070     return pcPicYuv->getCbAddr(iAddr);
    1071     break;
    1072   case 2:
    1073     return pcPicYuv->getCrAddr(iAddr);
     575        srcLine += srcStride;
     576        resLine += resStride;
     577      }
     578    }
    1074579    break;
    1075580  default:
    1076     return NULL;
     581    {
     582      printf("Not a supported SAO types\n");
     583      assert(0);
     584      exit(-1);
     585    }
     586  }
     587
     588
     589}
     590
     591Void TComSampleAdaptiveOffset::offsetCTU(Int ctu, TComPicYuv* srcYuv, TComPicYuv* resYuv, SAOBlkParam& saoblkParam, TComPic* pPic)
     592{
     593  Bool isLeftAvail,isRightAvail,isAboveAvail,isBelowAvail,isAboveLeftAvail,isAboveRightAvail,isBelowLeftAvail,isBelowRightAvail;
     594
     595  if(
     596    (saoblkParam[SAO_Y ].modeIdc == SAO_MODE_OFF) &&
     597    (saoblkParam[SAO_Cb].modeIdc == SAO_MODE_OFF) &&
     598    (saoblkParam[SAO_Cr].modeIdc == SAO_MODE_OFF)
     599    )
     600  {
     601    return;
     602  }
     603
     604  //block boundary availability
     605  pPic->getPicSym()->deriveLoopFilterBoundaryAvailibility(ctu, isLeftAvail,isRightAvail,isAboveAvail,isBelowAvail,isAboveLeftAvail,isAboveRightAvail,isBelowLeftAvail,isBelowRightAvail);
     606
     607  Int yPos   = (ctu / m_numCTUInWidth)*m_maxCUHeight;
     608  Int xPos   = (ctu % m_numCTUInWidth)*m_maxCUWidth;
     609  Int height = (yPos + m_maxCUHeight > m_picHeight)?(m_picHeight- yPos):m_maxCUHeight;
     610  Int width  = (xPos + m_maxCUWidth  > m_picWidth )?(m_picWidth - xPos):m_maxCUWidth;
     611
     612  for(Int compIdx= 0; compIdx < NUM_SAO_COMPONENTS; compIdx++)
     613  {
     614    SAOOffset& ctbOffset = saoblkParam[compIdx];
     615
     616    if(ctbOffset.modeIdc != SAO_MODE_OFF)
     617    {
     618      Bool isLuma     = (compIdx == SAO_Y);
     619      Int  formatShift= isLuma?0:1;
     620
     621      Int  blkWidth   = (width  >> formatShift);
     622      Int  blkHeight  = (height >> formatShift);
     623      Int  blkYPos    = (yPos   >> formatShift);
     624      Int  blkXPos    = (xPos   >> formatShift);
     625
     626      Int  srcStride = isLuma?srcYuv->getStride():srcYuv->getCStride();
     627      Pel* srcBlk    = getPicBuf(srcYuv, compIdx)+ (yPos >> formatShift)*srcStride+ (xPos >> formatShift);
     628
     629      Int  resStride  = isLuma?resYuv->getStride():resYuv->getCStride();
     630      Pel* resBlk     = getPicBuf(resYuv, compIdx)+ blkYPos*resStride+ blkXPos;
     631
     632      offsetBlock( compIdx, ctbOffset.typeIdc, ctbOffset.offset
     633                  , srcBlk, resBlk, srcStride, resStride, blkWidth, blkHeight
     634                  , isLeftAvail, isRightAvail
     635                  , isAboveAvail, isBelowAvail
     636                  , isAboveLeftAvail, isAboveRightAvail
     637                  , isBelowLeftAvail, isBelowRightAvail
     638                  );
     639    }
     640  } //compIdx
     641
     642}
     643
     644
     645Void TComSampleAdaptiveOffset::SAOProcess(TComPic* pDecPic)
     646{
     647  if(!m_picSAOEnabled[SAO_Y] && !m_picSAOEnabled[SAO_Cb] && !m_picSAOEnabled[SAO_Cr])
     648  {
     649    return;
     650  }
     651  TComPicYuv* resYuv = pDecPic->getPicYuvRec();
     652  TComPicYuv* srcYuv = m_tempPicYuv;
     653  resYuv->copyToPic(srcYuv);
     654  for(Int ctu= 0; ctu < m_numCTUsPic; ctu++)
     655  {
     656    offsetCTU(ctu, srcYuv, resYuv, (pDecPic->getPicSym()->getSAOBlkParam())[ctu], pDecPic);
     657  } //ctu
     658}
     659
     660
     661Pel* TComSampleAdaptiveOffset::getPicBuf(TComPicYuv* pPicYuv, Int compIdx)
     662{
     663  Pel* pBuf = NULL;
     664  switch(compIdx)
     665  {
     666  case SAO_Y:
     667    {
     668      pBuf = pPicYuv->getLumaAddr();
     669    }
    1077670    break;
    1078   }
    1079 }
    1080 /** Process SAO all units
    1081  * \param saoLcuParam SAO LCU parameters
    1082  * \param oneUnitFlag one unit flag
    1083  * \param yCbCr color componet index
    1084  */
    1085 Void TComSampleAdaptiveOffset::processSaoUnitAll(SaoLcuParam* saoLcuParam, Bool oneUnitFlag, Int yCbCr)
    1086 {
    1087   Pel *pRec;
    1088   Int picWidthTmp;
    1089 
    1090   if (yCbCr == 0)
    1091   {
    1092     pRec        = m_pcPic->getPicYuvRec()->getLumaAddr();
    1093     picWidthTmp = m_iPicWidth;
    1094   }
    1095   else if (yCbCr == 1)
    1096   {
    1097     pRec        = m_pcPic->getPicYuvRec()->getCbAddr();
    1098     picWidthTmp = m_iPicWidth>>1;
    1099   }
    1100   else
    1101   {
    1102     pRec        = m_pcPic->getPicYuvRec()->getCrAddr();
    1103     picWidthTmp = m_iPicWidth>>1;
    1104   }
    1105 
    1106   memcpy(m_pTmpU1, pRec, sizeof(Pel)*picWidthTmp);
    1107 
    1108   Int  i;
    1109   UInt edgeType;
    1110   Pel* ppLumaTable = NULL;
    1111   Pel* pClipTable = NULL;
    1112   Int* pOffsetBo = NULL;
    1113   Int  typeIdx;
    1114 
    1115   Int offset[LUMA_GROUP_NUM+1];
    1116   Int idxX;
    1117   Int idxY;
    1118   Int addr;
    1119   Int frameWidthInCU = m_pcPic->getFrameWidthInCU();
    1120   Int frameHeightInCU = m_pcPic->getFrameHeightInCU();
    1121   Int stride;
    1122   Pel *tmpUSwap;
    1123   Int isChroma = (yCbCr == 0) ? 0:1;
    1124   Bool mergeLeftFlag;
    1125   Int saoBitIncrease = (yCbCr == 0) ? m_uiSaoBitIncreaseY : m_uiSaoBitIncreaseC;
    1126 
    1127   pOffsetBo = (yCbCr==0) ? m_iOffsetBo : m_iChromaOffsetBo;
    1128 
    1129   offset[0] = 0;
    1130   for (idxY = 0; idxY< frameHeightInCU; idxY++)
    1131   {
    1132     addr = idxY * frameWidthInCU;
    1133     if (yCbCr == 0)
    1134     {
    1135       pRec  = m_pcPic->getPicYuvRec()->getLumaAddr(addr);
    1136       stride = m_pcPic->getStride();
    1137       picWidthTmp = m_iPicWidth;
    1138     }
    1139     else if (yCbCr == 1)
    1140     {
    1141       pRec  = m_pcPic->getPicYuvRec()->getCbAddr(addr);
    1142       stride = m_pcPic->getCStride();
    1143       picWidthTmp = m_iPicWidth>>1;
    1144     }
    1145     else
    1146     {
    1147       pRec  = m_pcPic->getPicYuvRec()->getCrAddr(addr);
    1148       stride = m_pcPic->getCStride();
    1149       picWidthTmp = m_iPicWidth>>1;
    1150     }
    1151 
    1152     //     pRec += iStride*(m_uiMaxCUHeight-1);
    1153     for (i=0;i<(m_uiMaxCUHeight>>isChroma)+1;i++)
    1154     {
    1155       m_pTmpL1[i] = pRec[0];
    1156       pRec+=stride;
    1157     }
    1158     pRec-=(stride<<1);
    1159 
    1160     memcpy(m_pTmpU2, pRec, sizeof(Pel)*picWidthTmp);
    1161 
    1162     for (idxX = 0; idxX < frameWidthInCU; idxX++)
    1163     {
    1164       addr = idxY * frameWidthInCU + idxX;
    1165 
    1166       if (oneUnitFlag)
    1167       {
    1168         typeIdx = saoLcuParam[0].typeIdx;
    1169         mergeLeftFlag = (addr == 0)? 0:1;
    1170       }
    1171       else
    1172       {
    1173         typeIdx = saoLcuParam[addr].typeIdx;
    1174         mergeLeftFlag = saoLcuParam[addr].mergeLeftFlag;
    1175       }
    1176       if (typeIdx>=0)
    1177       {
    1178         if (!mergeLeftFlag)
    1179         {
    1180 
    1181           if (typeIdx == SAO_BO)
    1182           {
    1183             for (i=0; i<SAO_MAX_BO_CLASSES+1;i++)
    1184             {
    1185               offset[i] = 0;
    1186             }
    1187             for (i=0; i<saoLcuParam[addr].length; i++)
    1188             {
    1189               offset[ (saoLcuParam[addr].subTypeIdx +i)%SAO_MAX_BO_CLASSES  +1] = saoLcuParam[addr].offset[i] << saoBitIncrease;
    1190             }
    1191 
    1192             ppLumaTable = (yCbCr==0)?m_lumaTableBo:m_chromaTableBo;
    1193             pClipTable = (yCbCr==0)?m_pClipTable:m_pChromaClipTable;
    1194 
    1195             Int bitDepth = (yCbCr==0) ? g_bitDepthY : g_bitDepthC;
    1196             for (i=0;i<(1<<bitDepth);i++)
    1197             {
    1198               pOffsetBo[i] = pClipTable[i + offset[ppLumaTable[i]]];
    1199             }
    1200 
    1201           }
    1202           if (typeIdx == SAO_EO_0 || typeIdx == SAO_EO_1 || typeIdx == SAO_EO_2 || typeIdx == SAO_EO_3)
    1203           {
    1204             for (i=0;i<saoLcuParam[addr].length;i++)
    1205             {
    1206               offset[i+1] = saoLcuParam[addr].offset[i] << saoBitIncrease;
    1207             }
    1208             for (edgeType=0;edgeType<6;edgeType++)
    1209             {
    1210               m_iOffsetEo[edgeType]= offset[m_auiEoTable[edgeType]];
    1211             }
    1212           }
    1213         }
    1214         processSaoCu(addr, typeIdx, yCbCr);
    1215       }
    1216       else
    1217       {
    1218         if (idxX != (frameWidthInCU-1))
    1219         {
    1220           if (yCbCr == 0)
    1221           {
    1222             pRec  = m_pcPic->getPicYuvRec()->getLumaAddr(addr);
    1223             stride = m_pcPic->getStride();
    1224           }
    1225           else if (yCbCr == 1)
    1226           {
    1227             pRec  = m_pcPic->getPicYuvRec()->getCbAddr(addr);
    1228             stride = m_pcPic->getCStride();
    1229           }
    1230           else
    1231           {
    1232             pRec  = m_pcPic->getPicYuvRec()->getCrAddr(addr);
    1233             stride = m_pcPic->getCStride();
    1234           }
    1235           Int widthShift = m_uiMaxCUWidth>>isChroma;
    1236           for (i=0;i<(m_uiMaxCUHeight>>isChroma)+1;i++)
    1237           {
    1238             m_pTmpL1[i] = pRec[widthShift-1];
    1239             pRec+=stride;
    1240           }
    1241         }
    1242       }
    1243     }
    1244     tmpUSwap = m_pTmpU1;
    1245     m_pTmpU1 = m_pTmpU2;
    1246     m_pTmpU2 = tmpUSwap;
    1247   }
    1248 
    1249 }
    1250 /** Reset SAO LCU part
    1251  * \param saoLcuParam
    1252  */
    1253 Void TComSampleAdaptiveOffset::resetLcuPart(SaoLcuParam* saoLcuParam)
    1254 {
    1255   Int i,j;
    1256   for (i=0;i<m_iNumCuInWidth*m_iNumCuInHeight;i++)
    1257   {
    1258     saoLcuParam[i].mergeUpFlag     =  1;
    1259     saoLcuParam[i].mergeLeftFlag =  0;
    1260     saoLcuParam[i].partIdx   =  0;
    1261     saoLcuParam[i].typeIdx      = -1;
    1262     for (j=0;j<MAX_NUM_SAO_OFFSETS;j++)
    1263     {
    1264       saoLcuParam[i].offset[j] = 0;
    1265     }
    1266     saoLcuParam[i].subTypeIdx = 0;
    1267   }
    1268 }
    1269 
    1270 /** convert QP part to SAO unit
    1271 * \param saoParam SAO parameter
    1272 * \param partIdx SAO part index
    1273 * \param yCbCr color component index
    1274  */
    1275 Void TComSampleAdaptiveOffset::convertQT2SaoUnit(SAOParam *saoParam, UInt partIdx, Int yCbCr)
    1276 {
    1277 
    1278   SAOQTPart*  saoPart= &(saoParam->psSaoPart[yCbCr][partIdx]);
    1279   if (!saoPart->bSplit)
    1280   {
    1281     convertOnePart2SaoUnit(saoParam, partIdx, yCbCr);
    1282     return;
    1283   }
    1284 
    1285   if (saoPart->PartLevel < m_uiMaxSplitLevel)
    1286   {
    1287     convertQT2SaoUnit(saoParam, saoPart->DownPartsIdx[0], yCbCr);
    1288     convertQT2SaoUnit(saoParam, saoPart->DownPartsIdx[1], yCbCr);
    1289     convertQT2SaoUnit(saoParam, saoPart->DownPartsIdx[2], yCbCr);
    1290     convertQT2SaoUnit(saoParam, saoPart->DownPartsIdx[3], yCbCr);
    1291   }
    1292 }
    1293 /** convert one SAO part to SAO unit
    1294 * \param saoParam SAO parameter
    1295 * \param partIdx SAO part index
    1296 * \param yCbCr color component index
    1297  */
    1298 Void TComSampleAdaptiveOffset::convertOnePart2SaoUnit(SAOParam *saoParam, UInt partIdx, Int yCbCr)
    1299 {
    1300   Int j;
    1301   Int idxX;
    1302   Int idxY;
    1303   Int addr;
    1304   Int frameWidthInCU = m_pcPic->getFrameWidthInCU();
    1305   SAOQTPart* saoQTPart = saoParam->psSaoPart[yCbCr];
    1306   SaoLcuParam* saoLcuParam = saoParam->saoLcuParam[yCbCr];
    1307 
    1308   for (idxY = saoQTPart[partIdx].StartCUY; idxY<= saoQTPart[partIdx].EndCUY; idxY++)
    1309   {
    1310     for (idxX = saoQTPart[partIdx].StartCUX; idxX<= saoQTPart[partIdx].EndCUX; idxX++)
    1311     {
    1312       addr = idxY * frameWidthInCU + idxX;
    1313       saoLcuParam[addr].partIdxTmp = (Int)partIdx;
    1314       saoLcuParam[addr].typeIdx    = saoQTPart[partIdx].iBestType;
    1315       saoLcuParam[addr].subTypeIdx = saoQTPart[partIdx].subTypeIdx;
    1316       if (saoLcuParam[addr].typeIdx!=-1)
    1317       {
    1318         saoLcuParam[addr].length    = saoQTPart[partIdx].iLength;
    1319         for (j=0;j<MAX_NUM_SAO_OFFSETS;j++)
    1320         {
    1321           saoLcuParam[addr].offset[j] = saoQTPart[partIdx].iOffset[j];
    1322         }
    1323       }
    1324       else
    1325       {
    1326         saoLcuParam[addr].length    = 0;
    1327         saoLcuParam[addr].subTypeIdx = saoQTPart[partIdx].subTypeIdx;
    1328         for (j=0;j<MAX_NUM_SAO_OFFSETS;j++)
    1329         {
    1330           saoLcuParam[addr].offset[j] = 0;
    1331         }
    1332       }
    1333     }
    1334   }
    1335 }
    1336 
    1337 Void TComSampleAdaptiveOffset::resetSaoUnit(SaoLcuParam* saoUnit)
    1338 {
    1339   saoUnit->partIdx       = 0;
    1340   saoUnit->partIdxTmp    = 0;
    1341   saoUnit->mergeLeftFlag = 0;
    1342   saoUnit->mergeUpFlag   = 0;
    1343   saoUnit->typeIdx       = -1;
    1344   saoUnit->length        = 0;
    1345   saoUnit->subTypeIdx    = 0;
    1346 
    1347   for (Int i=0;i<4;i++)
    1348   {
    1349     saoUnit->offset[i] = 0;
    1350   }
    1351 }
    1352 
    1353 Void TComSampleAdaptiveOffset::copySaoUnit(SaoLcuParam* saoUnitDst, SaoLcuParam* saoUnitSrc )
    1354 {
    1355   saoUnitDst->mergeLeftFlag = saoUnitSrc->mergeLeftFlag;
    1356   saoUnitDst->mergeUpFlag   = saoUnitSrc->mergeUpFlag;
    1357   saoUnitDst->typeIdx       = saoUnitSrc->typeIdx;
    1358   saoUnitDst->length        = saoUnitSrc->length;
    1359 
    1360   saoUnitDst->subTypeIdx  = saoUnitSrc->subTypeIdx;
    1361   for (Int i=0;i<4;i++)
    1362   {
    1363     saoUnitDst->offset[i] = saoUnitSrc->offset[i];
    1364   }
    1365 }
    1366 
    1367 /** PCM LF disable process.
     671  case SAO_Cb:
     672    {
     673      pBuf = pPicYuv->getCbAddr();
     674    }
     675    break;
     676  case SAO_Cr:
     677    {
     678      pBuf = pPicYuv->getCrAddr();
     679    }
     680    break;
     681  default:
     682    {
     683      printf("Not a legal component ID for SAO\n");
     684      assert(0);
     685      exit(-1);
     686    }
     687  }
     688
     689  return pBuf;
     690}
     691
     692/** PCM LF disable process.
    1368693 * \param pcPic picture (TComPic) pointer
    1369694 * \returns Void
  • branches/HTM-10.0rc1-dev0/source/Lib/TLibCommon/TComSampleAdaptiveOffset.h

    r608 r837  
    44 * granted under this license. 
    55 *
    6  * Copyright (c) 2010-2013, ITU/ISO/IEC
     6 * Copyright (c) 2010-2014, ITU/ISO/IEC
    77 * All rights reserved.
    88 *
     
    4949// ====================================================================================================================
    5050
    51 #define SAO_MAX_DEPTH                 4
    52 #define SAO_BO_BITS                   5
    53 #define LUMA_GROUP_NUM                (1<<SAO_BO_BITS)
    54 #define MAX_NUM_SAO_OFFSETS           4
    55 #define MAX_NUM_SAO_CLASS             33
     51#define MAX_SAO_TRUNCATED_BITDEPTH     10
    5652// ====================================================================================================================
    5753// Class definition
    5854// ====================================================================================================================
     55extern UInt g_saoMaxOffsetQVal[NUM_SAO_COMPONENTS];
    5956
    60 /// Sample Adaptive Offset class
    6157class TComSampleAdaptiveOffset
    6258{
     59public:
     60  TComSampleAdaptiveOffset();
     61  virtual ~TComSampleAdaptiveOffset();
     62  Void SAOProcess(TComPic* pDecPic);
     63  Void create( Int picWidth, Int picHeight, UInt maxCUWidth, UInt maxCUHeight, UInt maxCUDepth );
     64  Void destroy();
     65  Void reconstructBlkSAOParams(TComPic* pic, SAOBlkParam* saoBlkParams);
     66  Void PCMLFDisableProcess (TComPic* pcPic);
    6367protected:
    64   TComPic*          m_pcPic;
     68  Void offsetBlock(Int compIdx, Int typeIdx, Int* offset, Pel* srcBlk, Pel* resBlk, Int srcStride, Int resStride,  Int width, Int height
     69                  , Bool isLeftAvail, Bool isRightAvail, Bool isAboveAvail, Bool isBelowAvail, Bool isAboveLeftAvail, Bool isAboveRightAvail, Bool isBelowLeftAvail, Bool isBelowRightAvail);
     70  Pel* getPicBuf(TComPicYuv* pPicYuv, Int compIdx);
     71  Void invertQuantOffsets(Int compIdx, Int typeIdc, Int typeAuxInfo, Int* dstOffsets, Int* srcOffsets);
     72  Void reconstructBlkSAOParam(SAOBlkParam& recParam, std::vector<SAOBlkParam*>& mergeList);
     73  Int  getMergeList(TComPic* pic, Int ctu, SAOBlkParam* blkParams, std::vector<SAOBlkParam*>& mergeList);
     74  Void offsetCTU(Int ctu, TComPicYuv* srcYuv, TComPicYuv* resYuv, SAOBlkParam& saoblkParam, TComPic* pPic);
     75  Void xPCMRestoration(TComPic* pcPic);
     76  Void xPCMCURestoration ( TComDataCU* pcCU, UInt uiAbsZorderIdx, UInt uiDepth );
     77  Void xPCMSampleRestoration (TComDataCU* pcCU, UInt uiAbsZorderIdx, UInt uiDepth, TextType ttText);
     78protected:
     79  UInt m_offsetStepLog2[NUM_SAO_COMPONENTS]; //offset step 
     80  Int* m_offsetClip[NUM_SAO_COMPONENTS]; //clip table for fast operation
     81  Short* m_sign; //sign table for fast operation
     82  TComPicYuv*   m_tempPicYuv; //temporary buffer
     83  Int m_picWidth;
     84  Int m_picHeight;
     85  Int m_maxCUWidth;
     86  Int m_maxCUHeight;
     87  Int m_numCTUInWidth;
     88  Int m_numCTUInHeight;
     89  Int m_numCTUsPic;
     90 
     91 
     92  Int m_lineBufWidth;
     93  Char* m_signLineBuf1;
     94  Char* m_signLineBuf2;
     95private:
     96  Bool m_picSAOEnabled[NUM_SAO_COMPONENTS];
     97  Int*   m_offsetClipTable[NUM_SAO_COMPONENTS];
     98  Short* m_signTable;
    6599
    66   static const UInt m_uiMaxDepth;
    67   static const Int m_aiNumCulPartsLevel[5];
    68   static const UInt m_auiEoTable[9];
    69   Int *m_iOffsetBo;
    70   Int *m_iChromaOffsetBo;
    71   Int m_iOffsetEo[LUMA_GROUP_NUM];
    72 
    73   Int  m_iPicWidth;
    74   Int  m_iPicHeight;
    75   UInt m_uiMaxSplitLevel;
    76   UInt m_uiMaxCUWidth;
    77   UInt m_uiMaxCUHeight;
    78   Int  m_iNumCuInWidth;
    79   Int  m_iNumCuInHeight;
    80   Int  m_iNumTotalParts;
    81   static const Int m_iNumClass[MAX_NUM_SAO_TYPE];
    82 
    83   UInt m_uiSaoBitIncreaseY;
    84   UInt m_uiSaoBitIncreaseC;  //for chroma
    85   UInt m_uiQP;
    86 
    87   Pel   *m_pClipTable;
    88   Pel   *m_pClipTableBase;
    89   Pel   *m_lumaTableBo;
    90   Pel   *m_pChromaClipTable;
    91   Pel   *m_pChromaClipTableBase;
    92   Pel   *m_chromaTableBo;
    93   Int   *m_iUpBuff1;
    94   Int   *m_iUpBuff2;
    95   Int   *m_iUpBufft;
    96   Int   *ipSwap;
    97   Bool  m_bUseNIF;       //!< true for performing non-cross slice boundary ALF
    98   TComPicYuv* m_pcYuvTmp;    //!< temporary picture buffer pointer when non-across slice/tile boundary SAO is enabled
    99 
    100   Pel* m_pTmpU1;
    101   Pel* m_pTmpU2;
    102   Pel* m_pTmpL1;
    103   Pel* m_pTmpL2;
    104   Int     m_maxNumOffsetsPerPic;
    105   Bool    m_saoLcuBoundary;
    106   Bool    m_saoLcuBasedOptimization;
    107 
    108   Void xPCMRestoration        (TComPic* pcPic);
    109   Void xPCMCURestoration      (TComDataCU* pcCU, UInt uiAbsZorderIdx, UInt uiDepth);
    110   Void xPCMSampleRestoration  (TComDataCU* pcCU, UInt uiAbsZorderIdx, UInt uiDepth, TextType ttText);
    111 public:
    112   TComSampleAdaptiveOffset         ();
    113   virtual ~TComSampleAdaptiveOffset();
    114 
    115   Void create( UInt uiSourceWidth, UInt uiSourceHeight, UInt uiMaxCUWidth, UInt uiMaxCUHeight );
    116   Void destroy ();
    117 
    118   Int  convertLevelRowCol2Idx(Int level, Int row, Int col);
    119 
    120   Void initSAOParam   (SAOParam *pcSaoParam, Int iPartLevel, Int iPartRow, Int iPartCol, Int iParentPartIdx, Int StartCUX, Int EndCUX, Int StartCUY, Int EndCUY, Int iYCbCr);
    121   Void allocSaoParam  (SAOParam* pcSaoParam);
    122   Void resetSAOParam  (SAOParam *pcSaoParam);
    123   static Void freeSaoParam   (SAOParam *pcSaoParam);
    124  
    125   Void SAOProcess(SAOParam* pcSaoParam);
    126   Void processSaoCu(Int iAddr, Int iSaoType, Int iYCbCr);
    127   Pel* getPicYuvAddr(TComPicYuv* pcPicYuv, Int iYCbCr,Int iAddr = 0);
    128 
    129   Void processSaoCuOrg(Int iAddr, Int iPartIdx, Int iYCbCr);  //!< LCU-basd SAO process without slice granularity
    130   Void createPicSaoInfo(TComPic* pcPic);
    131   Void destroyPicSaoInfo();
    132   Void processSaoBlock(Pel* pDec, Pel* pRest, Int stride, Int iSaoType, UInt width, UInt height, Bool* pbBorderAvail, Int iYCbCr);
    133 
    134   Void resetLcuPart(SaoLcuParam* saoLcuParam);
    135   Void convertQT2SaoUnit(SAOParam* saoParam, UInt partIdx, Int yCbCr);
    136   Void convertOnePart2SaoUnit(SAOParam *saoParam, UInt partIdx, Int yCbCr);
    137   Void processSaoUnitAll(SaoLcuParam* saoLcuParam, Bool oneUnitFlag, Int yCbCr);
    138   Void setSaoLcuBoundary (Bool bVal)  {m_saoLcuBoundary = bVal;}
    139   Bool getSaoLcuBoundary ()           {return m_saoLcuBoundary;}
    140   Void setSaoLcuBasedOptimization (Bool bVal)  {m_saoLcuBasedOptimization = bVal;}
    141   Bool getSaoLcuBasedOptimization ()           {return m_saoLcuBasedOptimization;}
    142   Void resetSaoUnit(SaoLcuParam* saoUnit);
    143   Void copySaoUnit(SaoLcuParam* saoUnitDst, SaoLcuParam* saoUnitSrc );
    144   Void PCMLFDisableProcess    ( TComPic* pcPic);                        ///< interface function for ALF process
    145100};
    146101
  • branches/HTM-10.0rc1-dev0/source/Lib/TLibCommon/TComSlice.cpp

    r833 r837  
    44 * granted under this license. 
    55 *
    6  * Copyright (c) 2010-2013, ITU/ISO/IEC
     6* Copyright (c) 2010-2014, ITU/ISO/IEC
    77 * All rights reserved.
    88 *
     
    7171, m_colFromL0Flag                 ( 1 )
    7272, m_colRefIdx                     ( 0 )
    73 #if SAO_CHROMA_LAMBDA
    74 , m_dLambdaLuma( 0.0 )
    75 , m_dLambdaChroma( 0.0 )
    76 #else
    77 , m_dLambda                       ( 0.0 )
    78 #endif
    7973, m_uiTLayer                      ( 0 )
    8074, m_bTLayerSwitchingFlag          ( false )
     
    130124  initEqualRef();
    131125 
     126  for (Int component = 0; component < 3; component++)
     127  {
     128    m_lambdas[component] = 0.0;
     129  }
     130 
    132131  for ( Int idx = 0; idx < MAX_NUM_REF; idx++ )
    133132  {
     
    148147  initWpAcDcParam();
    149148  m_saoEnabledFlag = false;
     149  m_saoEnabledFlagChroma = false;
    150150#if H_MV
    151151  for (Int i = 0; i < MAX_NUM_LAYERS; i++ )
     
    370370  }
    371371}
     372
    372373#if !H_MV
    373 #if FIX1071
    374374Void TComSlice::setRefPicList( TComList<TComPic*>& rcListPic, Bool checkNumPocTotalCurr )
    375 #else
    376 Void TComSlice::setRefPicList( TComList<TComPic*>& rcListPic )
    377 #endif
    378 {
    379 #if FIX1071
     375{
    380376  if (!checkNumPocTotalCurr)
    381 #endif
    382377  {
    383378    if (m_eSliceType == I_SLICE)
     
    449444  TComPic*  rpsCurrList1[MAX_NUM_REF+1];
    450445  Int numPocTotalCurr = NumPocStCurr0 + NumPocStCurr1 + NumPocLtCurr;
    451 
    452 #if FIX1071
    453446  if (checkNumPocTotalCurr)
    454447  {
     
    474467    m_aiNumRefIdx[1] = getNumRefIdx(REF_PIC_LIST_1);
    475468  }
    476 #endif
    477469
    478470  Int cIdx = 0;
     
    873865{
    874866  TComPic*                 rpcPic;
     867#if !FIX1172
    875868  setAssociatedIRAPPOC(pocCRA);
     869#endif
    876870  Int pocCurr = getPOC();
    877871
     
    993987  m_colFromL0Flag        = pSrc->m_colFromL0Flag;
    994988  m_colRefIdx            = pSrc->m_colRefIdx;
    995 #if SAO_CHROMA_LAMBDA
    996   m_dLambdaLuma          = pSrc->m_dLambdaLuma;
    997   m_dLambdaChroma        = pSrc->m_dLambdaChroma;
    998 #else
    999   m_dLambda              = pSrc->m_dLambda;
    1000 #endif
     989  setLambdas(pSrc->getLambdas());
    1001990  for (i = 0; i < 2; i++)
    1002991  {
     
    11771166  {
    11781167    rpcPic = *(iterPic++);
     1168#if BUGFIX_INTRAPERIOD
     1169    if(!rpcPic->getReconMark())
     1170    {
     1171      continue;
     1172    }
     1173#endif
    11791174    if (rpcPic->getPOC() == this->getPOC())
    11801175    {
     
    13421337    assert(rpcPic->getSlice( 0 )->isReferenced()==0||rpcPic->getUsedByCurr()==0||rpcPic->getTLayer()<=this->getTLayer());
    13431338    //check that pictures of higher or equal temporal layer are not in the RPS if the current picture is a TSA picture
    1344     if(this->getNalUnitType() == NAL_UNIT_CODED_SLICE_TLA_R || this->getNalUnitType() == NAL_UNIT_CODED_SLICE_TSA_N)
     1339    if(this->getNalUnitType() == NAL_UNIT_CODED_SLICE_TSA_R || this->getNalUnitType() == NAL_UNIT_CODED_SLICE_TSA_N)
    13451340    {
    13461341      assert(rpcPic->getSlice( 0 )->isReferenced()==0||rpcPic->getTLayer()<this->getTLayer());
     
    15011496/** Function for constructing an explicit Reference Picture Set out of the available pictures in a referenced Reference Picture Set
    15021497*/
    1503 #if FIX1071
    15041498Void TComSlice::createExplicitReferencePictureSetFromReference( TComList<TComPic*>& rcListPic, TComReferencePictureSet *pReferencePictureSet, Bool isRAP)
    1505 #else
    1506 Void TComSlice::createExplicitReferencePictureSetFromReference( TComList<TComPic*>& rcListPic, TComReferencePictureSet *pReferencePictureSet)
    1507 #endif
    15081499{
    15091500  TComPic* rpcPic;
     
    15301521        // and should be added to the explicit Reference Picture Set
    15311522        pcRPS->setDeltaPOC(k, pReferencePictureSet->getDeltaPOC(i));
    1532 #if FIX1071
    15331523        pcRPS->setUsed(k, pReferencePictureSet->getUsed(i) && (!isRAP));
    1534 #else
    1535         pcRPS->setUsed(k, pReferencePictureSet->getUsed(i));
    1536 #endif
    15371524        if(pcRPS->getDeltaPOC(k) < 0)
    15381525        {
     
    21812168, m_qpBDOffsetY               (  0)
    21822169, m_qpBDOffsetC               (  0)
    2183 , m_useLossless               (false)
    21842170, m_uiPCMBitDepthLuma         (  8)
    21852171, m_uiPCMBitDepthChroma       (  8)
     
    28612847    for(UInt listId=0;listId<g_scalingListNum[sizeId];listId++)
    28622848    {
    2863       getScalingList()->processDefaultMarix(sizeId, listId);
     2849      getScalingList()->processDefaultMatrix(sizeId, listId);
    28642850    }
    28652851  }
     
    35843570 * \param Index of input matrix
    35853571 */
    3586 Void TComScalingList::processDefaultMarix(UInt sizeId, UInt listId)
     3572Void TComScalingList::processDefaultMatrix(UInt sizeId, UInt listId)
    35873573{
    35883574  ::memcpy(getScalingListAddress(sizeId, listId),getScalingListDefaultAddress(sizeId,listId),sizeof(Int)*min(MAX_MATRIX_COEF_NUM,(Int)g_scalingListSize[sizeId]));
     
    36013587      if(getScalingListDC(sizeId,listId) == 0)
    36023588      {
    3603         processDefaultMarix(sizeId, listId);
     3589        processDefaultMatrix(sizeId, listId);
    36043590      }
    36053591    }
  • branches/HTM-10.0rc1-dev0/source/Lib/TLibCommon/TComSlice.h

    r833 r837  
    44 * granted under this license. 
    55 *
    6  * Copyright (c) 2010-2013, ITU/ISO/IEC
     6* Copyright (c) 2010-2014, ITU/ISO/IEC
    77 * All rights reserved.
    88 *
     
    161161  UInt     getRefMatrixId                 (UInt sizeId, UInt listId)           { return m_refMatrixId[sizeId][listId]; }     //!< get reference matrix ID
    162162  Int*     getScalingListDefaultAddress   (UInt sizeId, UInt listId);                                                        //!< get default matrix coefficient
    163   Void     processDefaultMarix            (UInt sizeId, UInt listId);
     163  Void     processDefaultMatrix            (UInt sizeId, UInt listId);
    164164  Void     setScalingListDC               (UInt sizeId, UInt listId, UInt u)   { m_scalingListDC[sizeId][listId] = u; }      //!< set DC value
    165165
     
    851851  UInt    getNumReorderPics(UInt tLayer)                        { return m_numReorderPics[tLayer]; }
    852852 
    853   Void    setMaxDecPicBuffering(UInt v, UInt tLayer)            { m_uiMaxDecPicBuffering[tLayer] = v;    }
     853  Void    setMaxDecPicBuffering(UInt v, UInt tLayer)            { assert(tLayer < MAX_TLAYER); m_uiMaxDecPicBuffering[tLayer] = v;    }
    854854  UInt    getMaxDecPicBuffering(UInt tLayer)                    { return m_uiMaxDecPicBuffering[tLayer]; }
    855855 
     
    14191419  Int         m_qpBDOffsetY;
    14201420  Int         m_qpBDOffsetC;
    1421 
    1422   Bool        m_useLossless;
    14231421
    14241422  UInt        m_uiPCMBitDepthLuma;
     
    15531551  UInt getMaxTrSize   ()         { return  m_uiMaxTrSize;   }
    15541552 
    1555   // Tool list
    1556   Bool getUseLossless ()         { return m_useLossless; }
    1557   Void setUseLossless ( Bool b ) { m_useLossless  = b; }
    1558  
    15591553  // AMP accuracy
    15601554  Int       getAMPAcc   ( UInt uiDepth ) { return m_iAMPAcc[uiDepth]; }
     
    15921586  TComScalingList* getScalingList ()       { return m_scalingList; }               //!< get ScalingList class pointer in SPS
    15931587  UInt getMaxDecPicBuffering  (UInt tlayer)            { return m_uiMaxDecPicBuffering[tlayer]; }
    1594   Void setMaxDecPicBuffering  ( UInt ui, UInt tlayer ) { m_uiMaxDecPicBuffering[tlayer] = ui;   }
     1588  Void setMaxDecPicBuffering  ( UInt ui, UInt tlayer ) { assert(tlayer < MAX_TLAYER);  m_uiMaxDecPicBuffering[tlayer] = ui;   }
    15951589  UInt getMaxLatencyIncrease  (UInt tlayer)            { return m_uiMaxLatencyIncrease[tlayer];   }
    15961590  Void setMaxLatencyIncrease  ( UInt ui , UInt tlayer) { m_uiMaxLatencyIncrease[tlayer] = ui;      }
     
    19881982  UInt        m_maxNumMergeCand;
    19891983
    1990 
    1991 #if SAO_CHROMA_LAMBDA
    1992   Double      m_dLambdaLuma;
    1993   Double      m_dLambdaChroma;
    1994 #else
    1995   Double      m_dLambda;
    1996 #endif
     1984  Double      m_lambdas[3];
    19971985
    19981986  Bool        m_abEqualRef  [2][MAX_NUM_REF][MAX_NUM_REF];
     
    22052193  Void      setRefPicList        ( std::vector<TComPic*> rpsCurrList[2], std::vector<Bool> usedAsLongTerm[2], Int numPocTotalCurr, Bool checkNumPocTotalCurr = false );
    22062194#else
    2207 #if FIX1071
    22082195  Void      setRefPicList       ( TComList<TComPic*>& rcListPic, Bool checkNumPocTotalCurr = false );
    2209 #else
    2210   Void      setRefPicList       ( TComList<TComPic*>& rcListPic );
    2211 #endif
    22122196#endif
    22132197  Void      setRefPOCList       ();
     
    22212205  Bool      isInterP        ()                          { return  m_eSliceType == P_SLICE;  }
    22222206 
    2223 #if SAO_CHROMA_LAMBDA 
    2224   Void      setLambda( Double d, Double e ) { m_dLambdaLuma = d; m_dLambdaChroma = e;}
    2225   Double    getLambdaLuma() { return m_dLambdaLuma;        }
    2226   Double    getLambdaChroma() { return m_dLambdaChroma;        }
    2227 #else
    2228   Void      setLambda( Double d ) { m_dLambda = d; }
    2229   Double    getLambda() { return m_dLambda;        }
    2230 #endif
     2207  Void      setLambdas ( const Double lambdas[3] ) { for (Int component = 0; component < 3; component++) m_lambdas[component] = lambdas[component]; }
     2208  const Double* getLambdas() const { return m_lambdas; }
    22312209 
    22322210  Void      initEqualRef();
     
    22622240  Bool isStepwiseTemporalLayerSwitchingPointCandidate( TComList<TComPic*>& rcListPic );
    22632241  Int       checkThatAllRefPicsAreAvailable( TComList<TComPic*>& rcListPic, TComReferencePictureSet *pReferencePictureSet, Bool printErrors, Int pocRandomAccess = 0);
    2264 #if FIX1071
    22652242  Void      createExplicitReferencePictureSetFromReference( TComList<TComPic*>& rcListPic, TComReferencePictureSet *pReferencePictureSet, Bool isRAP);
    2266 #else
    2267   Void      createExplicitReferencePictureSetFromReference( TComList<TComPic*>& rcListPic, TComReferencePictureSet *pReferencePictureSet);
    2268 #endif
    22692243
    22702244  Void setMaxNumMergeCand               (UInt val )         { m_maxNumMergeCand = val;                    }
  • branches/HTM-10.0rc1-dev0/source/Lib/TLibCommon/TComTrQuant.cpp

    r608 r837  
    44 * granted under this license. 
    55 *
    6  * Copyright (c) 2010-2013, ITU/ISO/IEC
     6* Copyright (c) 2010-2014, ITU/ISO/IEC
    77 * All rights reserved.
    88 *
     
    10681068    UInt uiLog2TrSize = g_aucConvertToBit[ iWidth ] + 2;
    10691069    Int scalingListType = (pcCU->isIntra(uiAbsPartIdx) ? 0 : 3) + g_eTTable[(Int)eTType];
    1070     assert(scalingListType < 6);
     1070    assert(scalingListType < SCALING_LIST_NUM);
    10711071    Int *piQuantCoeff = 0;
    10721072    piQuantCoeff = getQuantCoeff(scalingListType,m_cQP.m_iRem,uiLog2TrSize-2);
     
    13071307    Pel* pResi = rpcResidual + uiAddr;
    13081308    Int scalingListType = (pcCU->isIntra(uiAbsPartIdx) ? 0 : 3) + g_eTTable[(Int)eTxt];
    1309     assert(scalingListType < 6);
     1309    assert(scalingListType < SCALING_LIST_NUM);
    13101310    invtransformNxN( pcCU->getCUTransquantBypass(uiAbsPartIdx), eTxt, REG_DCT, pResi, uiStride, rpcCoeff, uiWidth, uiHeight, scalingListType, pcCU->getTransformSkip(uiAbsPartIdx, eTxt) );
    13111311  }
     
    15081508  const UInt uiMaxNumCoeff       = uiWidth * uiHeight;
    15091509  Int scalingListType = (pcCU->isIntra(uiAbsPartIdx) ? 0 : 3) + g_eTTable[(Int)eTType];
    1510   assert(scalingListType < 6);
     1510  assert(scalingListType < SCALING_LIST_NUM);
    15111511 
    15121512  Int iQBits = QUANT_SHIFT + m_cQP.m_iPer + iTransformShift;                   // Right shift of non-RDOQ quantizer;  level = (coeff*uiQ + offset)>>q_bits
     
    19271927              Int64 costUp   = rdFactor * ( - deltaU[uiBlkPos] ) + rateIncUp[uiBlkPos] ;
    19281928              Int64 costDown = rdFactor * (   deltaU[uiBlkPos] ) + rateIncDown[uiBlkPos]
    1929               -   ( abs(piDstCoeff[uiBlkPos])==1?((1<<15)+sigRateDelta[uiBlkPos]):0 );
     1929              -   ((abs(piDstCoeff[uiBlkPos]) == 1) ? sigRateDelta[uiBlkPos] : 0);
    19301930             
    19311931              if(lastCG==1 && lastNZPosInCG==n && abs(piDstCoeff[uiBlkPos])==1)
     
    21462146  {
    21472147    Double dErr         = Double( lLevelDouble  - ( uiAbsLevel << iQBits ) );
    2148     Double dCurrCost    = dErr * dErr * dTemp + xGetICRateCost( uiAbsLevel, ui16CtxNumOne, ui16CtxNumAbs, ui16AbsGoRice, c1Idx, c2Idx );
     2148    Double dCurrCost    = dErr * dErr * dTemp + xGetICost(xGetICRate( uiAbsLevel, ui16CtxNumOne, ui16CtxNumAbs, ui16AbsGoRice, c1Idx, c2Idx ));
    21492149    dCurrCost          += dCurrCostSig;
    21502150
     
    21672167 * \returns cost of given absolute transform level
    21682168 */
    2169 __inline Double TComTrQuant::xGetICRateCost  ( UInt                            uiAbsLevel,
     2169__inline Int TComTrQuant::xGetICRate  ( UInt                            uiAbsLevel,
    21702170                                               UShort                          ui16CtxNumOne,
    21712171                                               UShort                          ui16CtxNumAbs,
     
    21752175                                               ) const
    21762176{
    2177   Double iRate = xGetIEPRate();
     2177  Int iRate = Int(xGetIEPRate());
    21782178  UInt baseLevel  =  (c1Idx < C1FLAG_NUMBER)? (2 + (c2Idx < C2FLAG_NUMBER)) : 1;
    21792179
     
    22192219  else
    22202220  {
    2221     assert (0);
    2222   }
    2223   return xGetICost( iRate );
    2224 }
    2225 
    2226 __inline Int TComTrQuant::xGetICRate  ( UInt                            uiAbsLevel,
    2227                                        UShort                          ui16CtxNumOne,
    2228                                        UShort                          ui16CtxNumAbs,
    2229                                        UShort                          ui16AbsGoRice
    2230                                      , UInt                            c1Idx,
    2231                                        UInt                            c2Idx
    2232                                        ) const
    2233 {
    2234   Int iRate = 0;
    2235   UInt baseLevel  =  (c1Idx < C1FLAG_NUMBER)? (2 + (c2Idx < C2FLAG_NUMBER)) : 1;
    2236 
    2237   if ( uiAbsLevel >= baseLevel )
    2238   {
    2239     UInt uiSymbol     = uiAbsLevel - baseLevel;
    2240     UInt uiMaxVlc     = g_auiGoRiceRange[ ui16AbsGoRice ];
    2241     Bool bExpGolomb   = ( uiSymbol > uiMaxVlc );
    2242 
    2243     if( bExpGolomb )
    2244     {
    2245       uiAbsLevel  = uiSymbol - uiMaxVlc;
    2246       Int iEGS    = 1;  for( UInt uiMax = 2; uiAbsLevel >= uiMax; uiMax <<= 1, iEGS += 2 );
    2247       iRate      += iEGS << 15;
    2248       uiSymbol    = min<UInt>( uiSymbol, ( uiMaxVlc + 1 ) );
    2249     }
    2250 
    2251     UShort ui16PrefLen = UShort( uiSymbol >> ui16AbsGoRice ) + 1;
    2252     UShort ui16NumBins = min<UInt>( ui16PrefLen, g_auiGoRicePrefixLen[ ui16AbsGoRice ] ) + ui16AbsGoRice;
    2253 
    2254     iRate += ui16NumBins << 15;
    2255 
    2256     if (c1Idx < C1FLAG_NUMBER)
    2257     {
    2258       iRate += m_pcEstBitsSbac->m_greaterOneBits[ ui16CtxNumOne ][ 1 ];
    2259 
    2260       if (c2Idx < C2FLAG_NUMBER)
    2261       {
    2262         iRate += m_pcEstBitsSbac->m_levelAbsBits[ ui16CtxNumAbs ][ 1 ];
    2263       }
    2264     }
    2265   }
    2266   else
    2267   if( uiAbsLevel == 0 )
    2268   {
    2269     return 0;
    2270   }
    2271   else if( uiAbsLevel == 1 )
    2272   {
    2273     iRate += m_pcEstBitsSbac->m_greaterOneBits[ ui16CtxNumOne ][ 0 ];
    2274   }
    2275   else if( uiAbsLevel == 2 )
    2276   {
    2277     iRate += m_pcEstBitsSbac->m_greaterOneBits[ ui16CtxNumOne ][ 1 ];
    2278     iRate += m_pcEstBitsSbac->m_levelAbsBits[ ui16CtxNumAbs ][ 0 ];
    2279   }
    2280   else
    2281   {
    2282     assert(0);
     2221    iRate = 0;
    22832222  }
    22842223  return iRate;
  • branches/HTM-10.0rc1-dev0/source/Lib/TLibCommon/TComTrQuant.h

    r608 r837  
    44 * granted under this license. 
    55 *
    6  * Copyright (c) 2010-2013, ITU/ISO/IEC
     6* Copyright (c) 2010-2014, ITU/ISO/IEC
    77 * All rights reserved.
    88 *
     
    151151#if RDOQ_CHROMA_LAMBDA
    152152  Void setLambda(Double dLambdaLuma, Double dLambdaChroma) { m_dLambdaLuma = dLambdaLuma; m_dLambdaChroma = dLambdaChroma; }
    153   Void selectLambda(TextType eTType) { m_dLambda = (eTType == TEXT_LUMA) ? m_dLambdaLuma : m_dLambdaChroma; }
     153  Void selectLambda(TextType eTType) { m_dLambda = (eTType == TEXT_LUMA) ? m_lambdas[0] : ((eTType == TEXT_CHROMA_U) ? m_lambdas[1] : m_lambdas[2]); }
    154154#else
    155155  Void setLambda(Double dLambda) { m_dLambda = dLambda;}
     
    207207  QpParam  m_cQP;
    208208#if RDOQ_CHROMA_LAMBDA
    209   Double   m_dLambdaLuma;
    210   Double   m_dLambdaChroma;
     209  Double   m_lambdas[3];
    211210#endif
    212211  Double   m_dLambda;
     
    273272                                             Double                          dTemp,
    274273                                             Bool                            bLast        ) const;
    275   __inline Double xGetICRateCost   ( UInt                            uiAbsLevel,
    276                                      UShort                          ui16CtxNumOne,
    277                                      UShort                          ui16CtxNumAbs,
    278                                      UShort                          ui16AbsGoRice
    279                                    , UInt                            c1Idx,
    280                                      UInt                            c2Idx
    281                                      ) const;
    282274__inline Int xGetICRate  ( UInt                            uiAbsLevel,
    283275                           UShort                          ui16CtxNumOne,
  • branches/HTM-10.0rc1-dev0/source/Lib/TLibCommon/TComWeightPrediction.cpp

    r608 r837  
    44 * granted under this license. 
    55 *
    6  * Copyright (c) 2010-2013, ITU/ISO/IEC
     6* Copyright (c) 2010-2014, ITU/ISO/IEC
    77 * All rights reserved.
    88 *
  • branches/HTM-10.0rc1-dev0/source/Lib/TLibCommon/TComWeightPrediction.h

    r655 r837  
    44 * granted under this license. 
    55 *
    6  * Copyright (c) 2010-2013, ITU/ISO/IEC
     6* Copyright (c) 2010-2014, ITU/ISO/IEC
    77 * All rights reserved.
    88 *
  • branches/HTM-10.0rc1-dev0/source/Lib/TLibCommon/TComYuv.cpp

    r622 r837  
    44 * granted under this license. 
    55 *
    6  * Copyright (c) 2010-2013, ITU/ISO/IEC
     6* Copyright (c) 2010-2014, ITU/ISO/IEC
    77 * All rights reserved.
    88 *
     
    110110  {
    111111    ::memcpy( pDst, pSrc, sizeof(Pel)*iWidth);
    112 
    113112#if ENC_DEC_TRACE && H_MV_ENC_DEC_TRAC
    114113    if ( g_traceCopyBack && g_nSymbolCounter >= g_stopAtCounter )
     
    121120    }
    122121#endif
    123 
    124122    pDst += iDstStride;
    125123    pSrc += iSrcStride;
     
    616614    {
    617615#if DISABLING_CLIP_FOR_BIPREDME
    618       pDst[x ] = (pDst[x ]<<1) - pSrc[x ] ;
     616      pDst[x ] = 2 * pDst[x] - pSrc[x];
    619617#else
    620       pDst[x ] = Clip( (pDst[x ]<<1) - pSrc[x ] );
     618      pDst[x ] = ClipY(2 * pDst[x] - pSrc[x]);
    621619#endif
    622620    }
     
    636634    {
    637635#if DISABLING_CLIP_FOR_BIPREDME
    638       pDstU[x ] = (pDstU[x ]<<1) - pSrcU[x ] ;
    639       pDstV[x ] = (pDstV[x ]<<1) - pSrcV[x ] ;
     636      pDstU[x ] = 2 * pDstU[x] - pSrcU[x];
     637      pDstV[x ] = 2 * pDstV[x] - pSrcV[x];
    640638#else
    641       pDstU[x ] = Clip( (pDstU[x ]<<1) - pSrcU[x ] );
    642       pDstV[x ] = Clip( (pDstV[x ]<<1) - pSrcV[x ] );
     639      pDstU[x ] = ClipC(2 * pDstU[x] - pSrcU[x]);
     640      pDstV[x ] = ClipC(2 * pDstV[x] - pSrcV[x]);
    643641#endif
    644642    }
     
    649647  }
    650648}
    651 
    652 #if H_3D
    653 Void TComYuv::addClipPartLuma( TComYuv* pcYuvSrc0, TComYuv* pcYuvSrc1, UInt uiTrUnitIdx, UInt uiPartSize )
    654 {
    655   Int x, y;
    656 
    657   Pel* pSrc0 = pcYuvSrc0->getLumaAddr( uiTrUnitIdx);
    658   Pel* pSrc1 = pcYuvSrc1->getLumaAddr( uiTrUnitIdx);
    659   Pel* pDst  = getLumaAddr( uiTrUnitIdx);
    660 
    661   UInt iSrc0Stride = pcYuvSrc0->getStride();
    662   UInt iSrc1Stride = pcYuvSrc1->getStride();
    663   UInt iDstStride  = getStride();
    664   for ( y = uiPartSize-1; y >= 0; y-- )
    665   {
    666     for ( x = uiPartSize-1; x >= 0; x-- )
    667     {
    668       pDst[x] = ClipY( pSrc0[x] + pSrc1[x] );     
    669     }
    670     pSrc0 += iSrc0Stride;
    671     pSrc1 += iSrc1Stride;
    672     pDst  += iDstStride;
    673   }
    674 }
    675 
    676 #if H_3D_ARP
    677 Void TComYuv::addARP( TComYuv* pcYuvSrc0, TComYuv* pcYuvSrc1, UInt uiAbsPartIdx, UInt uiWidth, UInt uiHeight, Bool bClip )
    678 {
    679   addARPLuma   ( pcYuvSrc0, pcYuvSrc1, uiAbsPartIdx, uiWidth   , uiHeight    , bClip );
    680   addARPChroma ( pcYuvSrc0, pcYuvSrc1, uiAbsPartIdx, uiWidth>>1, uiHeight>>1 , bClip );
    681 }
    682 
    683 Void TComYuv::addARPLuma( TComYuv* pcYuvSrc0, TComYuv* pcYuvSrc1, UInt uiAbsPartIdx, UInt uiWidth, UInt uiHeight, Bool bClip )
    684 {
    685   Int x, y;
    686 
    687   Pel* pSrc0 = pcYuvSrc0->getLumaAddr( uiAbsPartIdx );
    688   Pel* pSrc1 = pcYuvSrc1->getLumaAddr( uiAbsPartIdx );
    689   Pel* pDst  = getLumaAddr( uiAbsPartIdx );
    690 
    691   UInt iSrc0Stride = pcYuvSrc0->getStride();
    692   UInt iSrc1Stride = pcYuvSrc1->getStride();
    693   UInt iDstStride  = getStride();
    694   for ( y = uiHeight-1; y >= 0; y-- )
    695   {
    696     for ( x = uiWidth-1; x >= 0; x-- )
    697     {
    698       pDst[x] = pSrc0[x] + pSrc1[x];
    699       if( bClip )
    700       {
    701         pDst[x] = ClipY( pDst[x] );
    702       }
    703     }
    704     pSrc0 += iSrc0Stride;
    705     pSrc1 += iSrc1Stride;
    706     pDst  += iDstStride;
    707   }
    708 }
    709 
    710 Void TComYuv::addARPChroma( TComYuv* pcYuvSrc0, TComYuv* pcYuvSrc1, UInt uiAbsPartIdx, UInt uiWidth, UInt uiHeight, Bool bClip )
    711 {
    712   Int x, y;
    713 
    714   Pel* pSrcU0 = pcYuvSrc0->getCbAddr( uiAbsPartIdx );
    715   Pel* pSrcU1 = pcYuvSrc1->getCbAddr( uiAbsPartIdx );
    716   Pel* pSrcV0 = pcYuvSrc0->getCrAddr( uiAbsPartIdx );
    717   Pel* pSrcV1 = pcYuvSrc1->getCrAddr( uiAbsPartIdx );
    718   Pel* pDstU = getCbAddr( uiAbsPartIdx );
    719   Pel* pDstV = getCrAddr( uiAbsPartIdx );
    720 
    721   UInt  iSrc0Stride = pcYuvSrc0->getCStride();
    722   UInt  iSrc1Stride = pcYuvSrc1->getCStride();
    723   UInt  iDstStride  = getCStride();
    724   for ( y = uiHeight-1; y >= 0; y-- )
    725   {
    726     for ( x = uiWidth-1; x >= 0; x-- )
    727     {
    728       pDstU[x] = pSrcU0[x] + pSrcU1[x];
    729       pDstV[x] = pSrcV0[x] + pSrcV1[x];
    730       if( bClip )
    731       {
    732         pDstU[x] = ClipC( pDstU[x] );
    733         pDstV[x] = ClipC( pDstV[x] );
    734       }
    735     }
    736 
    737     pSrcU0 += iSrc0Stride;
    738     pSrcU1 += iSrc1Stride;
    739     pSrcV0 += iSrc0Stride;
    740     pSrcV1 += iSrc1Stride;
    741     pDstU  += iDstStride;
    742     pDstV  += iDstStride;
    743   }
    744 }
    745 
    746 Void TComYuv::subtractARP( TComYuv* pcYuvSrc0, TComYuv* pcYuvSrc1, UInt uiAbsPartIdx, UInt uiWidth , UInt uiHeight )
    747 {
    748   subtractARPLuma  ( pcYuvSrc0, pcYuvSrc1,  uiAbsPartIdx, uiWidth    , uiHeight    );
    749   subtractARPChroma( pcYuvSrc0, pcYuvSrc1,  uiAbsPartIdx, uiWidth>>1 , uiHeight>>1 );
    750 }
    751 
    752 Void TComYuv::subtractARPLuma( TComYuv* pcYuvSrc0, TComYuv* pcYuvSrc1, UInt uiAbsPartIdx, UInt uiWidth , UInt uiHeight )
    753 {
    754   Int x, y;
    755 
    756   Pel* pSrc0 = pcYuvSrc0->getLumaAddr( uiAbsPartIdx );
    757   Pel* pSrc1 = pcYuvSrc1->getLumaAddr( uiAbsPartIdx );
    758   Pel* pDst  = getLumaAddr( uiAbsPartIdx );
    759 
    760   Int  iSrc0Stride = pcYuvSrc0->getStride();
    761   Int  iSrc1Stride = pcYuvSrc1->getStride();
    762   Int  iDstStride  = getStride();
    763   for ( y = uiHeight-1; y >= 0; y-- )
    764   {
    765     for ( x = uiWidth-1; x >= 0; x-- )
    766     {
    767       pDst[x] = pSrc0[x] - pSrc1[x];
    768     }
    769     pSrc0 += iSrc0Stride;
    770     pSrc1 += iSrc1Stride;
    771     pDst  += iDstStride;
    772   }
    773 }
    774 
    775 Void TComYuv::subtractARPChroma( TComYuv* pcYuvSrc0, TComYuv* pcYuvSrc1, UInt uiAbsPartIdx, UInt uiWidth , UInt uiHeight )
    776 {
    777   Int x, y;
    778 
    779   Pel* pSrcU0 = pcYuvSrc0->getCbAddr( uiAbsPartIdx );
    780   Pel* pSrcU1 = pcYuvSrc1->getCbAddr( uiAbsPartIdx );
    781   Pel* pSrcV0 = pcYuvSrc0->getCrAddr( uiAbsPartIdx );
    782   Pel* pSrcV1 = pcYuvSrc1->getCrAddr( uiAbsPartIdx );
    783   Pel* pDstU  = getCbAddr( uiAbsPartIdx );
    784   Pel* pDstV  = getCrAddr( uiAbsPartIdx );
    785 
    786   Int  iSrc0Stride = pcYuvSrc0->getCStride();
    787   Int  iSrc1Stride = pcYuvSrc1->getCStride();
    788   Int  iDstStride  = getCStride();
    789   for ( y = uiHeight-1; y >= 0; y-- )
    790   {
    791     for ( x = uiWidth-1; x >= 0; x-- )
    792     {
    793       pDstU[x] = pSrcU0[x] - pSrcU1[x];
    794       pDstV[x] = pSrcV0[x] - pSrcV1[x];
    795     }
    796     pSrcU0 += iSrc0Stride;
    797     pSrcU1 += iSrc1Stride;
    798     pSrcV0 += iSrc0Stride;
    799     pSrcV1 += iSrc1Stride;
    800     pDstU  += iDstStride;
    801     pDstV  += iDstStride;
    802   }
    803 }
    804 
    805 Void TComYuv::multiplyARP( UInt uiAbsPartIdx , UInt uiWidth , UInt uiHeight , UChar dW )
    806 {
    807   multiplyARPLuma( uiAbsPartIdx , uiWidth , uiHeight , dW );
    808   multiplyARPChroma( uiAbsPartIdx , uiWidth >> 1 , uiHeight >> 1 , dW );
    809 }
    810 
    811 Void TComYuv::xxMultiplyLine( Pel* pSrcDst , UInt uiWidth , UChar dW )
    812 {
    813   assert( dW == 2 );
    814   for( UInt x = 0 ; x < uiWidth ; x++ )
    815     pSrcDst[x] =  pSrcDst[x] >> 1;
    816 }
    817 
    818 Void TComYuv::multiplyARPLuma( UInt uiAbsPartIdx , UInt uiWidth , UInt uiHeight , UChar dW )
    819 {
    820   Pel* pDst  = getLumaAddr( uiAbsPartIdx );
    821   Int  iDstStride  = getStride();
    822   for ( Int y = uiHeight-1; y >= 0; y-- )
    823   {
    824     xxMultiplyLine( pDst , uiWidth , dW );
    825     pDst  += iDstStride;
    826   }
    827 }
    828 
    829 Void TComYuv::multiplyARPChroma( UInt uiAbsPartIdx , UInt uiWidth , UInt uiHeight , UChar dW )
    830 {
    831   Pel* pDstU  = getCbAddr( uiAbsPartIdx );
    832   Pel* pDstV  = getCrAddr( uiAbsPartIdx );
    833 
    834   Int  iDstStride  = getCStride();
    835   for ( Int y = uiHeight-1; y >= 0; y-- )
    836   {
    837     xxMultiplyLine( pDstU , uiWidth , dW );
    838     xxMultiplyLine( pDstV , uiWidth , dW );
    839     pDstU  += iDstStride;
    840     pDstV  += iDstStride;
    841   }
    842 }
    843 #endif
    844 #endif
    845649//! \}
  • branches/HTM-10.0rc1-dev0/source/Lib/TLibCommon/TComYuv.h

    r608 r837  
    44 * granted under this license. 
    55 *
    6  * Copyright (c) 2010-2013, ITU/ISO/IEC
     6* Copyright (c) 2010-2014, ITU/ISO/IEC
    77 * All rights reserved.
    88 *
  • branches/HTM-10.0rc1-dev0/source/Lib/TLibCommon/TypeDef.h

    r833 r837  
    44 * granted under this license. 
    55 *
    6  * Copyright (c) 2010-2013, ITU/ISO/IEC
     6* Copyright (c) 2010-2014, ITU/ISO/IEC
    77 * All rights reserved.
    88 *
     
    326326///////////////////////////////////   HM RELATED DEFINES ////////////////////////////////
    327327/////////////////////////////////////////////////////////////////////////////////////////
    328 
    329 #define FIX1071 1 ///< fix for issue #1071
     328#define BUGFIX_INTRAPERIOD 1
     329#define SAO_ENCODE_ALLOW_USE_PREDEBLOCK 1
     330
     331#define FIX1172 1 ///< fix ticket #1172
    330332
    331333#define MAX_NUM_PICS_IN_SOP           1024
     
    342344#else
    343345#define MAX_VPS_NUH_RESERVED_ZERO_LAYER_ID_PLUS1  1
    344 #endif
    345 
    346 #define RATE_CONTROL_LAMBDA_DOMAIN                  1  ///< JCTVC-K0103, rate control by R-lambda model
    347 #define M0036_RC_IMPROVEMENT                        1  ///< JCTVC-M0036, improvement for R-lambda model based rate control
    348 #define TICKET_1090_FIX                             1
    349 
    350 #if KWU_FIX_URQ
    351 #if RATE_CONTROL_LAMBDA_DOMAIN
    352 #define RC_FIX                                      1  /// suggested fix for M0036
    353 #define RATE_CONTROL_INTRA                          1  ///< JCTVC-M0257, rate control for intra
    354 #endif
    355 #else
    356 #define RC_FIX                                      1  /// suggested fix for M0036
    357 #define RATE_CONTROL_INTRA                          1  ///< JCTVC-M0257, rate control for intra
    358346#endif
    359347
     
    389377#define C1FLAG_NUMBER               8 // maximum number of largerThan1 flag coded in one chunk :  16 in HM5
    390378#define C2FLAG_NUMBER               1 // maximum number of largerThan2 flag coded in one chunk:  16 in HM5
    391 
    392 #define REMOVE_SAO_LCU_ENC_CONSTRAINTS_3 1  ///< disable the encoder constraint that conditionally disable SAO for chroma for entire slice in interleaved mode
    393 
    394379#define SAO_ENCODING_CHOICE              1  ///< I0184: picture early termination
    395380#if SAO_ENCODING_CHOICE
     
    405390#define MAX_NUM_PPS                64
    406391
    407 
    408 
    409 #define WEIGHTED_CHROMA_DISTORTION  1   ///< F386: weighting of chroma for RDO
    410392#define RDOQ_CHROMA_LAMBDA          1   ///< F386: weighting of chroma for RDOQ
    411 #define SAO_CHROMA_LAMBDA           1   ///< F386: weighting of chroma for SAO
    412393
    413394#define MIN_SCAN_POS_CROSS          4
     
    423404#define LEVEL_RANGE                         30     ///< G382: max coefficient level in statistics collection
    424405#endif
    425 
    426 #define NS_HAD                               0
    427406
    428407#define HHI_RQT_INTRA_SPEEDUP             1           ///< tests one best mode with full rqt
     
    492471#endif
    493472
    494 #define SCALING_LIST_OUTPUT_RESULT    0 //JCTVC-G880/JCTVC-G1016 quantization matrices
    495 
    496473#define CABAC_INIT_PRESENT_FLAG     1
    497474
     
    503480typedef       bool                Bool;
    504481
     482#ifdef __arm__
     483typedef       signed char         Char;
     484#else
    505485typedef       char                Char;
     486#endif
    506487typedef       unsigned char       UChar;
    507488typedef       short               Short;
     
    570551};
    571552
    572 #define NUM_DOWN_PART 4
    573 
    574 enum SAOTypeLen
    575 {
    576   SAO_EO_LEN    = 4,
    577   SAO_BO_LEN    = 4,
    578   SAO_MAX_BO_CLASSES = 32
    579 };
    580 
    581 enum SAOType
    582 {
    583   SAO_EO_0 = 0,
    584   SAO_EO_1,
    585   SAO_EO_2,
    586   SAO_EO_3,
    587   SAO_BO,
    588   MAX_NUM_SAO_TYPE
    589 };
    590 
    591 typedef struct _SaoQTPart
    592 {
    593   Int         iBestType;
    594   Int         iLength;
    595   Int         subTypeIdx ;                 ///< indicates EO class or BO band position
    596   Int         iOffset[4];
    597   Int         StartCUX;
    598   Int         StartCUY;
    599   Int         EndCUX;
    600   Int         EndCUY;
    601 
    602   Int         PartIdx;
    603   Int         PartLevel;
    604   Int         PartCol;
    605   Int         PartRow;
    606 
    607   Int         DownPartsIdx[NUM_DOWN_PART];
    608   Int         UpPartIdx;
    609 
    610   Bool        bSplit;
    611 
    612   //---- encoder only start -----//
    613   Bool        bProcessed;
    614   Double      dMinCost;
    615   Int64       iMinDist;
    616   Int         iMinRate;
    617   //---- encoder only end -----//
    618 } SAOQTPart;
    619 
    620 typedef struct _SaoLcuParam
    621 {
    622   Bool       mergeUpFlag;
    623   Bool       mergeLeftFlag;
    624   Int        typeIdx;
    625   Int        subTypeIdx;                  ///< indicates EO class or BO band position
    626   Int        offset[4];
    627   Int        partIdx;
    628   Int        partIdxTmp;
    629   Int        length;
    630 } SaoLcuParam;
    631 
    632 struct SAOParam
    633 {
    634   Bool       bSaoFlag[2];
    635   SAOQTPart* psSaoPart[3];
    636   Int        iMaxSplitLevel;
    637   Bool         oneUnitFlag[3];
    638   SaoLcuParam* saoLcuParam[3];
    639   Int          numCuInHeight;
    640   Int          numCuInWidth;
    641   ~SAOParam();
     553
     554enum SAOMode //mode
     555{
     556  SAO_MODE_OFF = 0,
     557  SAO_MODE_NEW,
     558  SAO_MODE_MERGE,
     559  NUM_SAO_MODES
     560};
     561
     562enum SAOModeMergeTypes
     563{
     564  SAO_MERGE_LEFT =0,
     565  SAO_MERGE_ABOVE,
     566  NUM_SAO_MERGE_TYPES
     567};
     568
     569
     570enum SAOModeNewTypes
     571{
     572  SAO_TYPE_START_EO =0,
     573  SAO_TYPE_EO_0 = SAO_TYPE_START_EO,
     574  SAO_TYPE_EO_90,
     575  SAO_TYPE_EO_135,
     576  SAO_TYPE_EO_45,
     577
     578  SAO_TYPE_START_BO,
     579  SAO_TYPE_BO = SAO_TYPE_START_BO,
     580
     581  NUM_SAO_NEW_TYPES
     582};
     583#define NUM_SAO_EO_TYPES_LOG2 2
     584
     585enum SAOEOClasses
     586{
     587  SAO_CLASS_EO_FULL_VALLEY = 0,
     588  SAO_CLASS_EO_HALF_VALLEY = 1,
     589  SAO_CLASS_EO_PLAIN       = 2,
     590  SAO_CLASS_EO_HALF_PEAK   = 3,
     591  SAO_CLASS_EO_FULL_PEAK   = 4,
     592  NUM_SAO_EO_CLASSES,
     593};
     594
     595
     596#define NUM_SAO_BO_CLASSES_LOG2  5
     597enum SAOBOClasses
     598{
     599  //SAO_CLASS_BO_BAND0 = 0,
     600  //SAO_CLASS_BO_BAND1,
     601  //SAO_CLASS_BO_BAND2,
     602  //...
     603  //SAO_CLASS_BO_BAND31,
     604
     605  NUM_SAO_BO_CLASSES = (1<<NUM_SAO_BO_CLASSES_LOG2),
     606};
     607#define MAX_NUM_SAO_CLASSES  32  //(NUM_SAO_EO_GROUPS > NUM_SAO_BO_GROUPS)?NUM_SAO_EO_GROUPS:NUM_SAO_BO_GROUPS
     608
     609struct SAOOffset
     610{
     611  Int modeIdc; //NEW, MERGE, OFF
     612  Int typeIdc; //NEW: EO_0, EO_90, EO_135, EO_45, BO. MERGE: left, above
     613  Int typeAuxInfo; //BO: starting band index
     614  Int offset[MAX_NUM_SAO_CLASSES];
     615
     616  SAOOffset();
     617  ~SAOOffset();
     618  Void reset();
     619
     620  const SAOOffset& operator= (const SAOOffset& src);
     621};
     622
     623struct SAOBlkParam
     624{
     625
     626  SAOBlkParam();
     627  ~SAOBlkParam();
     628  Void reset();
     629  const SAOBlkParam& operator= (const SAOBlkParam& src);
     630  SAOOffset& operator[](Int compIdx){ return offsetParam[compIdx];}
     631private:
     632  SAOOffset offsetParam[NUM_SAO_COMPONENTS];
     633
    642634};
    643635
  • branches/HTM-10.0rc1-dev0/source/Lib/TLibDecoder/AnnexBread.cpp

    r608 r837  
    44 * granted under this license.
    55 *
    6  * Copyright (c) 2010-2013, ITU/ISO/IEC
     6* Copyright (c) 2010-2014, ITU/ISO/IEC
    77 * All rights reserved.
    88 *
  • branches/HTM-10.0rc1-dev0/source/Lib/TLibDecoder/AnnexBread.h

    r608 r837  
    44 * granted under this license.
    55 *
    6  * Copyright (c) 2010-2013, ITU/ISO/IEC
     6* Copyright (c) 2010-2014, ITU/ISO/IEC
    77 * All rights reserved.
    88 *
  • branches/HTM-10.0rc1-dev0/source/Lib/TLibDecoder/NALread.cpp

    r608 r837  
    44 * granted under this license.
    55 *
    6  * Copyright (c) 2010-2013, ITU/ISO/IEC
     6* Copyright (c) 2010-2014, ITU/ISO/IEC
    77 * All rights reserved.
    88 *
     
    7070        break;
    7171      }
     72      assert(*it_read <= 0x03);
    7273    }
    7374    zeroCount = (*it_read == 0x00) ? zeroCount+1 : 0;
     
    126127  else
    127128  {
    128     assert( nalu.m_nalUnitType != NAL_UNIT_CODED_SLICE_TLA_R
     129    assert( nalu.m_nalUnitType != NAL_UNIT_CODED_SLICE_TSA_R
    129130         && nalu.m_nalUnitType != NAL_UNIT_CODED_SLICE_TSA_N
    130131         && nalu.m_nalUnitType != NAL_UNIT_CODED_SLICE_STSA_R
  • branches/HTM-10.0rc1-dev0/source/Lib/TLibDecoder/NALread.h

    r608 r837  
    44 * granted under this license.
    55 *
    6  * Copyright (c) 2010-2013, ITU/ISO/IEC
     6* Copyright (c) 2010-2014, ITU/ISO/IEC
    77 * All rights reserved.
    88 *
  • branches/HTM-10.0rc1-dev0/source/Lib/TLibDecoder/SEIread.cpp

    r655 r837  
    44 * granted under this license.
    55 *
    6  * Copyright (c) 2010-2013, ITU/ISO/IEC
     6* Copyright (c) 2010-2014, ITU/ISO/IEC
    77 * All rights reserved.
    88 *
     
    443443  if( !pHRD->getSubPicCpbParamsPresentFlag() )
    444444  {
    445     READ_FLAG( code, "rap_cpb_params_present_flag" );                   sei.m_rapCpbParamsPresentFlag = code;
     445    READ_FLAG( code, "irap_cpb_params_present_flag" );                   sei.m_rapCpbParamsPresentFlag = code;
     446  }
     447  if( sei.m_rapCpbParamsPresentFlag )
     448  {
     449    READ_CODE( pHRD->getCpbRemovalDelayLengthMinus1() + 1, code, "cpb_delay_offset" );      sei.m_cpbDelayOffset = code;
     450    READ_CODE( pHRD->getDpbOutputDelayLengthMinus1()  + 1, code, "dpb_delay_offset" );      sei.m_dpbDelayOffset = code;
    446451  }
    447452  //read splicing flag and cpb_removal_delay_delta
     
    450455  READ_CODE( ( pHRD->getCpbRemovalDelayLengthMinus1() + 1 ), code, "au_cpb_removal_delay_delta_minus1" );
    451456  sei.m_auCpbRemovalDelayDelta = code + 1;
    452   if( sei.m_rapCpbParamsPresentFlag )
    453   {
    454     READ_CODE( pHRD->getCpbRemovalDelayLengthMinus1() + 1, code, "cpb_delay_offset" );      sei.m_cpbDelayOffset = code;
    455     READ_CODE( pHRD->getDpbOutputDelayLengthMinus1()  + 1, code, "dpb_delay_offset" );      sei.m_dpbDelayOffset = code;
    456   }
    457457  for( nalOrVcl = 0; nalOrVcl < 2; nalOrVcl ++ )
    458458  {
  • branches/HTM-10.0rc1-dev0/source/Lib/TLibDecoder/SEIread.h

    r608 r837  
    44 * granted under this license.
    55 *
    6  * Copyright (c) 2010-2013, ITU/ISO/IEC
     6* Copyright (c) 2010-2014, ITU/ISO/IEC
    77 * All rights reserved.
    88 *
  • branches/HTM-10.0rc1-dev0/source/Lib/TLibDecoder/SyntaxElementParser.cpp

    r655 r837  
    44* granted under this license. 
    55*
    6 * Copyright (c) 2010-2013, ITU/ISO/IEC
     6* Copyright (c) 2010-2014, ITU/ISO/IEC
    77* All rights reserved.
    88*
  • branches/HTM-10.0rc1-dev0/source/Lib/TLibDecoder/SyntaxElementParser.h

    r608 r837  
    44 * granted under this license. 
    55 *
    6  * Copyright (c) 2010-2013, ITU/ISO/IEC
     6* Copyright (c) 2010-2014, ITU/ISO/IEC
    77 * All rights reserved.
    88 *
  • branches/HTM-10.0rc1-dev0/source/Lib/TLibDecoder/TDecBinCoder.h

    r608 r837  
    44 * granted under this license. 
    55 *
    6  * Copyright (c) 2010-2013, ITU/ISO/IEC
     6* Copyright (c) 2010-2014, ITU/ISO/IEC
    77 * All rights reserved.
    88 *
  • branches/HTM-10.0rc1-dev0/source/Lib/TLibDecoder/TDecBinCoderCABAC.cpp

    r608 r837  
    44 * granted under this license. 
    55 *
    6  * Copyright (c) 2010-2013, ITU/ISO/IEC
     6* Copyright (c) 2010-2014, ITU/ISO/IEC
    77 * All rights reserved.
    88 *
  • branches/HTM-10.0rc1-dev0/source/Lib/TLibDecoder/TDecBinCoderCABAC.h

    r608 r837  
    44 * granted under this license. 
    55 *
    6  * Copyright (c) 2010-2013, ITU/ISO/IEC
     6* Copyright (c) 2010-2014, ITU/ISO/IEC
    77 * All rights reserved.
    88 *
  • branches/HTM-10.0rc1-dev0/source/Lib/TLibDecoder/TDecCAVLC.cpp

    r833 r837  
    44* granted under this license. 
    55*
    6 * Copyright (c) 2010-2013, ITU/ISO/IEC
     6* Copyright (c) 2010-2014, ITU/ISO/IEC
    77* All rights reserved.
    88*
     
    848848  READ_UVLC( uiCode, "log2_diff_max_min_coding_block_size" );
    849849  pcSPS->setLog2DiffMaxMinCodingBlockSize(uiCode);
     850 
     851  if (pcSPS->getPTL()->getGeneralPTL()->getLevelIdc() >= Level::LEVEL5)
     852  {
     853    assert(log2MinCUSize + pcSPS->getLog2DiffMaxMinCodingBlockSize() >= 5);
     854  }
     855 
    850856  Int maxCUDepthDelta = uiCode;
    851857  pcSPS->setMaxCUWidth  ( 1<<(log2MinCUSize + maxCUDepthDelta) );
  • branches/HTM-10.0rc1-dev0/source/Lib/TLibDecoder/TDecCAVLC.h

    r833 r837  
    44 * granted under this license. 
    55 *
    6  * Copyright (c) 2010-2013, ITU/ISO/IEC
     6* Copyright (c) 2010-2014, ITU/ISO/IEC
    77 * All rights reserved.
    88 *
  • branches/HTM-10.0rc1-dev0/source/Lib/TLibDecoder/TDecCu.cpp

    r833 r837  
    44 * granted under this license. 
    55 *
    6  * Copyright (c) 2010-2013, ITU/ISO/IEC
     6* Copyright (c) 2010-2014, ITU/ISO/IEC
    77 * All rights reserved.
    88 *
     
    918918#endif
    919919 
     920  if ( pcCU->getCbf( uiAbsPartIdx, TEXT_LUMA, uiTrDepth ) )
     921  {
    920922  //===== inverse transform =====
    921923  m_pcTrQuant->setQPforQuant  ( pcCU->getQP(0), TEXT_LUMA, pcCU->getSlice()->getSPS()->getQpBDOffsetY(), 0 );
    922924
    923925  Int scalingListType = (pcCU->isIntra(uiAbsPartIdx) ? 0 : 3) + g_eTTable[(Int)TEXT_LUMA];
    924   assert(scalingListType < 6);
     926    assert(scalingListType < SCALING_LIST_NUM);
    925927  m_pcTrQuant->invtransformNxN( pcCU->getCUTransquantBypass(uiAbsPartIdx), TEXT_LUMA, pcCU->getLumaIntraDir( uiAbsPartIdx ), piResi, uiStride, pcCoeff, uiWidth, uiHeight, scalingListType, useTransformSkip );
    926928
     
    953955    pReco     += uiStride;
    954956    pRecIPred += uiRecIPredStride;
     957  }
     958}
     959  else
     960  {
     961    //===== reconstruction =====
     962    Pel* pPred      = piPred;
     963    Pel* pReco      = piReco;
     964    Pel* pRecIPred  = piRecIPred;
     965    for ( Int y = 0; y < uiHeight; y++ )
     966    {
     967      for ( Int x = 0; x < uiWidth; x++ )
     968      {
     969        pReco    [ x ] = pPred[ x ];
     970        pRecIPred[ x ] = pReco[ x ];
     971      }
     972      pPred     += uiStride;
     973      pReco     += uiStride;
     974      pRecIPred += uiRecIPredStride;
     975    }
    955976  }
    956977}
     
    10221043  }
    10231044
     1045  if ( pcCU->getCbf( uiAbsPartIdx, eText, uiTrDepth ) )
     1046  {
    10241047  //===== inverse transform =====
    10251048  Int curChromaQpOffset;
     
    10351058
    10361059  Int scalingListType = (pcCU->isIntra(uiAbsPartIdx) ? 0 : 3) + g_eTTable[(Int)eText];
    1037   assert(scalingListType < 6);
     1060    assert(scalingListType < SCALING_LIST_NUM);
    10381061  m_pcTrQuant->invtransformNxN( pcCU->getCUTransquantBypass(uiAbsPartIdx), eText, REG_DCT, piResi, uiStride, pcCoeff, uiWidth, uiHeight, scalingListType, useTransformSkipChroma );
    10391062
     
    10541077    pReco     += uiStride;
    10551078    pRecIPred += uiRecIPredStride;
     1079  }
     1080}
     1081  else
     1082  {
     1083    //===== reconstruction =====
     1084    Pel* pPred      = piPred;
     1085    Pel* pReco      = piReco;
     1086    Pel* pRecIPred  = piRecIPred;
     1087    for ( Int y = 0; y < uiHeight; y++ )
     1088    {
     1089      for ( Int x = 0; x < uiWidth; x++ )
     1090      {
     1091        pReco    [ x ] = pPred[ x ];
     1092        pRecIPred[ x ] = pReco[ x ];
     1093      }
     1094      pPred     += uiStride;
     1095      pReco     += uiStride;
     1096      pRecIPred += uiRecIPredStride;
     1097    }   
    10561098  }
    10571099}
  • branches/HTM-10.0rc1-dev0/source/Lib/TLibDecoder/TDecCu.h

    r833 r837  
    44 * granted under this license. 
    55 *
    6  * Copyright (c) 2010-2013, ITU/ISO/IEC
     6* Copyright (c) 2010-2014, ITU/ISO/IEC
    77 * All rights reserved.
    88 *
  • branches/HTM-10.0rc1-dev0/source/Lib/TLibDecoder/TDecEntropy.cpp

    r833 r837  
    44 * granted under this license. 
    55 *
    6  * Copyright (c) 2010-2013, ITU/ISO/IEC
     6* Copyright (c) 2010-2014, ITU/ISO/IEC
    77 * All rights reserved.
    88 *
     
    580580}
    581581
    582 Void TDecEntropy::xDecodeTransform( TComDataCU* pcCU, UInt offsetLuma, UInt offsetChroma, UInt uiAbsPartIdx, UInt uiDepth, UInt width, UInt height, UInt uiTrIdx, Bool& bCodeDQP)
     582Void TDecEntropy::xDecodeTransform( TComDataCU* pcCU, UInt offsetLuma, UInt offsetChroma, UInt uiAbsPartIdx, UInt uiDepth, UInt width, UInt height, UInt uiTrIdx, Bool& bCodeDQP, Int quadtreeTULog2MinSizeInCU)
    583583{
    584584  UInt uiSubdiv;
     
    604604  else if( (pcCU->getSlice()->getSPS()->getQuadtreeTUMaxDepthInter() == 1) && (pcCU->getPredictionMode(uiAbsPartIdx) == MODE_INTER) && ( pcCU->getPartitionSize(uiAbsPartIdx) != SIZE_2Nx2N ) && (uiDepth == pcCU->getDepth(uiAbsPartIdx)) )
    605605  {
    606     uiSubdiv = (uiLog2TrafoSize > pcCU->getQuadtreeTULog2MinSizeInCU(uiAbsPartIdx));
     606    uiSubdiv = (uiLog2TrafoSize > quadtreeTULog2MinSizeInCU);
    607607  }
    608608  else if( uiLog2TrafoSize > pcCU->getSlice()->getSPS()->getQuadtreeTULog2MaxSize() )
     
    614614    uiSubdiv = 0;
    615615  }
    616   else if( uiLog2TrafoSize == pcCU->getQuadtreeTULog2MinSizeInCU(uiAbsPartIdx) )
     616  else if( uiLog2TrafoSize == quadtreeTULog2MinSizeInCU )
    617617  {
    618618    uiSubdiv = 0;
     
    620620  else
    621621  {
    622     assert( uiLog2TrafoSize > pcCU->getQuadtreeTULog2MinSizeInCU(uiAbsPartIdx) );
     622    assert( uiLog2TrafoSize > quadtreeTULog2MinSizeInCU );
    623623    m_pcEntropyDecoderIf->parseTransformSubdivFlag( uiSubdiv, 5 - uiLog2TrafoSize );
    624624  }
     
    666666    for( Int i = 0; i < 4; i++ )
    667667    {
    668       xDecodeTransform( pcCU, offsetLuma, offsetChroma, uiAbsPartIdx, uiDepth, width, height, uiTrIdx, bCodeDQP );
     668      xDecodeTransform( pcCU, offsetLuma, offsetChroma, uiAbsPartIdx, uiDepth, width, height, uiTrIdx, bCodeDQP, quadtreeTULog2MinSizeInCU );
    669669      uiYCbf |= pcCU->getCbf( uiAbsPartIdx, TEXT_LUMA, uiTrDepth+1 );
    670670      uiUCbf |= pcCU->getCbf( uiAbsPartIdx, TEXT_CHROMA_U, uiTrDepth+1 );
     
    886886   
    887887  }
    888   xDecodeTransform( pcCU, uiLumaOffset, uiChromaOffset, uiAbsPartIdx, uiDepth, uiWidth, uiHeight, 0, bCodeDQP );
     888
     889  Int getQuadtreeTULog2MinSizeInCU = pcCU->getQuadtreeTULog2MinSizeInCU(uiAbsPartIdx);
     890
     891  xDecodeTransform( pcCU, uiLumaOffset, uiChromaOffset, uiAbsPartIdx, uiDepth, uiWidth, uiHeight, 0, bCodeDQP, getQuadtreeTULog2MinSizeInCU );
    889892}
    890893
  • branches/HTM-10.0rc1-dev0/source/Lib/TLibDecoder/TDecEntropy.h

    r833 r837  
    44 * granted under this license. 
    55 *
    6  * Copyright (c) 2010-2013, ITU/ISO/IEC
     6* Copyright (c) 2010-2014, ITU/ISO/IEC
    77 * All rights reserved.
    88 *
     
    210210 
    211211private:
    212   Void xDecodeTransform        ( TComDataCU* pcCU, UInt offsetLuma, UInt offsetChroma, UInt uiAbsPartIdx, UInt uiDepth, UInt width, UInt height, UInt uiTrIdx, Bool& bCodeDQP );
     212  Void xDecodeTransform        ( TComDataCU* pcCU, UInt offsetLuma, UInt offsetChroma, UInt uiAbsPartIdx, UInt uiDepth, UInt width, UInt height, UInt uiTrIdx, Bool& bCodeDQP, Int getQuadtreeTULog2MinSizeInCU );
    213213
    214214public:
  • branches/HTM-10.0rc1-dev0/source/Lib/TLibDecoder/TDecGop.cpp

    r655 r837  
    44 * granted under this license. 
    55 *
    6  * Copyright (c) 2010-2013, ITU/ISO/IEC
     6* Copyright (c) 2010-2014, ITU/ISO/IEC
    77 * All rights reserved.
    88 *
     
    112112  //-- For time output for each slice
    113113  long iBeforeTime = clock();
    114  
    115   UInt uiStartCUAddr   = pcSlice->getSliceSegmentCurStartCUAddr();
    116 
    117   UInt uiSliceStartCuAddr = pcSlice->getSliceCurStartCUAddr();
    118   if(uiSliceStartCuAddr == uiStartCUAddr)
    119   {
    120     m_sliceStartCUAddress.push_back(uiSliceStartCuAddr);
    121   }
    122 
    123114  m_pcSbacDecoder->init( (TDecBinIf*)m_pcBinCABAC );
    124115  m_pcEntropyDecoder->setEntropyDecoder (m_pcSbacDecoder);
     
    147138  m_pcEntropyDecoder->setBitstream      ( ppcSubstreams[0] );
    148139  m_pcEntropyDecoder->resetEntropy      (pcSlice);
    149 
    150   if(uiSliceStartCuAddr == uiStartCUAddr)
    151   {
    152     m_LFCrossSliceBoundaryFlag.push_back( pcSlice->getLFCrossSliceBoundaryFlag());
    153   }
    154140#if H_3D_NBDV
    155141  if(pcSlice->getViewIndex() && !pcSlice->getIsDepth()) //Notes from QC: this condition shall be changed once the configuration is completed, e.g. in pcSlice->getSPS()->getMultiviewMvPredMode() || ARP in prev. HTM. Remove this comment once it is done.
     
    199185  m_pcLoopFilter->setCfg(bLFCrossTileBoundary);
    200186  m_pcLoopFilter->loopFilterPic( rpcPic );
    201 
    202   if(pcSlice->getSPS()->getUseSAO())
    203   {
    204     m_sliceStartCUAddress.push_back(rpcPic->getNumCUsInFrame()* rpcPic->getNumPartInCU());
    205     rpcPic->createNonDBFilterInfo(m_sliceStartCUAddress, 0, &m_LFCrossSliceBoundaryFlag, rpcPic->getPicSym()->getNumTiles(), bLFCrossTileBoundary);
    206   }
    207 
    208187  if( pcSlice->getSPS()->getUseSAO() )
    209188  {
    210     {
    211       SAOParam *saoParam = rpcPic->getPicSym()->getSaoParam();
    212       saoParam->bSaoFlag[0] = pcSlice->getSaoEnabledFlag();
    213       saoParam->bSaoFlag[1] = pcSlice->getSaoEnabledFlagChroma();
    214       m_pcSAO->setSaoLcuBasedOptimization(1);
    215       m_pcSAO->createPicSaoInfo(rpcPic);
    216       m_pcSAO->SAOProcess(saoParam);
    217       m_pcSAO->PCMLFDisableProcess(rpcPic);
    218       m_pcSAO->destroyPicSaoInfo();
    219     }
    220   }
    221 
    222   if(pcSlice->getSPS()->getUseSAO())
    223   {
    224     rpcPic->destroyNonDBFilterInfo();
     189    m_pcSAO->reconstructBlkSAOParams(rpcPic, rpcPic->getPicSym()->getSAOBlkParam());
     190    m_pcSAO->SAOProcess(rpcPic);
     191    m_pcSAO->PCMLFDisableProcess(rpcPic);
    225192  }
    226193#if H_3D
     
    284251  rpcPic->setOutputMark(true);
    285252  rpcPic->setReconMark(true);
    286   m_sliceStartCUAddress.clear();
    287   m_LFCrossSliceBoundaryFlag.clear();
    288253}
    289254
  • branches/HTM-10.0rc1-dev0/source/Lib/TLibDecoder/TDecGop.h

    r608 r837  
    44 * granted under this license. 
    55 *
    6  * Copyright (c) 2010-2013, ITU/ISO/IEC
     6* Copyright (c) 2010-2014, ITU/ISO/IEC
    77 * All rights reserved.
    88 *
     
    8383  Int                   m_decodedPictureHashSEIEnabled;  ///< Checksum(3)/CRC(2)/MD5(1)/disable(0) acting on decoded picture hash SEI message
    8484
    85   //! list that contains the CU address of each slice plus the end address
    86   std::vector<Int> m_sliceStartCUAddress;
    87   std::vector<Bool> m_LFCrossSliceBoundaryFlag;
    88 
    8985public:
    9086  TDecGop();
  • branches/HTM-10.0rc1-dev0/source/Lib/TLibDecoder/TDecSbac.cpp

    r833 r837  
    44 * granted under this license. 
    55 *
    6  * Copyright (c) 2010-2013, ITU/ISO/IEC
     6* Copyright (c) 2010-2014, ITU/ISO/IEC
    77 * All rights reserved.
    88 *
     
    7878, m_cCUAbsSCModel             ( 1,             1,               NUM_ABS_FLAG_CTX              , m_contextModels + m_numContextModels, m_numContextModels)
    7979, m_cMVPIdxSCModel            ( 1,             1,               NUM_MVP_IDX_CTX               , m_contextModels + m_numContextModels, m_numContextModels)
    80 , m_cCUAMPSCModel             ( 1,             1,               NUM_CU_AMP_CTX                , m_contextModels + m_numContextModels, m_numContextModels)
    8180, m_cSaoMergeSCModel      ( 1,             1,               NUM_SAO_MERGE_FLAG_CTX   , m_contextModels + m_numContextModels, m_numContextModels)
    8281, m_cSaoTypeIdxSCModel        ( 1,             1,               NUM_SAO_TYPE_IDX_CTX          , m_contextModels + m_numContextModels, m_numContextModels)
     
    155154#endif
    156155  m_cCUPartSizeSCModel.initBuffer        ( sliceType, qp, (UChar*)INIT_PART_SIZE );
    157   m_cCUAMPSCModel.initBuffer             ( sliceType, qp, (UChar*)INIT_CU_AMP_POS );
    158156  m_cCUPredModeSCModel.initBuffer        ( sliceType, qp, (UChar*)INIT_PRED_MODE );
    159157  m_cCUIntraPredSCModel.initBuffer       ( sliceType, qp, (UChar*)INIT_INTRA_PRED_MODE );
     
    906904        if (eMode == SIZE_2NxN)
    907905        {
    908           m_pcTDecBinIf->decodeBin(uiSymbol, m_cCUAMPSCModel.get( 0, 0, 0 ));
     906        m_pcTDecBinIf->decodeBin(uiSymbol, m_cCUPartSizeSCModel.get( 0, 0, 3 ));
    909907          if (uiSymbol == 0)
    910908          {
     
    915913        else if (eMode == SIZE_Nx2N)
    916914        {
    917           m_pcTDecBinIf->decodeBin(uiSymbol, m_cCUAMPSCModel.get( 0, 0, 0 ));
     915        m_pcTDecBinIf->decodeBin(uiSymbol, m_cCUPartSizeSCModel.get( 0, 0, 3 ));
    918916          if (uiSymbol == 0)
    919917          {
     
    20092007    if (uiCode == 0)
    20102008    {
    2011       ruiVal = 5;
     2009      ruiVal = 1;
    20122010    }
    20132011    else
    20142012    {
    2015       ruiVal = 1;
    2016     }
    2017   }
    2018 }
    2019 
    2020 inline Void copySaoOneLcuParam(SaoLcuParam* psDst,  SaoLcuParam* psSrc)
    2021 {
    2022   Int i;
    2023   psDst->partIdx = psSrc->partIdx;
    2024   psDst->typeIdx    = psSrc->typeIdx;
    2025   if (psDst->typeIdx != -1)
    2026   {
    2027     psDst->subTypeIdx = psSrc->subTypeIdx ;
    2028     psDst->length  = psSrc->length;
    2029     for (i=0;i<psDst->length;i++)
    2030     {
    2031       psDst->offset[i] = psSrc->offset[i];
    2032     }
    2033   }
    2034   else
    2035   {
    2036     psDst->length  = 0;
    2037     for (i=0;i<SAO_BO_LEN;i++)
    2038     {
    2039       psDst->offset[i] = 0;
    2040     }
    2041   }
    2042 }
    2043 
    2044 Void TDecSbac::parseSaoOffset(SaoLcuParam* psSaoLcuParam, UInt compIdx)
     2013      ruiVal = 2;
     2014    }
     2015  }
     2016}
     2017
     2018{
     2019  m_pcTDecBinIf->decodeBinEP ( val );
     2020}
     2021
     2022Void TDecSbac::parseSAOBlkParam (SAOBlkParam& saoBlkParam
     2023                                , Bool* sliceEnabled
     2024                                , Bool leftMergeAvail
     2025                                , Bool aboveMergeAvail
     2026                                )
    20452027{
    20462028  UInt uiSymbol;
    2047   static Int iTypeLength[MAX_NUM_SAO_TYPE] =
    2048   {
    2049     SAO_EO_LEN,
    2050     SAO_EO_LEN,
    2051     SAO_EO_LEN,
    2052     SAO_EO_LEN,
    2053     SAO_BO_LEN
    2054   };
    2055 
    2056   if (compIdx==2)
    2057   {
    2058     uiSymbol = (UInt)( psSaoLcuParam->typeIdx + 1);
    2059   }
    2060   else
    2061   {
    2062     parseSaoTypeIdx(uiSymbol);
    2063   }
    2064   psSaoLcuParam->typeIdx = (Int)uiSymbol - 1;
    2065   if (uiSymbol)
    2066   {
    2067     psSaoLcuParam->length = iTypeLength[psSaoLcuParam->typeIdx];
    2068 
    2069     Int bitDepth = compIdx ? g_bitDepthC : g_bitDepthY;
    2070     Int offsetTh = 1 << min(bitDepth - 5,5);
    2071 
    2072     if( psSaoLcuParam->typeIdx == SAO_BO )
    2073     {
    2074       for(Int i=0; i< psSaoLcuParam->length; i++)
    2075       {
    2076         parseSaoMaxUvlc(uiSymbol, offsetTh -1 );
    2077         psSaoLcuParam->offset[i] = uiSymbol;
     2029
     2030  Bool isLeftMerge = false;
     2031  Bool isAboveMerge= false;
     2032
     2033  if(leftMergeAvail)
     2034  {
     2035    parseSaoMerge(uiSymbol); //sao_merge_left_flag
     2036    isLeftMerge = (uiSymbol?true:false);
     2037  }
     2038
     2039  if( aboveMergeAvail && !isLeftMerge)
     2040  {
     2041    parseSaoMerge(uiSymbol); //sao_merge_up_flag
     2042    isAboveMerge = (uiSymbol?true:false);
     2043  }
     2044
     2045  if(isLeftMerge || isAboveMerge) //merge mode
     2046      {
     2047    saoBlkParam[SAO_Y].modeIdc = saoBlkParam[SAO_Cb].modeIdc = saoBlkParam[SAO_Cr].modeIdc = SAO_MODE_MERGE;
     2048    saoBlkParam[SAO_Y].typeIdc = saoBlkParam[SAO_Cb].typeIdc = saoBlkParam[SAO_Cr].typeIdc = (isLeftMerge)?SAO_MERGE_LEFT:SAO_MERGE_ABOVE;
    20782049      }   
    2079       for(Int i=0; i< psSaoLcuParam->length; i++)
    2080       {
    2081         if (psSaoLcuParam->offset[i] != 0)
    2082         {
    2083           m_pcTDecBinIf->decodeBinEP ( uiSymbol);
    2084           if (uiSymbol)
     2050  else //new or off mode
     2051      {
     2052    for(Int compIdx=0; compIdx < NUM_SAO_COMPONENTS; compIdx++)
     2053        {
     2054      SAOOffset& ctbParam = saoBlkParam[compIdx];
     2055
     2056      if(!sliceEnabled[compIdx])
    20852057          {
    2086             psSaoLcuParam->offset[i] = -psSaoLcuParam->offset[i] ;
    2087           }
    2088         }
    2089       }
    2090       parseSaoUflc(5, uiSymbol );
    2091       psSaoLcuParam->subTypeIdx = uiSymbol;
    2092     }
    2093     else if( psSaoLcuParam->typeIdx < 4 )
    2094     {
    2095       parseSaoMaxUvlc(uiSymbol, offsetTh -1 ); psSaoLcuParam->offset[0] = uiSymbol;
    2096       parseSaoMaxUvlc(uiSymbol, offsetTh -1 ); psSaoLcuParam->offset[1] = uiSymbol;
    2097       parseSaoMaxUvlc(uiSymbol, offsetTh -1 ); psSaoLcuParam->offset[2] = -(Int)uiSymbol;
    2098       parseSaoMaxUvlc(uiSymbol, offsetTh -1 ); psSaoLcuParam->offset[3] = -(Int)uiSymbol;
    2099      if (compIdx != 2)
     2058        //off
     2059        ctbParam.modeIdc = SAO_MODE_OFF;
     2060        continue;
     2061        }
     2062
     2063      //type
     2064      if(compIdx == SAO_Y || compIdx == SAO_Cb)
     2065    {
     2066        parseSaoTypeIdx(uiSymbol); //sao_type_idx_luma or sao_type_idx_chroma
     2067
     2068        assert(uiSymbol ==0 || uiSymbol ==1 || uiSymbol ==2);
     2069
     2070        if(uiSymbol ==0) //OFF
    21002071     {
    2101        parseSaoUflc(2, uiSymbol );
    2102        psSaoLcuParam->subTypeIdx = uiSymbol;
    2103        psSaoLcuParam->typeIdx += psSaoLcuParam->subTypeIdx;
    2104      }
     2072          ctbParam.modeIdc = SAO_MODE_OFF;
    21052073   }
    2106   }
    2107   else
    2108   {
    2109     psSaoLcuParam->length = 0;
    2110   }
    2111 }
    2112 
    2113 Void TDecSbac::parseSaoOneLcuInterleaving(Int rx, Int ry, SAOParam* pSaoParam, TComDataCU* pcCU, Int iCUAddrInSlice, Int iCUAddrUpInSlice, Int allowMergeLeft, Int allowMergeUp)
    2114 {
    2115   Int iAddr = pcCU->getAddr();
    2116   UInt uiSymbol;
    2117   for (Int iCompIdx=0; iCompIdx<3; iCompIdx++)
    2118   {
    2119     pSaoParam->saoLcuParam[iCompIdx][iAddr].mergeUpFlag    = 0;
    2120     pSaoParam->saoLcuParam[iCompIdx][iAddr].mergeLeftFlag  = 0;
    2121     pSaoParam->saoLcuParam[iCompIdx][iAddr].subTypeIdx     = 0;
    2122     pSaoParam->saoLcuParam[iCompIdx][iAddr].typeIdx        = -1;
    2123     pSaoParam->saoLcuParam[iCompIdx][iAddr].offset[0]     = 0;
    2124     pSaoParam->saoLcuParam[iCompIdx][iAddr].offset[1]     = 0;
    2125     pSaoParam->saoLcuParam[iCompIdx][iAddr].offset[2]     = 0;
    2126     pSaoParam->saoLcuParam[iCompIdx][iAddr].offset[3]     = 0;
    2127 
    2128   }
    2129  if (pSaoParam->bSaoFlag[0] || pSaoParam->bSaoFlag[1] )
    2130   {
    2131     if (rx>0 && iCUAddrInSlice!=0 && allowMergeLeft)
    2132     {
    2133       parseSaoMerge(uiSymbol);
    2134       pSaoParam->saoLcuParam[0][iAddr].mergeLeftFlag = (Bool)uiSymbol; 
    2135     }
    2136     if (pSaoParam->saoLcuParam[0][iAddr].mergeLeftFlag==0)
    2137     {
    2138       if ((ry > 0) && (iCUAddrUpInSlice>=0) && allowMergeUp)
    2139       {
    2140         parseSaoMerge(uiSymbol);
    2141         pSaoParam->saoLcuParam[0][iAddr].mergeUpFlag = (Bool)uiSymbol;
    2142       }
    2143     }
    2144   }
    2145 
    2146   for (Int iCompIdx=0; iCompIdx<3; iCompIdx++)
    2147   {
    2148     if ((iCompIdx == 0  && pSaoParam->bSaoFlag[0]) || (iCompIdx > 0  && pSaoParam->bSaoFlag[1]) )
    2149     {
    2150       if (rx>0 && iCUAddrInSlice!=0 && allowMergeLeft)
    2151       {
    2152         pSaoParam->saoLcuParam[iCompIdx][iAddr].mergeLeftFlag = pSaoParam->saoLcuParam[0][iAddr].mergeLeftFlag;
    2153       }
    2154       else
    2155       {
    2156         pSaoParam->saoLcuParam[iCompIdx][iAddr].mergeLeftFlag = 0;
    2157       }
    2158 
    2159       if (pSaoParam->saoLcuParam[iCompIdx][iAddr].mergeLeftFlag==0)
    2160       {
    2161         if ((ry > 0) && (iCUAddrUpInSlice>=0) && allowMergeUp)
    2162         {
    2163           pSaoParam->saoLcuParam[iCompIdx][iAddr].mergeUpFlag = pSaoParam->saoLcuParam[0][iAddr].mergeUpFlag;
     2074        else if(uiSymbol == 1) //BO
     2075        {
     2076          ctbParam.modeIdc = SAO_MODE_NEW;
     2077          ctbParam.typeIdc = SAO_TYPE_START_BO;
     2078  }
     2079        else //2, EO
     2080  {
     2081          ctbParam.modeIdc = SAO_MODE_NEW;
     2082          ctbParam.typeIdc = SAO_TYPE_START_EO;
     2083        }
     2084
     2085  }
     2086      else //Cr, follow Cb SAO type
     2087      {
     2088        ctbParam.modeIdc = saoBlkParam[SAO_Cb].modeIdc;
     2089        ctbParam.typeIdc = saoBlkParam[SAO_Cb].typeIdc;
     2090}
     2091
     2092      if(ctbParam.modeIdc == SAO_MODE_NEW)
     2093{
     2094        Int offset[4];
     2095        for(Int i=0; i< 4; i++)
     2096  {
     2097          parseSaoMaxUvlc(uiSymbol,  g_saoMaxOffsetQVal[compIdx] ); //sao_offset_abs
     2098          offset[i] = (Int)uiSymbol;
     2099  }
     2100
     2101        if(ctbParam.typeIdc == SAO_TYPE_START_BO)
     2102  {
     2103          for(Int i=0; i< 4; i++)
     2104    {
     2105            if(offset[i] != 0)
     2106    {
     2107              parseSaoSign(uiSymbol); //sao_offset_sign
     2108              if(uiSymbol)
     2109      {
     2110                offset[i] = -offset[i];
     2111      }
     2112    }
     2113  }
     2114          parseSaoUflc(NUM_SAO_BO_CLASSES_LOG2, uiSymbol ); //sao_band_position
     2115          ctbParam.typeAuxInfo = uiSymbol;
     2116
     2117          for(Int i=0; i<4; i++)
     2118      {
     2119            ctbParam.offset[(ctbParam.typeAuxInfo+i)%MAX_NUM_SAO_CLASSES] = offset[i];
     2120      }
     2121
     2122        }
     2123        else //EO
     2124        {
     2125          ctbParam.typeAuxInfo = 0;
     2126
     2127          if(compIdx == SAO_Y || compIdx == SAO_Cb)
     2128        {
     2129            parseSaoUflc(NUM_SAO_EO_TYPES_LOG2, uiSymbol ); //sao_eo_class_luma or sao_eo_class_chroma
     2130            ctbParam.typeIdc += uiSymbol;
    21642131        }
    21652132        else
    21662133        {
    2167           pSaoParam->saoLcuParam[iCompIdx][iAddr].mergeUpFlag = 0;
    2168         }
    2169         if (!pSaoParam->saoLcuParam[iCompIdx][iAddr].mergeUpFlag)
    2170         {
    2171           pSaoParam->saoLcuParam[2][iAddr].typeIdx = pSaoParam->saoLcuParam[1][iAddr].typeIdx;
    2172           parseSaoOffset(&(pSaoParam->saoLcuParam[iCompIdx][iAddr]), iCompIdx);
    2173         }
    2174         else
    2175         {
    2176           copySaoOneLcuParam(&pSaoParam->saoLcuParam[iCompIdx][iAddr], &pSaoParam->saoLcuParam[iCompIdx][iAddr-pSaoParam->numCuInWidth]);
    2177         }
    2178       }
    2179       else
    2180       {
    2181         copySaoOneLcuParam(&pSaoParam->saoLcuParam[iCompIdx][iAddr],  &pSaoParam->saoLcuParam[iCompIdx][iAddr-1]);
    2182       }
    2183     }
    2184     else
    2185     {
    2186       pSaoParam->saoLcuParam[iCompIdx][iAddr].typeIdx = -1;
    2187       pSaoParam->saoLcuParam[iCompIdx][iAddr].subTypeIdx = 0;
     2134            ctbParam.typeIdc = saoBlkParam[SAO_Cb].typeIdc;
     2135        }
     2136          ctbParam.offset[SAO_CLASS_EO_FULL_VALLEY] = offset[0];
     2137          ctbParam.offset[SAO_CLASS_EO_HALF_VALLEY] = offset[1];
     2138          ctbParam.offset[SAO_CLASS_EO_PLAIN      ] = 0;
     2139          ctbParam.offset[SAO_CLASS_EO_HALF_PEAK  ] = -offset[2];
     2140          ctbParam.offset[SAO_CLASS_EO_FULL_PEAK  ] = -offset[3];
     2141      }
     2142      }
    21882143    }
    21892144  }
     
    22182173  xCopyContextsFrom(pScr);
    22192174}
    2220 
    2221 #if H_3D_ARP
    2222 Void TDecSbac::parseARPW( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth )
    2223 {
    2224   UInt uiMaxW = pcCU->getSlice()->getARPStepNum() - 1;
    2225   UInt uiW = 0;
    2226   UInt uiOffset = pcCU->getCTXARPWFlag(uiAbsPartIdx);
    2227   UInt uiCode = 0;
    2228 
    2229   assert ( uiMaxW > 0 );
    2230 
    2231   m_pcTDecBinIf->decodeBin( uiCode , m_cCUPUARPWSCModel.get( 0, 0, 0 + uiOffset ) );
    2232 
    2233   uiW = uiCode;
    2234   if( 1 == uiW )   
    2235   {
    2236 #if MTK_ARP_FLAG_CABAC_SIMP_G0061
    2237     m_pcTDecBinIf->decodeBin( uiCode , m_cCUPUARPWSCModel.get( 0, 0, 2 ) );
    2238 #else
    2239     m_pcTDecBinIf->decodeBin( uiCode , m_cCUPUARPWSCModel.get( 0, 0, 3 ) );
    2240 #endif
    2241     uiW += ( 1 == uiCode ? 1 : 0 );
    2242   }
    2243 #if H_MV_ENC_DEC_TRAC
    2244   DTRACE_CU("iv_res_pred_weight_idx", uiW )
    2245 #endif
    2246   pcCU->setARPWSubParts( ( UChar )( uiW ) , uiAbsPartIdx, uiDepth ); 
    2247 }
    2248 #endif
    2249 
    2250 #if H_3D_IC
    2251 /** parse illumination compensation flag
    2252  * \param pcCU
    2253  * \param uiAbsPartIdx
    2254  * \param uiDepth
    2255  * \returns Void
    2256  */
    2257 Void TDecSbac::parseICFlag( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth )
    2258 {
    2259   UInt uiSymbol = 0;
    2260 #if MTK_IC_FLAG_CABAC_SIMP_G0061
    2261   m_pcTDecBinIf->decodeBin( uiSymbol, m_cCUICFlagSCModel.get( 0, 0, 0 ) );
    2262 #else
    2263   UInt uiCtxIC = pcCU->getCtxICFlag( uiAbsPartIdx );
    2264   m_pcTDecBinIf->decodeBin( uiSymbol, m_cCUICFlagSCModel.get( 0, 0, uiCtxIC ) );
    2265 #endif
    2266 #if !H_MV_ENC_DEC_TRAC
    2267   DTRACE_CABAC_VL( g_nSymbolCounter++ );
    2268   DTRACE_CABAC_T( "\tICFlag" );
    2269   DTRACE_CABAC_T( "\tuiCtxIC: ");
    2270   DTRACE_CABAC_V( uiCtxIC );
    2271   DTRACE_CABAC_T( "\tuiSymbol: ");
    2272   DTRACE_CABAC_V( uiSymbol );
    2273   DTRACE_CABAC_T( "\n");
    2274 #else
    2275   DTRACE_CU("ic_flag", uiSymbol)
    2276 #endif
    2277  
    2278   pcCU->setICFlagSubParts( uiSymbol ? true : false , uiAbsPartIdx, 0, uiDepth );
    2279 }
    2280 #endif
    2281 
    2282 #if H_3D_INTER_SDC
    2283 #if QC_SDC_UNIFY_G0130
    2284 Void TDecSbac::parseDeltaDC( TComDataCU* pcCU, UInt absPartIdx, UInt depth )
    2285 {
    2286   if( ! ( pcCU->getSDCFlag( absPartIdx ) || ( pcCU->isIntra( absPartIdx ) && getDimType( pcCU->getLumaIntraDir( absPartIdx ) ) < DIM_NUM_TYPE ) ) )
    2287   {
    2288     assert( 0 );
    2289   }
    2290 
    2291   UInt symbol = 0;
    2292   UInt uiNumSegments = 0;
    2293 
    2294   if( pcCU->isIntra( absPartIdx ) )
    2295   {
    2296     UInt dir     = pcCU->getLumaIntraDir( absPartIdx );
    2297     uiNumSegments = isDimMode( dir ) ? 2 : 1;
    2298 
    2299     m_pcTDecBinIf->decodeBin( symbol, m_cDdcFlagSCModel.get( 0, 0, uiNumSegments-1 ) );
    2300 
    2301     if( pcCU->getSDCFlag( absPartIdx ) )
    2302     {
    2303       assert( pcCU->getPartitionSize( absPartIdx ) == SIZE_2Nx2N );
    2304       pcCU->setTrIdxSubParts( 0, absPartIdx, depth );
    2305       pcCU->setCbfSubParts( 1, 1, 1, absPartIdx, depth );
    2306     }
    2307     else
    2308     {
    2309       pcCU->setLumaIntraDirSubParts( dir + symbol, absPartIdx, depth );
    2310     }
    2311   }
    2312   else
    2313   {
    2314 #if SEC_INTER_SDC_G0101
    2315     uiNumSegments = 1;
    2316 #else
    2317     PartSize cPartSize = pcCU->getPartitionSize( absPartIdx );
    2318     uiNumSegments = ( cPartSize == SIZE_2Nx2N ) ? 1 : ( cPartSize == SIZE_NxN ? 4 : 2 );
    2319 #endif
    2320     symbol = 1;
    2321   }
    2322 
    2323 
    2324   for( UInt segment = 0; segment < uiNumSegments; segment++ )
    2325   {
    2326     Pel valDeltaDC = 0;
    2327     if( symbol )
    2328     {
    2329       xParseDimDeltaDC( valDeltaDC, uiNumSegments );
    2330     }
    2331 
    2332     if( pcCU->isIntra( absPartIdx ) )
    2333     {
    2334       UInt dir     = pcCU->getLumaIntraDir( absPartIdx );
    2335 
    2336       if( pcCU->getSDCFlag( absPartIdx ) )
    2337       {
    2338         pcCU->setSDCSegmentDCOffset( valDeltaDC, segment, absPartIdx );
    2339       }
    2340       else
    2341       {
    2342         pcCU->setDimDeltaDC( getDimType( dir ), segment, absPartIdx, valDeltaDC );
    2343       }
    2344     }
    2345     else
    2346     {
    2347       pcCU->setSDCSegmentDCOffset( valDeltaDC, segment, absPartIdx );
    2348     }
    2349   }
    2350 }
    2351 
    2352 Void TDecSbac::parseSDCFlag( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth )
    2353 {
    2354   UInt uiSymbol = 0;
    2355   UInt uiCtxSDCFlag = pcCU->getCtxSDCFlag( uiAbsPartIdx );
    2356 
    2357   m_pcTDecBinIf->decodeBin( uiSymbol, m_cSDCFlagSCModel.get( 0, 0, uiCtxSDCFlag ) );
    2358 
    2359   if( uiSymbol )
    2360   {
    2361     pcCU->setSDCFlagSubParts( true, uiAbsPartIdx, uiDepth );
    2362     pcCU->setTrIdxSubParts( 0, uiAbsPartIdx, uiDepth );
    2363     pcCU->setCbfSubParts( 1, 1, 1, uiAbsPartIdx, uiDepth );
    2364   }
    2365   else
    2366   {
    2367     pcCU->setSDCFlagSubParts( false, uiAbsPartIdx, uiDepth );
    2368   }
    2369 }
    2370 #else
    2371 Void TDecSbac::parseInterSDCFlag( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth )
    2372 {
    2373   UInt uiSymbol = 0;
    2374   UInt uiCtxInterSDCFlag = pcCU->getCtxInterSDCFlag( uiAbsPartIdx );
    2375 
    2376   m_pcTDecBinIf->decodeBin( uiSymbol, m_cInterSDCFlagSCModel.get( 0, 0, uiCtxInterSDCFlag ) );
    2377 
    2378   if( uiSymbol )
    2379   {
    2380     pcCU->setInterSDCFlagSubParts( true, uiAbsPartIdx, 0, uiDepth );
    2381     pcCU->setTrIdxSubParts( 0, uiAbsPartIdx, uiDepth );
    2382     pcCU->setCbfSubParts( 1, 1, 1, uiAbsPartIdx, uiDepth );
    2383   }
    2384   else
    2385   {
    2386     pcCU->setInterSDCFlagSubParts( false, uiAbsPartIdx, 0, uiDepth);
    2387   }
    2388 }
    2389 
    2390 Void TDecSbac::parseInterSDCResidualData ( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth, UInt uiSegment )
    2391 {
    2392   UInt uiAbsIdx   = 0;
    2393   UInt uiSign     = 0;
    2394   Int  iIdx       = 0;
    2395 
    2396   xReadExGolombLevel( uiAbsIdx, m_cInterSDCResidualSCModel.get( 0, 0, 0 ) );
    2397 
    2398   uiAbsIdx++;
    2399   m_pcTDecBinIf->decodeBin( uiSign, m_cInterSDCResidualSignFlagSCModel.get( 0, 0, 0 ) );
    2400   iIdx = (Int)( uiSign ? -1 : 1 ) * uiAbsIdx;
    2401 
    2402   pcCU->setInterSDCSegmentDCOffset( iIdx, uiSegment, uiAbsPartIdx );
    2403 }
    2404 #endif
    2405 #endif
    2406 
    2407 #if H_3D_DBBP
    2408 Void TDecSbac::parseDBBPFlag( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth )
    2409 {
    2410   PartSize ePartSize = pcCU->getPartitionSize( uiAbsPartIdx );
    2411   AOF( pcCU->getSlice()->getVPS()->getUseDBBP(pcCU->getSlice()->getLayerIdInVps()) );
    2412   AOF( !pcCU->getSlice()->getIsDepth() );
    2413   AOF( ePartSize == RWTH_DBBP_PACK_MODE );
    2414  
    2415   UInt uiSymbol = 0;
    2416  
    2417   m_pcTDecBinIf->decodeBin( uiSymbol, m_cDBBPFlagSCModel.get( 0, 0, 0 ) );
    2418  
    2419   if( uiSymbol )
    2420   {
    2421     pcCU->setDBBPFlagSubParts(true, uiAbsPartIdx, 0, uiDepth);
    2422   }
    2423 }
    2424 #endif
    2425 
    24262175//! \}
  • branches/HTM-10.0rc1-dev0/source/Lib/TLibDecoder/TDecSbac.h

    r833 r837  
    44 * granted under this license. 
    55 *
    6  * Copyright (c) 2010-2013, ITU/ISO/IEC
     6* Copyright (c) 2010-2014, ITU/ISO/IEC
    77 * All rights reserved.
    88 *
     
    9494  Void  parseSaoTypeIdx           ( UInt&  ruiVal  );
    9595  Void  parseSaoUflc              ( UInt uiLength, UInt& ruiVal     );
    96   Void  parseSaoOneLcuInterleaving(Int rx, Int ry, SAOParam* pSaoParam, TComDataCU* pcCU, Int iCUAddrInSlice, Int iCUAddrUpInSlice, Int allowMergeLeft, Int allowMergeUp);
    97   Void  parseSaoOffset            (SaoLcuParam* psSaoLcuParam, UInt compIdx);
    9896private:
    9997  Void  xReadUnarySymbol    ( UInt& ruiSymbol, ContextModel* pcSCModel, Int iOffset );
     
    209207  ContextModel3DBuffer m_cMVPIdxSCModel;
    210208 
    211   ContextModel3DBuffer m_cCUAMPSCModel;
    212209  ContextModel3DBuffer m_cSaoMergeSCModel;
    213210  ContextModel3DBuffer m_cSaoTypeIdxSCModel;
  • branches/HTM-10.0rc1-dev0/source/Lib/TLibDecoder/TDecSlice.cpp

    r608 r837  
    44 * granted under this license. 
    55 *
    6  * Copyright (c) 2010-2013, ITU/ISO/IEC
     6* Copyright (c) 2010-2014, ITU/ISO/IEC
    77 * All rights reserved.
    88 *
     
    313313    g_bJustDoIt = g_bEncDecTraceEnable;
    314314#endif
    315     if ( pcSlice->getSPS()->getUseSAO() && (pcSlice->getSaoEnabledFlag()||pcSlice->getSaoEnabledFlagChroma()) )
    316     {
    317       SAOParam *saoParam = rpcPic->getPicSym()->getSaoParam();
    318       saoParam->bSaoFlag[0] = pcSlice->getSaoEnabledFlag();
    319       if (iCUAddr == iStartCUAddr)
    320       {
    321         saoParam->bSaoFlag[1] = pcSlice->getSaoEnabledFlagChroma();
    322       }
    323       Int numCuInWidth     = saoParam->numCuInWidth;
    324       Int cuAddrInSlice = iCUAddr - rpcPic->getPicSym()->getCUOrderMap(pcSlice->getSliceCurStartCUAddr()/rpcPic->getNumPartInCU());
    325       Int cuAddrUpInSlice  = cuAddrInSlice - numCuInWidth;
    326       Int rx = iCUAddr % numCuInWidth;
    327       Int ry = iCUAddr / numCuInWidth;
    328       Int allowMergeLeft = 1;
    329       Int allowMergeUp   = 1;
    330       if (rx!=0)
    331       {
    332         if (rpcPic->getPicSym()->getTileIdxMap(iCUAddr-1) != rpcPic->getPicSym()->getTileIdxMap(iCUAddr))
    333         {
    334           allowMergeLeft = 0;
    335         }
    336       }
    337       if (ry!=0)
    338       {
    339         if (rpcPic->getPicSym()->getTileIdxMap(iCUAddr-numCuInWidth) != rpcPic->getPicSym()->getTileIdxMap(iCUAddr))
    340         {
    341           allowMergeUp = 0;
    342         }
    343       }
    344       pcSbacDecoder->parseSaoOneLcuInterleaving(rx, ry, saoParam,pcCU, cuAddrInSlice, cuAddrUpInSlice, allowMergeLeft, allowMergeUp);
    345     }
    346     else if ( pcSlice->getSPS()->getUseSAO() )
    347     {
    348       Int addr = pcCU->getAddr();
    349       SAOParam *saoParam = rpcPic->getPicSym()->getSaoParam();
    350       for (Int cIdx=0; cIdx<3; cIdx++)
    351       {
    352         SaoLcuParam *saoLcuParam = &(saoParam->saoLcuParam[cIdx][addr]);
    353         if ( ((cIdx == 0) && !pcSlice->getSaoEnabledFlag()) || ((cIdx == 1 || cIdx == 2) && !pcSlice->getSaoEnabledFlagChroma()))
    354         {
    355           saoLcuParam->mergeUpFlag   = 0;
    356           saoLcuParam->mergeLeftFlag = 0;
    357           saoLcuParam->subTypeIdx    = 0;
    358           saoLcuParam->typeIdx       = -1;
    359           saoLcuParam->offset[0]     = 0;
    360           saoLcuParam->offset[1]     = 0;
    361           saoLcuParam->offset[2]     = 0;
    362           saoLcuParam->offset[3]     = 0;
    363         }
     315
     316    if ( pcSlice->getSPS()->getUseSAO() )
     317      {
     318      SAOBlkParam& saoblkParam = (rpcPic->getPicSym()->getSAOBlkParam())[iCUAddr];
     319      if (pcSlice->getSaoEnabledFlag()||pcSlice->getSaoEnabledFlagChroma())
     320      {
     321        Bool sliceEnabled[NUM_SAO_COMPONENTS];
     322        sliceEnabled[SAO_Y] = pcSlice->getSaoEnabledFlag();
     323        sliceEnabled[SAO_Cb]= sliceEnabled[SAO_Cr]= pcSlice->getSaoEnabledFlagChroma();
     324
     325        Bool leftMergeAvail = false;
     326        Bool aboveMergeAvail= false;
     327
     328        //merge left condition
     329        Int rx = (iCUAddr % uiWidthInLCUs);
     330        if(rx > 0)
     331        {
     332          leftMergeAvail = rpcPic->getSAOMergeAvailability(iCUAddr, iCUAddr-1);
     333        }
     334        //merge up condition
     335        Int ry = (iCUAddr / uiWidthInLCUs);
     336        if(ry > 0)
     337        {
     338      }
     339
     340        pcSbacDecoder->parseSAOBlkParam( saoblkParam, sliceEnabled, leftMergeAvail, aboveMergeAvail);
     341    }
     342      else
     343        {
    364344      }
    365345    }
  • branches/HTM-10.0rc1-dev0/source/Lib/TLibDecoder/TDecSlice.h

    r655 r837  
    44 * granted under this license. 
    55 *
    6  * Copyright (c) 2010-2013, ITU/ISO/IEC
     6* Copyright (c) 2010-2014, ITU/ISO/IEC
    77 * All rights reserved.
    88 *
  • branches/HTM-10.0rc1-dev0/source/Lib/TLibDecoder/TDecTop.cpp

    r773 r837  
    44 * granted under this license. 
    55 *
    6  * Copyright (c) 2010-2013, ITU/ISO/IEC
     6* Copyright (c) 2010-2014, ITU/ISO/IEC
    77 * All rights reserved.
    88 *
     
    467467    rpcPic->create ( pcSlice->getSPS()->getPicWidthInLumaSamples(), pcSlice->getSPS()->getPicHeightInLumaSamples(), g_uiMaxCUWidth, g_uiMaxCUHeight, g_uiMaxCUDepth,
    468468                     conformanceWindow, defaultDisplayWindow, numReorderPics, true);
    469     rpcPic->getPicSym()->allocSaoParam(&m_cSAO);
    470469    m_cListPic.pushBack( rpcPic );
    471470   
     
    505504  rpcPic->create ( pcSlice->getSPS()->getPicWidthInLumaSamples(), pcSlice->getSPS()->getPicHeightInLumaSamples(), g_uiMaxCUWidth, g_uiMaxCUHeight, g_uiMaxCUDepth,
    506505                   conformanceWindow, defaultDisplayWindow, numReorderPics, true);
    507   rpcPic->getPicSym()->allocSaoParam(&m_cSAO);
    508506}
    509507
     
    662660
    663661  m_cSAO.destroy();
    664   m_cSAO.create( sps->getPicWidthInLumaSamples(), sps->getPicHeightInLumaSamples(), sps->getMaxCUWidth(), sps->getMaxCUHeight() );
     662  m_cSAO.create( sps->getPicWidthInLumaSamples(), sps->getPicHeightInLumaSamples(), sps->getMaxCUWidth(), sps->getMaxCUHeight(), sps->getMaxCUDepth() );
    665663  m_cLoopFilter.create( sps->getMaxCUDepth() );
    666664}
     
    670668{
    671669  assert( nalu.m_layerId == m_layerId );
    672 
    673670#else
    674671Bool TDecTop::xDecodeSlice(InputNALUnit &nalu, Int &iSkipFrame, Int iPOCLastDisplay )
     
    682679    m_uiSliceIdx     = 0;
    683680  }
     681  {
     682    m_apcSlicePilot->copySliceInfo( pcPic->getPicSym()->getSlice(m_uiSliceIdx-1) );
     683  }
    684684  m_apcSlicePilot->setSliceIdx(m_uiSliceIdx);
    685   if (!m_bFirstSliceInPicture)
    686   {
    687     m_apcSlicePilot->copySliceInfo( pcPic->getPicSym()->getSlice(m_uiSliceIdx-1) );
    688   }
    689685
    690686  m_apcSlicePilot->setNalUnitType(nalu.m_nalUnitType);
     
    994990#endif
    995991#else
    996 #if FIX1071
    997992    pcSlice->setRefPicList( m_cListPic, true );
    998 #else
    999     pcSlice->setRefPicList( m_cListPic );
    1000 #endif
    1001 
    1002993#endif
    1003994
     
    12151206    case NAL_UNIT_CODED_SLICE_TRAIL_R:
    12161207    case NAL_UNIT_CODED_SLICE_TRAIL_N:
    1217     case NAL_UNIT_CODED_SLICE_TLA_R:
     1208    case NAL_UNIT_CODED_SLICE_TSA_R:
    12181209    case NAL_UNIT_CODED_SLICE_TSA_N:
    12191210    case NAL_UNIT_CODED_SLICE_STSA_R:
     
    12351226#endif
    12361227      break;
     1228    case NAL_UNIT_EOS:
     1229      m_associatedIRAPType = NAL_UNIT_INVALID;
     1230      m_pocCRA = 0;
     1231      m_pocRandomAccess = MAX_INT;
     1232      m_prevPOC = MAX_INT;
     1233      m_bFirstSliceInPicture = true;
     1234      m_bFirstSliceInSequence = true;
     1235      m_prevSliceSkipped = false;
     1236      m_skippedPOC = 0;
     1237      return false;
     1238     
     1239    case NAL_UNIT_ACCESS_UNIT_DELIMITER:
     1240      // TODO: process AU delimiter
     1241      return false;
     1242     
     1243    case NAL_UNIT_EOB:
     1244      return false;
     1245     
     1246     
     1247    case NAL_UNIT_RESERVED_VCL_N10:
     1248    case NAL_UNIT_RESERVED_VCL_R11:
     1249    case NAL_UNIT_RESERVED_VCL_N12:
     1250    case NAL_UNIT_RESERVED_VCL_R13:
     1251    case NAL_UNIT_RESERVED_VCL_N14:
     1252    case NAL_UNIT_RESERVED_VCL_R15:
     1253     
     1254    case NAL_UNIT_RESERVED_IRAP_VCL22:
     1255    case NAL_UNIT_RESERVED_IRAP_VCL23:
     1256     
     1257    case NAL_UNIT_RESERVED_VCL24:
     1258    case NAL_UNIT_RESERVED_VCL25:
     1259    case NAL_UNIT_RESERVED_VCL26:
     1260    case NAL_UNIT_RESERVED_VCL27:
     1261    case NAL_UNIT_RESERVED_VCL28:
     1262    case NAL_UNIT_RESERVED_VCL29:
     1263    case NAL_UNIT_RESERVED_VCL30:
     1264    case NAL_UNIT_RESERVED_VCL31:
     1265     
     1266    case NAL_UNIT_FILLER_DATA:
     1267    case NAL_UNIT_RESERVED_NVCL41:
     1268    case NAL_UNIT_RESERVED_NVCL42:
     1269    case NAL_UNIT_RESERVED_NVCL43:
     1270    case NAL_UNIT_RESERVED_NVCL44:
     1271    case NAL_UNIT_RESERVED_NVCL45:
     1272    case NAL_UNIT_RESERVED_NVCL46:
     1273    case NAL_UNIT_RESERVED_NVCL47:
     1274    case NAL_UNIT_UNSPECIFIED_48:
     1275    case NAL_UNIT_UNSPECIFIED_49:
     1276    case NAL_UNIT_UNSPECIFIED_50:
     1277    case NAL_UNIT_UNSPECIFIED_51:
     1278    case NAL_UNIT_UNSPECIFIED_52:
     1279    case NAL_UNIT_UNSPECIFIED_53:
     1280    case NAL_UNIT_UNSPECIFIED_54:
     1281    case NAL_UNIT_UNSPECIFIED_55:
     1282    case NAL_UNIT_UNSPECIFIED_56:
     1283    case NAL_UNIT_UNSPECIFIED_57:
     1284    case NAL_UNIT_UNSPECIFIED_58:
     1285    case NAL_UNIT_UNSPECIFIED_59:
     1286    case NAL_UNIT_UNSPECIFIED_60:
     1287    case NAL_UNIT_UNSPECIFIED_61:
     1288    case NAL_UNIT_UNSPECIFIED_62:
     1289    case NAL_UNIT_UNSPECIFIED_63:
    12371290    default:
    1238       assert (1);
     1291      assert (0);
    12391292  }
    12401293
  • branches/HTM-10.0rc1-dev0/source/Lib/TLibDecoder/TDecTop.h

    r833 r837  
    44 * granted under this license. 
    55 *
    6  * Copyright (c) 2010-2013, ITU/ISO/IEC
     6* Copyright (c) 2010-2014, ITU/ISO/IEC
    77 * All rights reserved.
    88 *
  • branches/HTM-10.0rc1-dev0/source/Lib/TLibEncoder/AnnexBwrite.h

    r608 r837  
    44 * granted under this license.
    55 *
    6  * Copyright (c) 2010-2013, ITU/ISO/IEC
     6* Copyright (c) 2010-2014, ITU/ISO/IEC
    77 * All rights reserved.
    88 *
  • branches/HTM-10.0rc1-dev0/source/Lib/TLibEncoder/NALwrite.cpp

    r608 r837  
    44 * granted under this license.
    55 *
    6  * Copyright (c) 2010-2013, ITU/ISO/IEC
     6* Copyright (c) 2010-2014, ITU/ISO/IEC
    77 * All rights reserved.
    88 *
  • branches/HTM-10.0rc1-dev0/source/Lib/TLibEncoder/NALwrite.h

    r608 r837  
    44 * granted under this license.
    55 *
    6  * Copyright (c) 2010-2013, ITU/ISO/IEC
     6* Copyright (c) 2010-2014, ITU/ISO/IEC
    77 * All rights reserved.
    88 *
  • branches/HTM-10.0rc1-dev0/source/Lib/TLibEncoder/SEIwrite.cpp

    r608 r837  
    44 * granted under this license.
    55 *
    6  * Copyright (c) 2010-2013, ITU/ISO/IEC
     6* Copyright (c) 2010-2014, ITU/ISO/IEC
    77 * All rights reserved.
    88 *
     
    307307  if( !hrd->getSubPicCpbParamsPresentFlag() )
    308308  {
    309     WRITE_FLAG( sei.m_rapCpbParamsPresentFlag, "rap_cpb_params_present_flag" );
     309    WRITE_FLAG( sei.m_rapCpbParamsPresentFlag, "irap_cpb_params_present_flag" );
     310  }
     311  if( sei.m_rapCpbParamsPresentFlag )
     312  {
     313    WRITE_CODE( sei.m_cpbDelayOffset, hrd->getCpbRemovalDelayLengthMinus1() + 1, "cpb_delay_offset" );
     314    WRITE_CODE( sei.m_dpbDelayOffset, hrd->getDpbOutputDelayLengthMinus1()  + 1, "dpb_delay_offset" );
    310315  }
    311316  WRITE_FLAG( sei.m_concatenationFlag, "concatenation_flag");
    312317  WRITE_CODE( sei.m_auCpbRemovalDelayDelta - 1, ( hrd->getCpbRemovalDelayLengthMinus1() + 1 ), "au_cpb_removal_delay_delta_minus1" );
    313   if( sei.m_rapCpbParamsPresentFlag )
    314   {
    315     WRITE_CODE( sei.m_cpbDelayOffset, hrd->getCpbRemovalDelayLengthMinus1() + 1, "cpb_delay_offset" );
    316     WRITE_CODE( sei.m_dpbDelayOffset, hrd->getDpbOutputDelayLengthMinus1()  + 1, "dpb_delay_offset" );
    317   }
    318318  for( nalOrVcl = 0; nalOrVcl < 2; nalOrVcl ++ )
    319319  {
  • branches/HTM-10.0rc1-dev0/source/Lib/TLibEncoder/SEIwrite.h

    r608 r837  
    44 * granted under this license.
    55 *
    6  * Copyright (c) 2010-2013, ITU/ISO/IEC
     6* Copyright (c) 2010-2014, ITU/ISO/IEC
    77 * All rights reserved.
    88 *
  • branches/HTM-10.0rc1-dev0/source/Lib/TLibEncoder/SyntaxElementWriter.cpp

    r608 r837  
    44 * granted under this license. 
    55 *
    6  * Copyright (c) 2010-2013, ITU/ISO/IEC
     6* Copyright (c) 2010-2014, ITU/ISO/IEC
    77 * All rights reserved.
    88 *
  • branches/HTM-10.0rc1-dev0/source/Lib/TLibEncoder/SyntaxElementWriter.h

    r608 r837  
    44 * granted under this license. 
    55 *
    6  * Copyright (c) 2010-2013, ITU/ISO/IEC
     6* Copyright (c) 2010-2014, ITU/ISO/IEC
    77 * All rights reserved.
    88 *
  • branches/HTM-10.0rc1-dev0/source/Lib/TLibEncoder/TEncAnalyze.cpp

    r655 r837  
    44 * granted under this license. 
    55 *
    6  * Copyright (c) 2010-2013, ITU/ISO/IEC
     6* Copyright (c) 2010-2014, ITU/ISO/IEC
    77 * All rights reserved.
    88 *
  • branches/HTM-10.0rc1-dev0/source/Lib/TLibEncoder/TEncAnalyze.h

    r655 r837  
    44 * granted under this license. 
    55 *
    6  * Copyright (c) 2010-2013, ITU/ISO/IEC
     6* Copyright (c) 2010-2014, ITU/ISO/IEC
    77 * All rights reserved.
    88 *
  • branches/HTM-10.0rc1-dev0/source/Lib/TLibEncoder/TEncBinCoder.h

    r608 r837  
    44 * granted under this license. 
    55 *
    6  * Copyright (c) 2010-2013, ITU/ISO/IEC
     6* Copyright (c) 2010-2014, ITU/ISO/IEC
    77 * All rights reserved.
    88 *
  • branches/HTM-10.0rc1-dev0/source/Lib/TLibEncoder/TEncBinCoderCABAC.cpp

    r608 r837  
    44 * granted under this license. 
    55 *
    6  * Copyright (c) 2010-2013, ITU/ISO/IEC
     6* Copyright (c) 2010-2014, ITU/ISO/IEC
    77 * All rights reserved.
    88 *
  • branches/HTM-10.0rc1-dev0/source/Lib/TLibEncoder/TEncBinCoderCABAC.h

    r608 r837  
    44 * granted under this license. 
    55 *
    6  * Copyright (c) 2010-2013, ITU/ISO/IEC
     6* Copyright (c) 2010-2014, ITU/ISO/IEC
    77 * All rights reserved.
    88 *
  • branches/HTM-10.0rc1-dev0/source/Lib/TLibEncoder/TEncBinCoderCABACCounter.cpp

    r608 r837  
    44 * granted under this license. 
    55 *
    6  * Copyright (c) 2010-2013, ITU/ISO/IEC
     6* Copyright (c) 2010-2014, ITU/ISO/IEC
    77 * All rights reserved.
    88 *
  • branches/HTM-10.0rc1-dev0/source/Lib/TLibEncoder/TEncBinCoderCABACCounter.h

    r608 r837  
    44 * granted under this license. 
    55 *
    6  * Copyright (c) 2010-2013, ITU/ISO/IEC
     6* Copyright (c) 2010-2014, ITU/ISO/IEC
    77 * All rights reserved.
    88 *
  • branches/HTM-10.0rc1-dev0/source/Lib/TLibEncoder/TEncCavlc.cpp

    r833 r837  
    44 * granted under this license. 
    55 *
    6  * Copyright (c) 2010-2013, ITU/ISO/IEC
     6* Copyright (c) 2010-2014, ITU/ISO/IEC
    77 * All rights reserved.
    88 *
     
    256256  if( pcPPS->getScalingListPresentFlag() )
    257257  {
    258 #if SCALING_LIST_OUTPUT_RESULT
    259     printf("PPS\n");
    260 #endif
    261258    codeScalingList( m_pcSlice->getScalingList() );
    262259  }
     
    742739    if(pcSPS->getScalingListPresentFlag())
    743740    {
    744 #if SCALING_LIST_OUTPUT_RESULT
    745     printf("SPS\n");
    746 #endif
    747741      codeScalingList( m_pcSlice->getScalingList() );
    748742    }
     
    16881682      TComReferencePictureSet* rps = pcSlice->getRPS();
    16891683     
    1690 #if FIX1071
    16911684      // check for bitstream restriction stating that:
    16921685      // If the current picture is a BLA or CRA picture, the value of NumPocTotalCurr shall be equal to 0.
     
    16991692          }
    17001693        }
    1701 #endif
    17021694
    17031695      if(pcSlice->getRPSidx() < 0)
     
    18331825      {
    18341826         WRITE_FLAG( pcSlice->getSaoEnabledFlag(), "slice_sao_luma_flag" );
    1835          {
    1836            SAOParam *saoParam = pcSlice->getPic()->getPicSym()->getSaoParam();
    1837           WRITE_FLAG( saoParam->bSaoFlag[1], "slice_sao_chroma_flag" );
    1838          }
     1827         WRITE_FLAG( pcSlice->getSaoEnabledFlagChroma(), "slice_sao_chroma_flag" );
    18391828      }
    18401829    }
     
    24292418  Bool scalingListPredModeFlag;
    24302419
    2431 #if SCALING_LIST_OUTPUT_RESULT
    2432   Int startBit;
    2433   Int startTotalBit;
    2434   startBit = m_pcBitIf->getNumberOfWrittenBits();
    2435   startTotalBit = m_pcBitIf->getNumberOfWrittenBits();
    2436 #endif
    2437 
    24382420    //for each size
    24392421    for(sizeId = 0; sizeId < SCALING_LIST_SIZE_NUM; sizeId++)
     
    24412423      for(listId = 0; listId < g_scalingListNum[sizeId]; listId++)
    24422424      {
    2443 #if SCALING_LIST_OUTPUT_RESULT
    2444         startBit = m_pcBitIf->getNumberOfWrittenBits();
    2445 #endif
    24462425        scalingListPredModeFlag = scalingList->checkPredMode( sizeId, listId );
    24472426        WRITE_FLAG( scalingListPredModeFlag, "scaling_list_pred_mode_flag" );
     
    24542433          xCodeScalingList(scalingList, sizeId, listId);
    24552434        }
    2456 #if SCALING_LIST_OUTPUT_RESULT
    2457         printf("Matrix [%d][%d] Bit %d\n",sizeId,listId,m_pcBitIf->getNumberOfWrittenBits() - startBit);
    2458 #endif
    2459       }
    2460     }
    2461 #if SCALING_LIST_OUTPUT_RESULT
    2462   printf("Total Bit %d\n",m_pcBitIf->getNumberOfWrittenBits()-startTotalBit);
    2463 #endif
     2435      }
     2436    }
    24642437  return;
    24652438}
  • branches/HTM-10.0rc1-dev0/source/Lib/TLibEncoder/TEncCavlc.h

    r833 r837  
    44 * granted under this license. 
    55 *
    6  * Copyright (c) 2010-2013, ITU/ISO/IEC
     6* Copyright (c) 2010-2014, ITU/ISO/IEC
    77 * All rights reserved.
    88 *
     
    120120 
    121121  Void codeMVPIdx ( TComDataCU* pcCU, UInt uiAbsPartIdx, RefPicList eRefList );
    122   Void codeSAOSign       ( UInt code   ) { printf("Not supported\n"); assert (0); }
    123   Void codeSaoMaxUvlc    ( UInt   code, UInt maxSymbol ){printf("Not supported\n"); assert (0);}
    124   Void codeSaoMerge  ( UInt uiCode ){printf("Not supported\n"); assert (0);}
    125   Void codeSaoTypeIdx    ( UInt uiCode ){printf("Not supported\n"); assert (0);}
    126   Void codeSaoUflc       ( UInt uiLength, UInt   uiCode ){ assert(uiCode < 32); printf("Not supported\n"); assert (0);}
    127 
    128122  Void codeCUTransquantBypassFlag( TComDataCU* pcCU, UInt uiAbsPartIdx );
    129123  Void codeSkipFlag      ( TComDataCU* pcCU, UInt uiAbsPartIdx );
  • branches/HTM-10.0rc1-dev0/source/Lib/TLibEncoder/TEncCfg.h

    r833 r837  
    44 * granted under this license. 
    55 *
    6  * Copyright (c) 2010-2013, ITU/ISO/IEC
     6* Copyright (c) 2010-2014, ITU/ISO/IEC
    77 * All rights reserved.
    88 *
     
    177177  Int       m_maxNumOffsetsPerPic;
    178178  Bool      m_saoLcuBoundary;
    179   Bool      m_saoLcuBasedOptimization;
    180 
    181   //====== Lossless ========
    182   Bool      m_useLossless;
    183179  //====== Motion search ========
    184180  Int       m_iFastSearch;                      //  0:Full search  1:Diamond  2:PMVFAST
     
    201197 
    202198  //====== Tool list ========
    203   Bool      m_bUseSBACRD;
    204199  Bool      m_bUseASR;
    205200  Bool      m_bUseHADME;
     
    292287  Int       m_TMVPModeId;
    293288  Int       m_signHideFlag;
    294 #if RATE_CONTROL_LAMBDA_DOMAIN
    295289  Bool      m_RCEnableRateControl;
    296290  Int       m_RCTargetBitrate;
    297 #if M0036_RC_IMPROVEMENT
    298291  Int       m_RCKeepHierarchicalBit;
    299 #else
    300   Bool      m_RCKeepHierarchicalBit;
    301 #endif
    302292  Bool      m_RCLCULevelRC;
    303293  Bool      m_RCUseLCUSeparateModel;
     
    324314#endif
    325315  Bool      m_TransquantBypassEnableFlag;                     ///< transquant_bypass_enable_flag setting in PPS.
    326   Bool      m_CUTransquantBypassFlagValue;                    ///< if transquant_bypass_enable_flag, the fixed value to use for the per-CU cu_transquant_bypass_flag.
     316  Bool      m_CUTransquantBypassFlagForce;                    ///< if transquant_bypass_enable_flag, then, if true, all CU transquant bypass flags will be set to true.
    327317#if H_MV
    328318  TComVPS*  m_cVPS;                                           ///< pointer to VPS, same for all layers
     
    573563  Void      setQPAdaptationRange            ( Int   i )      { m_iQPAdaptationRange = i; }
    574564 
    575   //====== Lossless ========
    576   Void      setUseLossless                  (Bool    b  )        { m_useLossless = b;  }
    577565  //====== Sequence ========
    578566  Int       getFrameRate                    ()      { return  m_iFrameRate; }
     
    617605  Bool      getUseAdaptiveQP                ()      { return  m_bUseAdaptiveQP; }
    618606  Int       getQPAdaptationRange            ()      { return  m_iQPAdaptationRange; }
    619   //====== Lossless ========
    620   Bool      getUseLossless                  ()      { return  m_useLossless;  }
    621607 
    622608  //==== Tool list ========
    623   Void      setUseSBACRD                    ( Bool  b )     { m_bUseSBACRD  = b; }
    624609  Void      setUseASR                       ( Bool  b )     { m_bUseASR     = b; }
    625610  Void      setUseHADME                     ( Bool  b )     { m_bUseHADME   = b; }
     
    640625  Void      setdQPs                         ( Int*  p )     { m_aidQP       = p; }
    641626  Void      setDeltaQpRD                    ( UInt  u )     {m_uiDeltaQpRD  = u; }
    642   Bool      getUseSBACRD                    ()      { return m_bUseSBACRD;  }
    643627  Bool      getUseASR                       ()      { return m_bUseASR;     }
    644628  Bool      getUseHADME                     ()      { return m_bUseHADME;   }
     
    684668  Void  setSaoLcuBoundary              (Bool val)      { m_saoLcuBoundary = val; }
    685669  Bool  getSaoLcuBoundary              ()              { return m_saoLcuBoundary; }
    686   Void  setSaoLcuBasedOptimization               (Bool val)            { m_saoLcuBasedOptimization = val; }
    687   Bool  getSaoLcuBasedOptimization               ()                    { return m_saoLcuBasedOptimization; }
    688670  Void  setLFCrossTileBoundaryFlag               ( Bool   val  )       { m_loopFilterAcrossTilesEnabledFlag = val; }
    689671  Bool  getLFCrossTileBoundaryFlag               ()                    { return m_loopFilterAcrossTilesEnabledFlag;   }
     
    825807  Void      setSignHideFlag( Int signHideFlag ) { m_signHideFlag = signHideFlag; }
    826808  Int       getSignHideFlag()                    { return m_signHideFlag; }
    827 #if RATE_CONTROL_LAMBDA_DOMAIN
    828809  Bool      getUseRateCtrl         ()              { return m_RCEnableRateControl;   }
    829810  Void      setUseRateCtrl         ( Bool b )      { m_RCEnableRateControl = b;      }
    830811  Int       getTargetBitrate       ()              { return m_RCTargetBitrate;       }
    831812  Void      setTargetBitrate       ( Int bitrate ) { m_RCTargetBitrate  = bitrate;   }
    832 #if M0036_RC_IMPROVEMENT
    833813  Int       getKeepHierBit         ()              { return m_RCKeepHierarchicalBit; }
    834814  Void      setKeepHierBit         ( Int i )       { m_RCKeepHierarchicalBit = i;    }
    835 #else
    836   Bool      getKeepHierBit         ()              { return m_RCKeepHierarchicalBit; }
    837   Void      setKeepHierBit         ( Bool b )      { m_RCKeepHierarchicalBit = b;    }
    838 #endif
    839815  Bool      getLCULevelRC          ()              { return m_RCLCULevelRC; }
    840816  Void      setLCULevelRC          ( Bool b )      { m_RCLCULevelRC = b; }
     
    873849  Bool      getTransquantBypassEnableFlag()           { return m_TransquantBypassEnableFlag; }
    874850  Void      setTransquantBypassEnableFlag(Bool flag)  { m_TransquantBypassEnableFlag = flag; }
    875   Bool      getCUTransquantBypassFlagValue()          { return m_CUTransquantBypassFlagValue; }
    876   Void      setCUTransquantBypassFlagValue(Bool flag) { m_CUTransquantBypassFlagValue = flag; }
     851  Bool      getCUTransquantBypassFlagForceValue()          { return m_CUTransquantBypassFlagForce; }
     852  Void      setCUTransquantBypassFlagForceValue(Bool flag) { m_CUTransquantBypassFlagForce = flag; }
    877853#if H_MV
    878854  Void      setVPS           ( TComVPS *p ) { m_cVPS = p;    }
  • branches/HTM-10.0rc1-dev0/source/Lib/TLibEncoder/TEncCu.cpp

    r833 r837  
    44 * granted under this license. 
    55 *
    6  * Copyright (c) 2010-2013, ITU/ISO/IEC
     6* Copyright (c) 2010-2014, ITU/ISO/IEC
    77 * All rights reserved.
    88 *
     
    109109 
    110110  m_bEncodeDQP = false;
    111 #if RATE_CONTROL_LAMBDA_DOMAIN
    112 #if !M0036_RC_IMPROVEMENT
    113   m_LCUPredictionSAD = 0;
    114   m_addSADDepth      = 0;
    115   m_temporalSAD      = 0;
    116 #endif
    117 #if M0036_RC_IMPROVEMENT && KWU_RC_MADPRED_E0227
    118   m_LCUPredictionSAD = 0;
    119   m_addSADDepth      = 0;
    120   m_temporalSAD      = 0;
    121   m_spatialSAD       = 0;
    122 #endif
    123 #endif
    124 #if !RATE_CONTROL_LAMBDA_DOMAIN && KWU_RC_MADPRED_E0227
     111#if KWU_RC_MADPRED_E0227
    125112  m_LCUPredictionSAD = 0;
    126113  m_addSADDepth      = 0;
     
    273260  m_pcRDGoOnSbacCoder = pcEncTop->getRDGoOnSbacCoder();
    274261 
    275   m_bUseSBACRD        = pcEncTop->getUseSBACRD();
    276262  m_pcRateCtrl        = pcEncTop->getRateCtrl();
    277263}
     
    289275  m_ppcTempCU[0]->initCU( rpcCU->getPic(), rpcCU->getAddr() );
    290276
    291 #if RATE_CONTROL_LAMBDA_DOMAIN
    292 #if !M0036_RC_IMPROVEMENT
    293   m_addSADDepth      = 0;
    294   m_LCUPredictionSAD = 0;
    295   m_temporalSAD      = 0;
    296 #endif
    297 #if M0036_RC_IMPROVEMENT && KWU_RC_MADPRED_E0227
    298   m_LCUPredictionSAD = 0;
    299   m_addSADDepth      = 0;
    300   m_temporalSAD      = 0;
    301   m_spatialSAD       = 0;
    302 #endif
    303 #endif
    304277#if KWU_RC_MADPRED_E0227
    305278  m_LCUPredictionSAD = 0;
     
    482455  Int iMaxQP;
    483456  Bool isAddLowestQP = false;
    484   Int lowestQP = -rpcTempCU->getSlice()->getSPS()->getQpBDOffsetY();
    485457
    486458  if( (g_uiMaxCUWidth>>uiDepth) >= rpcTempCU->getSlice()->getPPS()->getMinCuDQPSize() )
     
    489461    iMinQP = Clip3( -rpcTempCU->getSlice()->getSPS()->getQpBDOffsetY(), MAX_QP, iBaseQP-idQP );
    490462    iMaxQP = Clip3( -rpcTempCU->getSlice()->getSPS()->getQpBDOffsetY(), MAX_QP, iBaseQP+idQP );
    491     if ( (rpcTempCU->getSlice()->getSPS()->getUseLossless()) && (lowestQP < iMinQP) && rpcTempCU->getSlice()->getPPS()->getUseDQP() )
    492     {
    493       isAddLowestQP = true;
    494       iMinQP = iMinQP - 1;
    495     }
    496463  }
    497464  else
     
    501468  }
    502469
    503 #if RATE_CONTROL_LAMBDA_DOMAIN
    504470  if ( m_pcEncCfg->getUseRateCtrl() )
    505471  {
     
    507473    iMaxQP = m_pcRateCtrl->getRCQP();
    508474  }
    509 #else
    510   if(m_pcEncCfg->getUseRateCtrl())
    511   {
    512     Int qp = m_pcRateCtrl->getUnitQP();
    513     iMinQP  = Clip3( MIN_QP, MAX_QP, qp);
    514     iMaxQP  = Clip3( MIN_QP, MAX_QP, qp);
    515   }
    516 #endif
     475  // transquant-bypass (TQB) processing loop variable initialisation ---
     476
     477  const Int lowestQP = iMinQP; // For TQB, use this QP which is the lowest non TQB QP tested (rather than QP'=0) - that way delta QPs are smaller, and TQB can be tested at all CU levels.
     478
     479  if ( (rpcTempCU->getSlice()->getPPS()->getTransquantBypassEnableFlag()) )
     480  {
     481    isAddLowestQP = true; // mark that the first iteration is to cost TQB mode.
     482    iMinQP = iMinQP - 1;  // increase loop variable range by 1, to allow testing of TQB mode along with other QPs
     483    if ( m_pcEncCfg->getCUTransquantBypassFlagForceValue() )
     484    {
     485      iMaxQP = iMinQP;
     486    }
     487  }
     488
    517489#if H_3D_IC
    518490  Bool bICEnabled = rpcTempCU->getSlice()->getViewIndex() && ( rpcTempCU->getSlice()->getSliceType() == P_SLICE || rpcTempCU->getSlice()->getSliceType() == B_SLICE ) && !rpcTempCU->getSlice()->getIsDepth();
     
    534506    for (Int iQP=iMinQP; iQP<=iMaxQP; iQP++)
    535507    {
    536       if (isAddLowestQP && (iQP == iMinQP))
     508      const Bool bIsLosslessMode = isAddLowestQP && (iQP == iMinQP);
     509
     510      if (bIsLosslessMode)
    537511      {
    538512        iQP = lowestQP;
    539513      }
    540       // variables for fast encoder decision
     514
    541515#if H_3D_QTLPC
    542516      bTrySplit    = true;
    543517#endif
    544518
    545       rpcTempCU->initEstData( uiDepth, iQP );
     519      rpcTempCU->initEstData( uiDepth, iQP, bIsLosslessMode );
    546520#if H_3D_QTLPC
    547521      //logic for setting bTrySplit using the partition information that is stored of the texture colocated CU
     
    647621#endif
    648622#if  H_3D_FAST_TEXTURE_ENCODING
    649           xCheckRDCostInter( rpcBestCU, rpcTempCU, SIZE_2Nx2N, bFMD );  rpcTempCU->initEstData( uiDepth, iQP );//by Competition for inter_2Nx2N
    650 #else
    651           xCheckRDCostInter( rpcBestCU, rpcTempCU, SIZE_2Nx2N );  rpcTempCU->initEstData( uiDepth, iQP );//by Competition for inter_2Nx2N
     623          xCheckRDCostInter( rpcBestCU, rpcTempCU, SIZE_2Nx2N, bFMD );  rpcTempCU->initEstData( uiDepth, iQP, bIsLosslessMode );//by Competition for inter_2Nx2N
     624#else
     625          xCheckRDCostInter( rpcBestCU, rpcTempCU, SIZE_2Nx2N, bIsLosslessMode  );  rpcTempCU->initEstData( uiDepth, iQP, bIsLosslessMode );//by Competition for inter_2Nx2N
    652626#endif
    653627#if H_3D_VSP
     
    663637        bFMD = bIVFMerge && rpcBestCU->isSkipped(0);
    664638#endif
    665         rpcTempCU->initEstData( uiDepth, iQP );
     639        rpcTempCU->initEstData( uiDepth, iQP, bIsLosslessMode );
    666640#if H_3D_VSP
    667641        rpcTempCU->setDvInfoSubParts(DvInfo, 0, uiDepth);
     
    675649#endif
    676650#if  H_3D_FAST_TEXTURE_ENCODING
    677             xCheckRDCostInter( rpcBestCU, rpcTempCU, SIZE_2Nx2N, bFMD );  rpcTempCU->initEstData( uiDepth, iQP );
    678 #else
    679             xCheckRDCostInter( rpcBestCU, rpcTempCU, SIZE_2Nx2N );  rpcTempCU->initEstData( uiDepth, iQP );
     651            xCheckRDCostInter( rpcBestCU, rpcTempCU, SIZE_2Nx2N, bFMD );  rpcTempCU->initEstData( uiDepth, iQP, bIsLosslessMode );
     652#else
     653            xCheckRDCostInter( rpcBestCU, rpcTempCU, SIZE_2Nx2N );  rpcTempCU->initEstData( uiDepth, iQP, bIsLosslessMode );
    680654#endif
    681655#if H_3D_VSP
     
    687661          {
    688662            xCheckRDCostInterDBBP( rpcBestCU, rpcTempCU, false );
    689             rpcTempCU->initEstData( uiDepth, iQP );
     663            rpcTempCU->initEstData( uiDepth, iQP, bIsLosslessMode );
    690664#if H_3D_VSP
    691665            rpcTempCU->setDvInfoSubParts(DvInfo, 0, uiDepth);
     
    710684      }
    711685#endif
    712       if (isAddLowestQP && (iQP == lowestQP))
     686      if ( bIsLosslessMode )
    713687      {
    714688        iQP = iMinQP;
     
    716690    }
    717691
    718 #if RATE_CONTROL_LAMBDA_DOMAIN && !M0036_RC_IMPROVEMENT
     692#if KWU_RC_MADPRED_E0227
    719693    if ( uiDepth <= m_addSADDepth )
    720694    {
     
    723697    }
    724698#endif
    725 #if RATE_CONTROL_LAMBDA_DOMAIN && M0036_RC_IMPROVEMENT && KWU_RC_MADPRED_E0227
    726     if ( uiDepth <= m_addSADDepth )
    727     {
    728       m_LCUPredictionSAD += m_temporalSAD;
    729       m_addSADDepth = uiDepth;
    730     }
    731 #endif
    732 #if !RATE_CONTROL_LAMBDA_DOMAIN && KWU_RC_MADPRED_E0227
    733 if ( uiDepth <= m_addSADDepth )
    734 {
    735   m_LCUPredictionSAD += m_temporalSAD;
    736   m_addSADDepth = uiDepth;
    737 }
    738 #endif
    739 #if !RATE_CONTROL_LAMBDA_DOMAIN && KWU_FIX_URQ
    740     if(m_pcEncCfg->getUseRateCtrl())
    741     {
    742       Int qp = m_pcRateCtrl->getUnitQP();
    743       iMinQP  = Clip3( MIN_QP, MAX_QP, qp);
    744       iMaxQP  = Clip3( MIN_QP, MAX_QP, qp);
    745     }
    746 #endif
    747 
    748699#if H_3D_DIM_ENC
    749700    if( rpcBestCU->getSlice()->getIsDepth() && rpcBestCU->getSlice()->isIRAP() )
     
    757708      for (Int iQP=iMinQP; iQP<=iMaxQP; iQP++)
    758709      {
    759         if (isAddLowestQP && (iQP == iMinQP))
     710        const Bool bIsLosslessMode = isAddLowestQP && (iQP == iMinQP);
     711
     712        if (bIsLosslessMode)
    760713        {
    761714          iQP = lowestQP;
    762715        }
    763         rpcTempCU->initEstData( uiDepth, iQP );
     716        rpcTempCU->initEstData( uiDepth, iQP, bIsLosslessMode );
    764717
    765718        // do inter modes, NxN, 2NxN, and Nx2N
     
    780733                xCheckRDCostInter( rpcBestCU, rpcTempCU, SIZE_NxN   );
    781734#endif
    782                 rpcTempCU->initEstData( uiDepth, iQP );
     735                rpcTempCU->initEstData( uiDepth, iQP, bIsLosslessMode );
    783736#if H_3D_VSP
    784737                rpcTempCU->setDvInfoSubParts(DvInfo, 0, uiDepth);
     
    799752            xCheckRDCostInter( rpcBestCU, rpcTempCU, SIZE_Nx2N  );
    800753#endif
    801             rpcTempCU->initEstData( uiDepth, iQP );
     754            rpcTempCU->initEstData( uiDepth, iQP, bIsLosslessMode );
    802755#if H_3D_VSP
    803756            rpcTempCU->setDvInfoSubParts(DvInfo, 0, uiDepth);
     
    819772            xCheckRDCostInter      ( rpcBestCU, rpcTempCU, SIZE_2NxN  );
    820773#endif
    821             rpcTempCU->initEstData( uiDepth, iQP );
     774            rpcTempCU->initEstData( uiDepth, iQP, bIsLosslessMode );
    822775#if H_3D_VSP
    823776            rpcTempCU->setDvInfoSubParts(DvInfo, 0, uiDepth);
     
    858811                xCheckRDCostInter( rpcBestCU, rpcTempCU, SIZE_2NxnU );
    859812#endif
    860                 rpcTempCU->initEstData( uiDepth, iQP );
     813                rpcTempCU->initEstData( uiDepth, iQP, bIsLosslessMode );
    861814#if H_3D_VSP
    862815                rpcTempCU->setDvInfoSubParts(DvInfo, 0, uiDepth);
     
    878831                xCheckRDCostInter( rpcBestCU, rpcTempCU, SIZE_2NxnD );
    879832#endif
    880                 rpcTempCU->initEstData( uiDepth, iQP );
     833                rpcTempCU->initEstData( uiDepth, iQP, bIsLosslessMode );
    881834#if H_3D_VSP
    882835                rpcTempCU->setDvInfoSubParts(DvInfo, 0, uiDepth);
     
    902855                xCheckRDCostInter( rpcBestCU, rpcTempCU, SIZE_2NxnU, true );
    903856#endif
    904                 rpcTempCU->initEstData( uiDepth, iQP );
     857                rpcTempCU->initEstData( uiDepth, iQP, bIsLosslessMode );
    905858#if H_3D_VSP
    906859                rpcTempCU->setDvInfoSubParts(DvInfo, 0, uiDepth);
     
    922875                xCheckRDCostInter( rpcBestCU, rpcTempCU, SIZE_2NxnD, true );
    923876#endif
    924                 rpcTempCU->initEstData( uiDepth, iQP );
     877                rpcTempCU->initEstData( uiDepth, iQP, bIsLosslessMode );
    925878#if H_3D_VSP
    926879                rpcTempCU->setDvInfoSubParts(DvInfo, 0, uiDepth);
     
    948901                xCheckRDCostInter( rpcBestCU, rpcTempCU, SIZE_nLx2N );
    949902#endif
    950                 rpcTempCU->initEstData( uiDepth, iQP );
     903                rpcTempCU->initEstData( uiDepth, iQP, bIsLosslessMode );
    951904#if H_3D_VSP
    952905                rpcTempCU->setDvInfoSubParts(DvInfo, 0, uiDepth);
     
    968921                xCheckRDCostInter( rpcBestCU, rpcTempCU, SIZE_nRx2N );
    969922#endif
    970                 rpcTempCU->initEstData( uiDepth, iQP );
     923                rpcTempCU->initEstData( uiDepth, iQP, bIsLosslessMode );
    971924#if H_3D_VSP
    972925                rpcTempCU->setDvInfoSubParts(DvInfo, 0, uiDepth);
     
    988941                xCheckRDCostInter( rpcBestCU, rpcTempCU, SIZE_nLx2N, true );
    989942#endif
    990                 rpcTempCU->initEstData( uiDepth, iQP );
     943                rpcTempCU->initEstData( uiDepth, iQP, bIsLosslessMode );
    991944#if H_3D_VSP
    992945                rpcTempCU->setDvInfoSubParts(DvInfo, 0, uiDepth);
     
    1008961                xCheckRDCostInter( rpcBestCU, rpcTempCU, SIZE_nRx2N, true );
    1009962#endif
    1010                 rpcTempCU->initEstData( uiDepth, iQP );
     963                rpcTempCU->initEstData( uiDepth, iQP, bIsLosslessMode );
    1011964#if H_3D_VSP
    1012965                rpcTempCU->setDvInfoSubParts(DvInfo, 0, uiDepth);
     
    1022975#endif
    1023976              xCheckRDCostInter( rpcBestCU, rpcTempCU, SIZE_2NxnU );
    1024               rpcTempCU->initEstData( uiDepth, iQP );
     977              rpcTempCU->initEstData( uiDepth, iQP, bIsLosslessMode );
    1025978#if H_3D_VSP
    1026979              rpcTempCU->setDvInfoSubParts(DvInfo, 0, uiDepth);
    1027980#endif
    1028981              xCheckRDCostInter( rpcBestCU, rpcTempCU, SIZE_2NxnD );
    1029               rpcTempCU->initEstData( uiDepth, iQP );
     982              rpcTempCU->initEstData( uiDepth, iQP, bIsLosslessMode );
    1030983#if H_3D_VSP
    1031984              rpcTempCU->setDvInfoSubParts(DvInfo, 0, uiDepth);
     
    1037990#endif
    1038991              xCheckRDCostInter( rpcBestCU, rpcTempCU, SIZE_nLx2N );
    1039               rpcTempCU->initEstData( uiDepth, iQP );
     992              rpcTempCU->initEstData( uiDepth, iQP, bIsLosslessMode );
    1040993#if H_3D_VSP
    1041994              rpcTempCU->setDvInfoSubParts(DvInfo, 0, uiDepth);
    1042995#endif
    1043996              xCheckRDCostInter( rpcBestCU, rpcTempCU, SIZE_nRx2N );
    1044               rpcTempCU->initEstData( uiDepth, iQP );
     997              rpcTempCU->initEstData( uiDepth, iQP, bIsLosslessMode );
    1045998#if H_3D_VSP
    1046999              rpcTempCU->setDvInfoSubParts(DvInfo, 0, uiDepth);
     
    10721025            xCheckRDCostIntra( rpcBestCU, rpcTempCU, SIZE_2Nx2N );
    10731026
    1074 #if RATE_CONTROL_LAMBDA_DOMAIN && !M0036_RC_IMPROVEMENT && KWU_RC_MADPRED_E0227
     1027#if KWU_RC_MADPRED_E0227
    10751028            if ( uiDepth <= m_addSADDepth )
    10761029            {
     
    10791032            }
    10801033#endif
    1081 #if RATE_CONTROL_LAMBDA_DOMAIN && M0036_RC_IMPROVEMENT && KWU_RC_MADPRED_E0227
    1082             if ( uiDepth <= m_addSADDepth )
    1083             {
    1084               m_LCUPredictionSAD += m_spatialSAD;
    1085               m_addSADDepth = uiDepth;
    1086             }
    1087 #endif
    1088 
    1089 #if !RATE_CONTROL_LAMBDA_DOMAIN && KWU_RC_MADPRED_E0227
    1090             if ( uiDepth <= m_addSADDepth )
    1091             {
    1092               m_LCUPredictionSAD += m_spatialSAD;
    1093               m_addSADDepth = uiDepth;
    1094             }
    1095 #endif
    1096             rpcTempCU->initEstData( uiDepth, iQP );
     1034
     1035            rpcTempCU->initEstData( uiDepth, iQP, bIsLosslessMode );
    10971036            if( uiDepth == g_uiMaxCUDepth - g_uiAddCUDepth )
    10981037            {
     
    11041043                {
    11051044                  xCheckRDCostIntra( rpcBestCU, rpcTempCU, SIZE_NxN   );
    1106                   rpcTempCU->initEstData( uiDepth, iQP );
     1045                  rpcTempCU->initEstData( uiDepth, iQP, bIsLosslessMode );
    11071046                }
    11081047#if H_3D_QTLPC
     
    11261065          {
    11271066            xCheckIntraPCM (rpcBestCU, rpcTempCU);
    1128             rpcTempCU->initEstData( uiDepth, iQP );
     1067            rpcTempCU->initEstData( uiDepth, iQP, bIsLosslessMode );
    11291068          }
    11301069        }
     
    11321071        }
    11331072#endif
    1134         if (isAddLowestQP && (iQP == lowestQP))
     1073        if (bIsLosslessMode)
    11351074        {
    11361075          iQP = iMinQP;
     
    11421081    m_pcEntropyCoder->encodeSplitFlag( rpcBestCU, 0, uiDepth, true );
    11431082    rpcBestCU->getTotalBits() += m_pcEntropyCoder->getNumberOfWrittenBits(); // split bits
    1144     if(m_pcEncCfg->getUseSBACRD())
    1145     {
    11461083      rpcBestCU->getTotalBins() += ((TEncBinCABAC *)((TEncSbac*)m_pcEntropyCoder->m_pcEntropyCoderIf)->getEncBinIf())->getBinsCoded();
    1147     }
    1148 
    1149 #if H_3D_VSO // M8
    1150     if ( m_pcRdCost->getUseVSO() )   
    1151       rpcBestCU->getTotalCost()  = m_pcRdCost->calcRdCostVSO( rpcBestCU->getTotalBits(), rpcBestCU->getTotalDistortion() );   
    1152     else
    1153 #endif
    11541084    rpcBestCU->getTotalCost()  = m_pcRdCost->calcRdCost( rpcBestCU->getTotalBits(), rpcBestCU->getTotalDistortion() );
    11551085
     
    11731103  {
    11741104    bBoundary = true;
    1175 #if RATE_CONTROL_LAMBDA_DOMAIN && !M0036_RC_IMPROVEMENT
    1176     m_addSADDepth++;
    1177 #endif
    11781105  }
    11791106
     
    11881115    iMinQP = Clip3( -rpcTempCU->getSlice()->getSPS()->getQpBDOffsetY(), MAX_QP, iBaseQP-idQP );
    11891116    iMaxQP = Clip3( -rpcTempCU->getSlice()->getSPS()->getQpBDOffsetY(), MAX_QP, iBaseQP+idQP );
    1190     if ( (rpcTempCU->getSlice()->getSPS()->getUseLossless()) && (lowestQP < iMinQP) && rpcTempCU->getSlice()->getPPS()->getUseDQP() )
    1191     {
    1192       isAddLowestQP = true;
    1193       iMinQP = iMinQP - 1;     
    1194     }
    11951117  }
    11961118  else if( (g_uiMaxCUWidth>>uiDepth) > rpcTempCU->getSlice()->getPPS()->getMinCuDQPSize() )
     
    12141136    iMaxQP = iStartQP;
    12151137  }
    1216 #if RATE_CONTROL_LAMBDA_DOMAIN
    12171138  if ( m_pcEncCfg->getUseRateCtrl() )
    12181139  {
     
    12201141    iMaxQP = m_pcRateCtrl->getRCQP();
    12211142  }
    1222 #else
    1223   if(m_pcEncCfg->getUseRateCtrl())
    1224   {
    1225     Int qp = m_pcRateCtrl->getUnitQP();
    1226     iMinQP  = Clip3( MIN_QP, MAX_QP, qp);
    1227     iMaxQP  = Clip3( MIN_QP, MAX_QP, qp);
    1228   }
    1229 #endif
     1143
     1144  if ( m_pcEncCfg->getCUTransquantBypassFlagForceValue() )
     1145  {
     1146    iMaxQP = iMinQP; // If all blocks are forced into using transquant bypass, do not loop here.
     1147  }
    12301148  for (Int iQP=iMinQP; iQP<=iMaxQP; iQP++)
    12311149  {
    1232     if (isAddLowestQP && (iQP == iMinQP))
    1233     {
    1234       iQP = lowestQP;
    1235     }
    1236     rpcTempCU->initEstData( uiDepth, iQP );
     1150    const Bool bIsLosslessMode = false; // False at this level. Next level down may set it to true.
     1151    rpcTempCU->initEstData( uiDepth, iQP, bIsLosslessMode );
    12371152
    12381153    // further split
     
    12671182        if(bInSlice && ( pcSubBestPartCU->getCUPelX() < pcSlice->getSPS()->getPicWidthInLumaSamples() ) && ( pcSubBestPartCU->getCUPelY() < pcSlice->getSPS()->getPicHeightInLumaSamples() ) )
    12681183        {
    1269           if( m_bUseSBACRD )
    1270           {
    12711184            if ( 0 == uiPartUnitIdx) //initialize RD with previous depth buffer
    12721185            {
     
    12771190              m_pppcRDSbacCoder[uhNextDepth][CI_CURR_BEST]->load(m_pppcRDSbacCoder[uhNextDepth][CI_NEXT_BEST]);
    12781191            }
    1279           }
    12801192
    12811193#if AMP_ENC_SPEEDUP
     
    13081220
    13091221        rpcTempCU->getTotalBits() += m_pcEntropyCoder->getNumberOfWrittenBits(); // split bits
    1310         if(m_pcEncCfg->getUseSBACRD())
    1311         {
    13121222          rpcTempCU->getTotalBins() += ((TEncBinCABAC *)((TEncSbac*)m_pcEntropyCoder->m_pcEntropyCoderIf)->getEncBinIf())->getBinsCoded();
    13131223        }
    1314       }
    1315 
    13161224#if H_3D_VSO // M10
    13171225      if ( m_pcRdCost->getUseVSO() )
     
    13491257          m_pcEntropyCoder->encodeQP( rpcTempCU, uiTargetPartIdx, false );
    13501258          rpcTempCU->getTotalBits() += m_pcEntropyCoder->getNumberOfWrittenBits(); // dQP bits
    1351           if(m_pcEncCfg->getUseSBACRD())
    1352           {
    13531259            rpcTempCU->getTotalBins() += ((TEncBinCABAC *)((TEncSbac*)m_pcEntropyCoder->m_pcEntropyCoderIf)->getEncBinIf())->getBinsCoded();
    1354           }
    13551260#if H_3D_VSO // M11
    13561261          if ( m_pcRdCost->getUseLambdaScaleVSO())         
     
    13711276      }
    13721277
    1373       if( m_bUseSBACRD )
    1374       {
    13751278        m_pppcRDSbacCoder[uhNextDepth][CI_NEXT_BEST]->store(m_pppcRDSbacCoder[uiDepth][CI_TEMP_BEST]);
    1376       }
    13771279      Bool isEndOfSlice        = rpcBestCU->getSlice()->getSliceMode()==FIXED_NUMBER_OF_BYTES
    13781280                                 && (rpcBestCU->getTotalBits()>rpcBestCU->getSlice()->getSliceArgument()<<3);
     
    13851287      xCheckBestMode( rpcBestCU, rpcTempCU, uiDepth);                                  // RD compare current larger prediction
    13861288    }                                                                                  // with sub partitioned prediction.
    1387     if (isAddLowestQP && (iQP == lowestQP))
    1388     {
    1389       iQP = iMinQP;
    1390     }
    1391   }
    1392 
     1289    }
    13931290
    13941291#if H_3D_VSO // M12
     
    14021299  }
    14031300#endif
    1404 
    14051301  rpcBestCU->copyToPic(uiDepth);                                                     // Copy Best data to Picture for next partition prediction.
    14061302
     
    16831579}
    16841580
    1685 #if RATE_CONTROL_INTRA
    16861581Int xCalcHADs8x8_ISlice(Pel *piOrg, Int iStrideOrg)
    16871582{
     
    17981693  return(iSumHad);
    17991694}
    1800 #endif
    18011695
    18021696/** check RD costs for a CU block encoded with merge
     
    18161710#endif
    18171711  Int numValidMergeCand = 0;
     1712  const Bool bTransquantBypassFlag = rpcTempCU->getCUTransquantBypass(0);
    18181713
    18191714  for( UInt ui = 0; ui < rpcTempCU->getSlice()->getMaxNumMergeCand(); ++ui )
     
    18401735#else
    18411736  rpcTempCU->setPartSizeSubParts( SIZE_2Nx2N, 0, uhDepth ); // interprets depth relative to LCU level
    1842   rpcTempCU->setCUTransquantBypassSubParts( m_pcEncCfg->getCUTransquantBypassFlagValue(), 0, uhDepth );
    18431737#endif
    18441738
     
    19681862          // set MC parameters
    19691863          rpcTempCU->setPredModeSubParts( MODE_INTER, 0, uhDepth ); // interprets depth relative to LCU level
    1970           rpcTempCU->setCUTransquantBypassSubParts( m_pcEncCfg->getCUTransquantBypassFlagValue(),     0, uhDepth );
     1864          rpcTempCU->setCUTransquantBypassSubParts( bTransquantBypassFlag,     0, uhDepth );
    19711865          rpcTempCU->setPartSizeSubParts( SIZE_2Nx2N, 0, uhDepth ); // interprets depth relative to LCU level
    19721866#if H_3D_IC
     
    21602054          }
    21612055#endif
    2162           rpcTempCU->initEstData( uhDepth, orgQP );
     2056          rpcTempCU->initEstData( uhDepth, orgQP, bTransquantBypassFlag );
    21632057
    21642058      if( m_pcEncCfg->getUseFastDecisionForMerge() && !bestIsSkip )
     
    22742168  rpcTempCU->setPartSizeSubParts  ( ePartSize,  0, uhDepth );
    22752169  rpcTempCU->setPredModeSubParts  ( MODE_INTER, 0, uhDepth );
    2276   rpcTempCU->setCUTransquantBypassSubParts  ( m_pcEncCfg->getCUTransquantBypassFlagValue(),      0, uhDepth );
    2277  
    22782170#if MTK_DDD_G0063
    22792171  rpcTempCU->setUseDDD( false, 0, uhDepth );
     
    23282220#endif
    23292221
    2330 #if RATE_CONTROL_LAMBDA_DOMAIN  && (!M0036_RC_IMPROVEMENT || KWU_RC_MADPRED_E0227)
     2222#if KWU_RC_MADPRED_E0227
    23312223  if ( m_pcEncCfg->getUseRateCtrl() && m_pcEncCfg->getLCULevelRC() && ePartSize == SIZE_2Nx2N && uhDepth <= m_addSADDepth )
    23322224  {
     
    23372229  }
    23382230#endif
    2339 #if !RATE_CONTROL_LAMBDA_DOMAIN  && KWU_RC_MADPRED_E0227
    2340   if ( m_pcEncCfg->getUseRateCtrl() && ePartSize == SIZE_2Nx2N && uhDepth <= m_addSADDepth )
    2341   {
    2342     UInt SAD = m_pcRdCost->getSADPart( g_bitDepthY, m_ppcPredYuvTemp[uhDepth]->getLumaAddr(), m_ppcPredYuvTemp[uhDepth]->getStride(),
    2343       m_ppcOrigYuv[uhDepth]->getLumaAddr(), m_ppcOrigYuv[uhDepth]->getStride(),
    2344       rpcTempCU->getWidth(0), rpcTempCU->getHeight(0) );
    2345     m_temporalSAD = (Int)SAD;
    2346   }
    2347 #endif
    2348 
    23492231  m_pcPredSearch->encodeResAndCalcRdInterCU( rpcTempCU, m_ppcOrigYuv[uhDepth], m_ppcPredYuvTemp[uhDepth], m_ppcResiYuvTemp[uhDepth], m_ppcResiYuvBest[uhDepth], m_ppcRecoYuvTemp[uhDepth], false );
    2350  
    23512232#if NTT_STORE_SPDV_VSP_G0148 // possible bug fix
    23522233  if( rpcTempCU->getQtRootCbf(0)==0 )
     
    26572538  rpcTempCU->setPartSizeSubParts( eSize, 0, uiDepth );
    26582539  rpcTempCU->setPredModeSubParts( MODE_INTRA, 0, uiDepth );
    2659   rpcTempCU->setCUTransquantBypassSubParts( m_pcEncCfg->getCUTransquantBypassFlagValue(), 0, uiDepth );
    26602540 
    26612541  Bool bSeparateLumaChroma = true; // choose estimation mode
     
    26932573  setdQPFlag( bCodeDQP );
    26942574 
    2695   if( m_bUseSBACRD ) m_pcRDGoOnSbacCoder->store(m_pppcRDSbacCoder[uiDepth][CI_TEMP_BEST]);
     2575  m_pcRDGoOnSbacCoder->store(m_pppcRDSbacCoder[uiDepth][CI_TEMP_BEST]);
    26962576 
    26972577  rpcTempCU->getTotalBits() = m_pcEntropyCoder->getNumberOfWrittenBits();
    2698   if(m_pcEncCfg->getUseSBACRD())
    2699   {
    27002578    rpcTempCU->getTotalBins() = ((TEncBinCABAC *)((TEncSbac*)m_pcEntropyCoder->m_pcEntropyCoderIf)->getEncBinIf())->getBinsCoded();
    2701   }
    2702 
    27032579#if H_3D_VSO // M6
    27042580  if( m_pcRdCost->getUseLambdaScaleVSO()) 
     
    27082584  rpcTempCU->getTotalCost() = m_pcRdCost->calcRdCost( rpcTempCU->getTotalBits(), rpcTempCU->getTotalDistortion() );
    27092585 
    2710 #if RATE_CONTROL_LAMBDA_DOMAIN && !M0036_RC_IMPROVEMENT && KWU_RC_MADPRED_E0227
    2711   UChar uhDepth = rpcTempCU->getDepth( 0 );
    2712   if ( m_pcEncCfg->getUseRateCtrl() && m_pcEncCfg->getLCULevelRC() && eSize == SIZE_2Nx2N && uhDepth <= m_addSADDepth )
    2713   {
    2714     UInt SAD = m_pcRdCost->getSADPart( g_bitDepthY, m_ppcPredYuvTemp[uhDepth]->getLumaAddr(), m_ppcPredYuvTemp[uhDepth]->getStride(),
    2715       m_ppcOrigYuv[uhDepth]->getLumaAddr(), m_ppcOrigYuv[uhDepth]->getStride(),
    2716       rpcTempCU->getWidth(0), rpcTempCU->getHeight(0) );
    2717     m_spatialSAD = (Int)SAD;
    2718   }
    2719 #endif
    2720 #if RATE_CONTROL_LAMBDA_DOMAIN && M0036_RC_IMPROVEMENT && KWU_RC_MADPRED_E0227
    2721   UChar uhDepth = rpcTempCU->getDepth( 0 );
    2722   if ( m_pcEncCfg->getUseRateCtrl() && m_pcEncCfg->getLCULevelRC() && eSize == SIZE_2Nx2N && uhDepth <= m_addSADDepth )
    2723   {
    2724     UInt SAD = m_pcRdCost->getSADPart( g_bitDepthY, m_ppcPredYuvTemp[uhDepth]->getLumaAddr(), m_ppcPredYuvTemp[uhDepth]->getStride(),
    2725       m_ppcOrigYuv[uhDepth]->getLumaAddr(), m_ppcOrigYuv[uhDepth]->getStride(),
    2726       rpcTempCU->getWidth(0), rpcTempCU->getHeight(0) );
    2727     m_spatialSAD = (Int)SAD;
    2728   }
    2729 #endif
    2730 #if !RATE_CONTROL_LAMBDA_DOMAIN && KWU_RC_MADPRED_E0227
    2731   UChar uhDepth = rpcTempCU->getDepth( 0 );
    2732   if ( m_pcEncCfg->getUseRateCtrl() && eSize == SIZE_2Nx2N && uhDepth <= m_addSADDepth )
    2733   {
    2734     UInt SAD = m_pcRdCost->getSADPart( g_bitDepthY, m_ppcPredYuvTemp[uhDepth]->getLumaAddr(), m_ppcPredYuvTemp[uhDepth]->getStride(),
    2735       m_ppcOrigYuv[uhDepth]->getLumaAddr(), m_ppcOrigYuv[uhDepth]->getStride(),
    2736       rpcTempCU->getWidth(0), rpcTempCU->getHeight(0) );
    2737     m_spatialSAD = (Int)SAD;
    2738   }
    2739 #endif
    27402586  xCheckDQP( rpcTempCU );
    27412587  xCheckBestMode(rpcBestCU, rpcTempCU, uiDepth);
     
    27602606  rpcTempCU->setPredModeSubParts( MODE_INTRA, 0, uiDepth );
    27612607  rpcTempCU->setTrIdxSubParts ( 0, 0, uiDepth );
    2762   rpcTempCU->setCUTransquantBypassSubParts( m_pcEncCfg->getCUTransquantBypassFlagValue(), 0, uiDepth );
    27632608
    27642609  m_pcPredSearch->IPCMSearch( rpcTempCU, m_ppcOrigYuv[uiDepth], m_ppcPredYuvTemp[uiDepth], m_ppcResiYuvTemp[uiDepth], m_ppcRecoYuvTemp[uiDepth]);
    27652610
    2766   if( m_bUseSBACRD ) m_pcRDGoOnSbacCoder->load(m_pppcRDSbacCoder[uiDepth][CI_CURR_BEST]);
     2611  m_pcRDGoOnSbacCoder->load(m_pppcRDSbacCoder[uiDepth][CI_CURR_BEST]);
    27672612
    27682613  m_pcEntropyCoder->resetBits();
     
    27792624  m_pcEntropyCoder->encodeIPCMInfo ( rpcTempCU, 0, true );
    27802625
    2781   if( m_bUseSBACRD ) m_pcRDGoOnSbacCoder->store(m_pppcRDSbacCoder[uiDepth][CI_TEMP_BEST]);
     2626  m_pcRDGoOnSbacCoder->store(m_pppcRDSbacCoder[uiDepth][CI_TEMP_BEST]);
    27822627
    27832628  rpcTempCU->getTotalBits() = m_pcEntropyCoder->getNumberOfWrittenBits();
    2784   if(m_pcEncCfg->getUseSBACRD())
    2785   {
    27862629    rpcTempCU->getTotalBins() = ((TEncBinCABAC *)((TEncSbac*)m_pcEntropyCoder->m_pcEntropyCoderIf)->getEncBinIf())->getBinsCoded();
    2787   }
    27882630#if H_3D_VSO // M44
    27892631  if ( m_pcRdCost->getUseVSO() )
     
    28252667    pcCU  = NULL;
    28262668
    2827     if( m_bUseSBACRD )  // store temp best CI for next CU coding
     2669    // store temp best CI for next CU coding
    28282670      m_pppcRDSbacCoder[uiDepth][CI_TEMP_BEST]->store(m_pppcRDSbacCoder[uiDepth][CI_NEXT_BEST]);
    28292671  }
     
    28422684      m_pcEntropyCoder->encodeQP( pcCU, 0, false );
    28432685      pcCU->getTotalBits() += m_pcEntropyCoder->getNumberOfWrittenBits(); // dQP bits
    2844       if(m_pcEncCfg->getUseSBACRD())
    2845       {
    28462686        pcCU->getTotalBins() += ((TEncBinCABAC *)((TEncSbac*)m_pcEntropyCoder->m_pcEntropyCoderIf)->getEncBinIf())->getBinsCoded();
    2847       }
    28482687#if H_3D_VSO // M45
    28492688      if ( m_pcRdCost->getUseVSO() )     
  • branches/HTM-10.0rc1-dev0/source/Lib/TLibEncoder/TEncCu.h

    r833 r837  
    44 * granted under this license. 
    55 *
    6  * Copyright (c) 2010-2013, ITU/ISO/IEC
     6* Copyright (c) 2010-2014, ITU/ISO/IEC
    77 * All rights reserved.
    88 *
     
    104104  TEncSbac***             m_pppcRDSbacCoder;
    105105  TEncSbac*               m_pcRDGoOnSbacCoder;
    106   Bool                    m_bUseSBACRD;
    107106  TEncRateCtrl*           m_pcRateCtrl;
    108 #if RATE_CONTROL_LAMBDA_DOMAIN
    109 #if !M0036_RC_IMPROVEMENT
    110   UInt                    m_LCUPredictionSAD;
    111   Int                     m_addSADDepth;
    112   Int                     m_temporalSAD;
    113 #endif
    114 #if M0036_RC_IMPROVEMENT && KWU_RC_MADPRED_E0227
     107#if KWU_RC_MADPRED_E0227
    115108  UInt                    m_LCUPredictionSAD;
    116109  Int                     m_addSADDepth;
     
    118111  Int                     m_spatialSAD;
    119112#endif
    120 #endif
    121 #if !RATE_CONTROL_LAMBDA_DOMAIN && KWU_RC_MADPRED_E0227
    122   UInt                    m_LCUPredictionSAD;
    123   Int                     m_addSADDepth;
    124   Int                     m_temporalSAD;
    125   Int                     m_spatialSAD;
    126 #endif
    127 
    128113public:
    129114  /// copy parameters from encoder class
     
    143128 
    144129  Void setBitCounter        ( TComBitCounter* pcBitCounter ) { m_pcBitCounter = pcBitCounter; }
    145 #if (RATE_CONTROL_LAMBDA_DOMAIN && !M0036_RC_IMPROVEMENT) || KWU_RC_MADPRED_E0227
     130#if KWU_RC_MADPRED_E0227
    146131  UInt getLCUPredictionSAD() { return m_LCUPredictionSAD; }
    147132#endif
    148 #if RATE_CONTROL_INTRA
    149133  Int   updateLCUDataISlice ( TComDataCU* pcCU, Int LCUIdx, Int width, Int height );
    150 #endif
    151134protected:
    152135  Void  finishCU            ( TComDataCU*  pcCU, UInt uiAbsPartIdx,           UInt uiDepth        );
  • branches/HTM-10.0rc1-dev0/source/Lib/TLibEncoder/TEncEntropy.cpp

    r833 r837  
    44 * granted under this license. 
    55 *
    6  * Copyright (c) 2010-2013, ITU/ISO/IEC
     6* Copyright (c) 2010-2014, ITU/ISO/IEC
    77 * All rights reserved.
    88 *
     
    5151Void TEncEntropy::encodeSliceHeader ( TComSlice* pcSlice )
    5252{
    53   if (pcSlice->getSPS()->getUseSAO())
    54   {
    55     SAOParam *saoParam = pcSlice->getPic()->getPicSym()->getSaoParam();
    56     pcSlice->setSaoEnabledFlag     (saoParam->bSaoFlag[0]);
    57     {
    58       pcSlice->setSaoEnabledFlagChroma   (saoParam->bSaoFlag[1]);
    59     }
    60   }
    61 
    6253  m_pcEntropyCoderIf->codeSliceHeader( pcSlice );
    6354  return;
     
    787778}
    788779
    789 /** Encode SAO Offset
    790  * \param  saoLcuParam SAO LCU paramters
    791  */
    792 Void TEncEntropy::encodeSaoOffset(SaoLcuParam* saoLcuParam, UInt compIdx)
    793 {
    794   UInt uiSymbol;
    795   Int i;
    796 
    797   uiSymbol = saoLcuParam->typeIdx + 1;
    798   if (compIdx!=2)
    799   {
    800     m_pcEntropyCoderIf->codeSaoTypeIdx(uiSymbol);
    801   }
    802   if (uiSymbol)
    803   {
    804     if (saoLcuParam->typeIdx < 4 && compIdx != 2)
    805     {
    806       saoLcuParam->subTypeIdx = saoLcuParam->typeIdx;
    807     }
    808     Int bitDepth = compIdx ? g_bitDepthC : g_bitDepthY;
    809     Int offsetTh = 1 << min(bitDepth - 5,5);
    810     if( saoLcuParam->typeIdx == SAO_BO )
    811     {
    812       for( i=0; i< saoLcuParam->length; i++)
    813       {
    814         UInt absOffset = ( (saoLcuParam->offset[i] < 0) ? -saoLcuParam->offset[i] : saoLcuParam->offset[i]);
    815         m_pcEntropyCoderIf->codeSaoMaxUvlc(absOffset, offsetTh-1);
    816       } 
    817       for( i=0; i< saoLcuParam->length; i++)
    818       {
    819         if (saoLcuParam->offset[i] != 0)
    820         {
    821           UInt sign = (saoLcuParam->offset[i] < 0) ? 1 : 0 ;
    822           m_pcEntropyCoderIf->codeSAOSign(sign);
    823         }
    824       }
    825       uiSymbol = (UInt) (saoLcuParam->subTypeIdx);
    826       m_pcEntropyCoderIf->codeSaoUflc(5, uiSymbol);
    827     }
    828     else if( saoLcuParam->typeIdx < 4 )
    829     {
    830       m_pcEntropyCoderIf->codeSaoMaxUvlc( saoLcuParam->offset[0], offsetTh-1);
    831       m_pcEntropyCoderIf->codeSaoMaxUvlc( saoLcuParam->offset[1], offsetTh-1);
    832       m_pcEntropyCoderIf->codeSaoMaxUvlc(-saoLcuParam->offset[2], offsetTh-1);
    833       m_pcEntropyCoderIf->codeSaoMaxUvlc(-saoLcuParam->offset[3], offsetTh-1);
    834       if (compIdx!=2)
    835       {
    836         uiSymbol = (UInt) (saoLcuParam->subTypeIdx);
    837         m_pcEntropyCoderIf->codeSaoUflc(2, uiSymbol);
    838       }
    839     }
    840   }
    841 }
    842 
    843 /** Encode SAO unit interleaving
    844 * \param  rx
    845 * \param  ry
    846 * \param  pSaoParam
    847 * \param  pcCU
    848 * \param  iCUAddrInSlice
    849 * \param  iCUAddrUpInSlice
    850 * \param  bLFCrossSliceBoundaryFlag
    851  */
    852 Void TEncEntropy::encodeSaoUnitInterleaving(Int compIdx, Bool saoFlag, Int rx, Int ry, SaoLcuParam* saoLcuParam, Int cuAddrInSlice, Int cuAddrUpInSlice, Int allowMergeLeft, Int allowMergeUp)
    853 {
    854   if (saoFlag)
    855   {
    856     if (rx>0 && cuAddrInSlice!=0 && allowMergeLeft)
    857     {
    858       m_pcEntropyCoderIf->codeSaoMerge(saoLcuParam->mergeLeftFlag);
    859     }
    860     else
    861     {
    862       saoLcuParam->mergeLeftFlag = 0;
    863     }
    864     if (saoLcuParam->mergeLeftFlag == 0)
    865     {
    866       if ( (ry > 0) && (cuAddrUpInSlice>=0) && allowMergeUp )
    867       {
    868         m_pcEntropyCoderIf->codeSaoMerge(saoLcuParam->mergeUpFlag);
    869       }
    870       else
    871       {
    872         saoLcuParam->mergeUpFlag = 0;
    873       }
    874       if (!saoLcuParam->mergeUpFlag)
    875       {
    876         encodeSaoOffset(saoLcuParam, compIdx);
    877       }
    878     }
    879   }
    880 }
    881 
    882780Int TEncEntropy::countNonZeroCoeffs( TCoeff* pcCoef, UInt uiSize )
    883781{
     
    900798}
    901799
    902 #if H_3D_INTER_SDC
    903 #if QC_SDC_UNIFY_G0130
    904 Void TEncEntropy::encodeDeltaDC  ( TComDataCU* pcCU, UInt absPartIdx )
    905 {
    906   m_pcEntropyCoderIf->codeDeltaDC( pcCU, absPartIdx );
    907 }
    908 
    909 Void TEncEntropy::encodeSDCFlag( TComDataCU* pcCU, UInt uiAbsPartIdx, Bool bRD )
    910 {
    911   if( ( !pcCU->isIntra( uiAbsPartIdx ) && !pcCU->getSlice()->getVPS()->getInterSDCFlag( pcCU->getSlice()->getLayerIdInVps() ) ) ||
    912     ( pcCU->isIntra( uiAbsPartIdx ) && !pcCU->getSlice()->getVPS()->getVpsDepthModesFlag( pcCU->getSlice()->getLayerIdInVps() ) ) )
    913   {
    914     return;
    915   }
    916 
    917 #if SEC_INTER_SDC_G0101
    918   if( !pcCU->getSlice()->getIsDepth() || pcCU->getPartitionSize( uiAbsPartIdx ) != SIZE_2Nx2N || pcCU->isSkipped( uiAbsPartIdx ) )
    919 #else
    920   if( !pcCU->getSlice()->getIsDepth() || ( pcCU->isIntra( uiAbsPartIdx ) && pcCU->getPartitionSize( uiAbsPartIdx ) != SIZE_2Nx2N ) || pcCU->isSkipped( uiAbsPartIdx ) )
    921 #endif
    922   {
    923     return;
    924   }
    925 
    926 #if SEC_INTER_SDC_G0101
    927   assert( pcCU->getPartitionSize( uiAbsPartIdx ) == SIZE_2Nx2N || ( !pcCU->isIntra( uiAbsPartIdx ) && !pcCU->isSkipped( uiAbsPartIdx ) ) );
    928 #else
    929   assert( ( pcCU->isIntra( uiAbsPartIdx ) && pcCU->getPartitionSize( uiAbsPartIdx ) == SIZE_2Nx2N ) || ( !pcCU->isIntra( uiAbsPartIdx ) && !pcCU->isSkipped( uiAbsPartIdx ) ) );
    930 #endif
    931 
    932   if( bRD )
    933   {
    934     uiAbsPartIdx = 0;
    935   }
    936 
    937   m_pcEntropyCoderIf->codeSDCFlag( pcCU, uiAbsPartIdx );
    938 }
    939 #else
    940 Void TEncEntropy::encodeInterSDCFlag( TComDataCU* pcCU, UInt uiAbsPartIdx, Bool bRD )
    941 {
    942   if( !pcCU->getSlice()->getVPS()->getInterSDCFlag( pcCU->getSlice()->getLayerIdInVps() ) )
    943   {
    944     return;
    945   }
    946 
    947   if( !pcCU->getSlice()->getIsDepth() || pcCU->isIntra( uiAbsPartIdx ) || pcCU->isSkipped( uiAbsPartIdx ) )
    948   {
    949     return;
    950   }
    951 
    952   if( bRD )
    953   {
    954     uiAbsPartIdx = 0;
    955   }
    956 
    957   m_pcEntropyCoderIf->codeInterSDCFlag( pcCU, uiAbsPartIdx );
    958 }
    959 
    960 Void TEncEntropy::encodeInterSDCResidualData( TComDataCU* pcCU, UInt uiAbsPartIdx, Bool bRD )
    961 {
    962   if( !pcCU->getSlice()->getVPS()->getInterSDCFlag( pcCU->getSlice()->getLayerIdInVps() ) )
    963   {
    964     return;
    965   }
    966 
    967   if( !pcCU->getSlice()->getIsDepth() || pcCU->isIntra( uiAbsPartIdx ) || !pcCU->getInterSDCFlag( uiAbsPartIdx ) )
    968   {
    969     return;
    970   }
    971 
    972   if( bRD )
    973   {
    974     uiAbsPartIdx = 0;
    975   }
    976 
    977   // number of segments depends on prediction mode for INTRA
    978   UInt uiNumSegments = ( pcCU->getPartitionSize( uiAbsPartIdx ) == SIZE_2Nx2N ) ? 1 : ( pcCU->getPartitionSize( uiAbsPartIdx ) == SIZE_NxN ? 4 : 2 );
    979 
    980   // encode residual data for each segment
    981   for( UInt uiSeg = 0; uiSeg < uiNumSegments; uiSeg++ )
    982   {
    983     m_pcEntropyCoderIf->codeInterSDCResidualData( pcCU, uiAbsPartIdx, uiSeg );
    984   }
    985 }
    986 #endif
    987 #endif
    988 #if H_3D_DBBP
    989 Void TEncEntropy::encodeDBBPFlag( TComDataCU* pcCU, UInt uiAbsPartIdx, Bool bRD )
    990 {
    991   if( bRD )
    992   {
    993     uiAbsPartIdx = 0;
    994   }
    995   m_pcEntropyCoderIf->codeDBBPFlag( pcCU, uiAbsPartIdx );
    996 }
    997 #endif
    998 
    999800//! \}
  • branches/HTM-10.0rc1-dev0/source/Lib/TLibEncoder/TEncEntropy.h

    r833 r837  
    44 * granted under this license. 
    55 *
    6  * Copyright (c) 2010-2013, ITU/ISO/IEC
     6* Copyright (c) 2010-2014, ITU/ISO/IEC
    77 * All rights reserved.
    88 *
     
    127127  virtual Void codeCoeffNxN      ( TComDataCU* pcCU, TCoeff* pcCoef, UInt uiAbsPartIdx, UInt uiWidth, UInt uiHeight, UInt uiDepth, TextType eTType ) = 0;
    128128  virtual Void codeTransformSkipFlags ( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt width, UInt height, TextType eTType ) = 0;
    129   virtual Void codeSAOSign          ( UInt code   ) = 0;
    130   virtual Void codeSaoMaxUvlc       ( UInt code, UInt maxSymbol ) = 0;
    131   virtual Void codeSaoMerge    ( UInt   uiCode  ) = 0;
    132   virtual Void codeSaoTypeIdx      ( UInt   uiCode) = 0;
    133   virtual Void codeSaoUflc         ( UInt uiLength, UInt   uiCode ) = 0;
    134129  virtual Void estBit               (estBitsSbacStruct* pcEstBitsSbac, Int width, Int height, TextType eTType) = 0;
    135130 
     
    232227 
    233228  Void estimateBit             ( estBitsSbacStruct* pcEstBitsSbac, Int width, Int height, TextType eTType);
    234   Void    encodeSaoOffset(SaoLcuParam* saoLcuParam, UInt compIdx);
    235   Void    encodeSaoUnitInterleaving(Int compIdx, Bool saoFlag, Int rx, Int ry, SaoLcuParam* saoLcuParam, Int cuAddrInSlice, Int cuAddrUpInSlice, Int allowMergeLeft, Int allowMergeUp);
    236229  static Int countNonZeroCoeffs( TCoeff* pcCoef, UInt uiSize );
    237230
  • branches/HTM-10.0rc1-dev0/source/Lib/TLibEncoder/TEncGOP.cpp

    r773 r837  
    44 * granted under this license. 
    55 *
    6  * Copyright (c) 2010-2013, ITU/ISO/IEC
     6* Copyright (c) 2010-2014, ITU/ISO/IEC
    77 * All rights reserved.
    88 *
     
    105105#endif
    106106#endif
     107#if FIX1172
     108  m_associatedIRAPType = NAL_UNIT_CODED_SLICE_IDR_N_LP;
     109  m_associatedIRAPPOC  = 0;
     110#endif
    107111  return;
    108112}
     
    472476    }
    473477
    474     if( getNalUnitType(pocCurr, m_iLastIDR) == NAL_UNIT_CODED_SLICE_IDR_W_RADL || getNalUnitType(pocCurr, m_iLastIDR) == NAL_UNIT_CODED_SLICE_IDR_N_LP )
     478    if( getNalUnitType(pocCurr, m_iLastIDR, isField) == NAL_UNIT_CODED_SLICE_IDR_W_RADL || getNalUnitType(pocCurr, m_iLastIDR, isField) == NAL_UNIT_CODED_SLICE_IDR_N_LP )
    475479    {
    476480      m_iLastIDR = pocCurr;
     
    551555#if H_MV
    552556    // Set the nal unit type
    553     pcSlice->setNalUnitType(getNalUnitType(pocCurr, m_iLastIDR));
     557    pcSlice->setNalUnitType(getNalUnitType(pocCurr, m_iLastIDR, isField));
    554558    if( pcSlice->getSliceType() == B_SLICE )
    555559    {
     
    559563      }
    560564    }
     565
     566// To be checked!
     567    if( pcSlice->getSliceType() == B_SLICE )
     568    {
     569      if( m_pcCfg->getGOPEntry( ( pcSlice->getRapPicFlag() && getLayerId() > 0 ) ? MAX_GOP : iGOPid ).m_sliceType == 'I' )
     570      {
     571        pcSlice->setSliceType( I_SLICE );
     572      }
     573    }
    561574#else
    562575    if(pcSlice->getSliceType()==B_SLICE&&m_pcCfg->getGOPEntry(iGOPid).m_sliceType=='P')
     
    564577      pcSlice->setSliceType(P_SLICE);
    565578    }
     579    if(pcSlice->getSliceType()==B_SLICE&&m_pcCfg->getGOPEntry(iGOPid).m_sliceType=='I')
     580    {
     581      pcSlice->setSliceType(I_SLICE);
     582    }
     583   
    566584    // Set the nal unit type
    567     pcSlice->setNalUnitType(getNalUnitType(pocCurr, m_iLastIDR));
     585    pcSlice->setNalUnitType(getNalUnitType(pocCurr, m_iLastIDR, isField));
    568586#endif
    569587    if(pcSlice->getTemporalLayerNonReferenceFlag())
     
    589607    m_pcEncTop->selectReferencePictureSet(pcSlice, pocCurr, iGOPid);
    590608    pcSlice->getRPS()->setNumberOfLongtermPictures(0);
    591 
    592 #if FIX1071
     609#if FIX1172
     610    if ( pcSlice->getNalUnitType() == NAL_UNIT_CODED_SLICE_BLA_W_LP
     611      || pcSlice->getNalUnitType() == NAL_UNIT_CODED_SLICE_BLA_W_RADL
     612      || pcSlice->getNalUnitType() == NAL_UNIT_CODED_SLICE_BLA_N_LP
     613      || pcSlice->getNalUnitType() == NAL_UNIT_CODED_SLICE_IDR_W_RADL
     614      || pcSlice->getNalUnitType() == NAL_UNIT_CODED_SLICE_IDR_N_LP
     615      || pcSlice->getNalUnitType() == NAL_UNIT_CODED_SLICE_CRA )  // IRAP picture
     616    {
     617      m_associatedIRAPType = pcSlice->getNalUnitType();
     618      m_associatedIRAPPOC = pocCurr;
     619    }
     620    pcSlice->setAssociatedIRAPType(m_associatedIRAPType);
     621    pcSlice->setAssociatedIRAPPOC(m_associatedIRAPPOC);
     622#endif
     623
    593624    if ((pcSlice->checkThatAllRefPicsAreAvailable(rcListPic, pcSlice->getRPS(), false) != 0) || (pcSlice->isIRAP()))
    594625    {
    595626      pcSlice->createExplicitReferencePictureSetFromReference(rcListPic, pcSlice->getRPS(), pcSlice->isIRAP());
    596627    }
    597 #else
    598     if(pcSlice->checkThatAllRefPicsAreAvailable(rcListPic, pcSlice->getRPS(), false) != 0)
    599     {
    600       pcSlice->createExplicitReferencePictureSetFromReference(rcListPic, pcSlice->getRPS());
    601     }
    602 #endif
    603628    pcSlice->applyReferencePictureSet(rcListPic, pcSlice->getRPS());
    604629
    605     if(pcSlice->getTLayer() > 0)
     630    if(pcSlice->getTLayer() > 0
     631      &&  !( pcSlice->getNalUnitType() == NAL_UNIT_CODED_SLICE_RADL_N     // Check if not a leading picture
     632          || pcSlice->getNalUnitType() == NAL_UNIT_CODED_SLICE_RADL_R
     633          || pcSlice->getNalUnitType() == NAL_UNIT_CODED_SLICE_RASL_N
     634          || pcSlice->getNalUnitType() == NAL_UNIT_CODED_SLICE_RASL_R )
     635        )
    606636    {
    607637      if(pcSlice->isTemporalLayerSwitchingPoint(rcListPic) || pcSlice->getSPS()->getTemporalIdNestingFlag())
     
    613643        else
    614644        {
    615           pcSlice->setNalUnitType(NAL_UNIT_CODED_SLICE_TLA_R);
     645          pcSlice->setNalUnitType(NAL_UNIT_CODED_SLICE_TSA_R);
    616646        }
    617647      }
     
    907937    pcPic->getSlice(pcSlice->getSliceIdx())->setMvdL1ZeroFlag(pcSlice->getMvdL1ZeroFlag());
    908938
    909 #if RATE_CONTROL_LAMBDA_DOMAIN
    910939    Double lambda            = 0.0;
    911940    Int actualHeadBits       = 0;
     
    944973      else if ( frameLevel == 0 )   // intra case, but use the model
    945974      {
    946 #if RATE_CONTROL_INTRA
    947975        m_pcSliceEncoder->calCostSliceI(pcPic);
    948 #endif
    949976        if ( m_pcCfg->getIntraPeriod() != 1 )   // do not refine allocated bits for all intra case
    950977        {
    951978          Int bits = m_pcRateCtrl->getRCSeq()->getLeftAverageBits();
    952 #if RATE_CONTROL_INTRA
    953979          bits = m_pcRateCtrl->getRCPic()->getRefineBitsForIntra( bits );
    954 #else
    955           bits = m_pcRateCtrl->getRCSeq()->getRefineBitsForIntra( bits );
    956 #endif
    957980          if ( bits < 200 )
    958981          {
     
    963986
    964987        list<TEncRCPic*> listPreviousPicture = m_pcRateCtrl->getPicList();
    965 #if RATE_CONTROL_INTRA
    966988        m_pcRateCtrl->getRCPic()->getLCUInitTargetBits();
    967989        lambda  = m_pcRateCtrl->getRCPic()->estimatePicLambda( listPreviousPicture, pcSlice->getSliceType());
    968 #else
    969         lambda  = m_pcRateCtrl->getRCPic()->estimatePicLambda( listPreviousPicture );
    970 #endif
    971990        sliceQP = m_pcRateCtrl->getRCPic()->estimatePicQP( lambda, listPreviousPicture );
    972991      }
     
    9841003#endif
    9851004        list<TEncRCPic*> listPreviousPicture = m_pcRateCtrl->getPicList();
    986 #if RATE_CONTROL_INTRA
    9871005        lambda  = m_pcRateCtrl->getRCPic()->estimatePicLambda( listPreviousPicture, pcSlice->getSliceType());
    988 #else
    989         lambda  = m_pcRateCtrl->getRCPic()->estimatePicLambda( listPreviousPicture );
    990 #endif
    9911006        sliceQP = m_pcRateCtrl->getRCPic()->estimatePicQP( lambda, listPreviousPicture );
    9921007#if KWU_RC_MADPRED_E0227
     
    10001015      m_pcSliceEncoder->resetQP( pcPic, sliceQP, lambda );
    10011016    }
    1002 #endif
    10031017
    10041018    UInt uiNumSlices = 1;
     
    12031217
    12041218    // SAO parameter estimation using non-deblocked pixels for LCU bottom and right boundary areas
    1205     if( m_pcCfg->getSaoLcuBasedOptimization() && m_pcCfg->getSaoLcuBoundary() )
    1206     {
    1207       m_pcSAO->resetStats();
    1208       m_pcSAO->calcSaoStatsCu_BeforeDblk( pcPic );
     1219    if( pcSlice->getSPS()->getUseSAO() && m_pcCfg->getSaoLcuBoundary() )
     1220    {
     1221      m_pcSAO->getPreDBFStatistics(pcPic);
    12091222    }
    12101223
     
    12181231    m_pcLoopFilter->loopFilterPic( pcPic );
    12191232
    1220     pcSlice = pcPic->getSlice(0);
    1221     if(pcSlice->getSPS()->getUseSAO())
    1222     {
    1223       std::vector<Bool> LFCrossSliceBoundaryFlag;
    1224       for(Int s=0; s< uiNumSlices; s++)
    1225       {
    1226         LFCrossSliceBoundaryFlag.push_back(  ((uiNumSlices==1)?true:pcPic->getSlice(s)->getLFCrossSliceBoundaryFlag()) );
    1227       }
    1228       m_storedStartCUAddrForEncodingSlice.resize(uiNumSlices+1);
    1229       pcPic->createNonDBFilterInfo(m_storedStartCUAddrForEncodingSlice, 0, &LFCrossSliceBoundaryFlag ,pcPic->getPicSym()->getNumTiles() ,bLFCrossTileBoundary);
    1230     }
    1231 
    1232 
    1233     pcSlice = pcPic->getSlice(0);
    1234 
    1235     if(pcSlice->getSPS()->getUseSAO())
    1236     {
    1237       m_pcSAO->createPicSaoInfo(pcPic);
    1238     }
    1239 
    12401233    /////////////////////////////////////////////////////////////////////////////////////////////////// File writing
    12411234    // Set entropy coder
     
    12541247      writeRBSPTrailingBits(nalu.m_Bitstream);
    12551248      accessUnit.push_back(new NALUnitEBSP(nalu));
    1256 #if RATE_CONTROL_LAMBDA_DOMAIN
    12571249      actualTotalBits += UInt(accessUnit.back()->m_nalUnitData.str().size()) * 8;
    1258 #endif
    12591250
    12601251#if H_MV
     
    12961287      writeRBSPTrailingBits(nalu.m_Bitstream);
    12971288      accessUnit.push_back(new NALUnitEBSP(nalu));
    1298 #if RATE_CONTROL_LAMBDA_DOMAIN
    12991289      actualTotalBits += UInt(accessUnit.back()->m_nalUnitData.str().size()) * 8;
    1300 #endif
    13011290
    13021291#if H_MV
     
    13131302      writeRBSPTrailingBits(nalu.m_Bitstream);
    13141303      accessUnit.push_back(new NALUnitEBSP(nalu));
    1315 #if RATE_CONTROL_LAMBDA_DOMAIN
    13161304      actualTotalBits += UInt(accessUnit.back()->m_nalUnitData.str().size()) * 8;
    1317 #endif
     1305     
    13181306#if PPS_FIX_DEPTH
    13191307      }
     
    13431331        {
    13441332          SOPcurrPOC += deltaPOC;
    1345           SOPDescriptionSEI.m_sopDescVclNaluType[i] = getNalUnitType(SOPcurrPOC, m_iLastIDR);
     1333          SOPDescriptionSEI.m_sopDescVclNaluType[i] = getNalUnitType(SOPcurrPOC, m_iLastIDR, isField);
    13461334          SOPDescriptionSEI.m_sopDescTemporalId[i] = m_pcCfg->getGOPEntry(j).m_temporalId;
    13471335          SOPDescriptionSEI.m_sopDescStRpsIdx[i] = m_pcEncTop->getReferencePictureSetIdxForSOP(pcSlice, SOPcurrPOC, j);
     
    16211609          }
    16221610          m_pcEntropyCoder->setBitstream(&nalu.m_Bitstream);
    1623 #if RATE_CONTROL_LAMBDA_DOMAIN
    16241611          tmpBitsBeforeWriting = m_pcEntropyCoder->getNumberOfWrittenBits();
    1625 #endif
    16261612          m_pcEntropyCoder->encodeSliceHeader(pcSlice);
    1627 #if RATE_CONTROL_LAMBDA_DOMAIN
    16281613          actualHeadBits += ( m_pcEntropyCoder->getNumberOfWrittenBits() - tmpBitsBeforeWriting );
    1629 #endif
    16301614
    16311615          // is it needed?
     
    17481732          xAttachSliceDataToNalUnit(nalu, pcBitstreamRedirect);
    17491733          accessUnit.push_back(new NALUnitEBSP(nalu));
    1750 #if RATE_CONTROL_LAMBDA_DOMAIN
    17511734          actualTotalBits += UInt(accessUnit.back()->m_nalUnitData.str().size()) * 8;
    1752 #endif
    17531735          bNALUAlignedWrittenToList = true;
    17541736          uiOneBitstreamPerSliceLength += nalu.m_Bitstream.getNumberOfWrittenBits(); // length of bitstream after byte-alignment
     
    17941776              m_pcEntropyCoder->resetEntropy();
    17951777              m_pcEntropyCoder->setBitstream( m_pcBitCounter );
    1796               m_pcSAO->startSaoEnc(pcPic, m_pcEntropyCoder, m_pcEncTop->getRDSbacCoder(), m_pcEncTop->getRDGoOnSbacCoder());
    1797               SAOParam& cSaoParam = *pcSlice->getPic()->getPicSym()->getSaoParam();
    1798 
    1799 #if SAO_CHROMA_LAMBDA
    1800 #if SAO_ENCODING_CHOICE
    1801               m_pcSAO->SAOProcess(&cSaoParam, pcPic->getSlice(0)->getLambdaLuma(), pcPic->getSlice(0)->getLambdaChroma(), pcPic->getSlice(0)->getDepth());
    1802 #else
    1803               m_pcSAO->SAOProcess(&cSaoParam, pcPic->getSlice(0)->getLambdaLuma(), pcPic->getSlice(0)->getLambdaChroma());
    1804 #endif
    1805 #else
    1806               m_pcSAO->SAOProcess(&cSaoParam, pcPic->getSlice(0)->getLambda());
    1807 #endif
    1808               m_pcSAO->endSaoEnc();
     1778            Bool sliceEnabled[NUM_SAO_COMPONENTS];
     1779            m_pcSAO->initRDOCabacCoder(m_pcEncTop->getRDGoOnSbacCoder(), pcSlice);
     1780            m_pcSAO->SAOProcess(pcPic
     1781              , sliceEnabled
     1782              , pcPic->getSlice(0)->getLambdas()
     1783#if SAO_ENCODE_ALLOW_USE_PREDEBLOCK
     1784              , m_pcCfg->getSaoLcuBoundary()
     1785#endif
     1786              );
    18091787              m_pcSAO->PCMLFDisableProcess(pcPic);
    1810             }
    1811 #if SAO_RDO
    1812             m_pcEntropyCoder->setEntropyCoder ( m_pcCavlcCoder, pcSlice );
    1813 #endif
    1814             processingState = ENCODE_SLICE;
    1815 
     1788
     1789            //assign SAO slice header
    18161790            for(Int s=0; s< uiNumSlices; s++)
    18171791            {
    1818               if (pcSlice->getSPS()->getUseSAO())
    1819               {
    1820                 pcPic->getSlice(s)->setSaoEnabledFlag((pcSlice->getPic()->getPicSym()->getSaoParam()->bSaoFlag[0]==1)?true:false);
     1792              pcPic->getSlice(s)->setSaoEnabledFlag(sliceEnabled[SAO_Y]);
     1793              assert(sliceEnabled[SAO_Cb] == sliceEnabled[SAO_Cr]);
     1794              pcPic->getSlice(s)->setSaoEnabledFlagChroma(sliceEnabled[SAO_Cb]);
    18211795              }
    18221796            }
     1797          processingState = ENCODE_SLICE;
    18231798          }
    18241799          break;
     
    18311806        }
    18321807      } // end iteration over slices
    1833 
    1834       if(pcSlice->getSPS()->getUseSAO())
    1835       {
    1836         if(pcSlice->getSPS()->getUseSAO())
    1837         {
    1838           m_pcSAO->destroyPicSaoInfo();
    1839         }
    1840         pcPic->destroyNonDBFilterInfo();
    1841       }
    18421808#if H_3D
    18431809      pcPic->compressMotion(2);
     
    19191885
    19201886    //In case of field coding, compute the interlaced PSNR for both fields
    1921     if (isField && ((!pcPic->isTopField() && isTff) || (pcPic->isTopField() && !isTff)))
     1887    if (isField && ((!pcPic->isTopField() && isTff) || (pcPic->isTopField() && !isTff)) && (pcPic->getPOC()%m_iGopSize != 1))
    19221888    {
    19231889      //get complementary top field
     
    19311897      xCalculateInterlacedAddPSNR(pcPicTop, pcPic, pcPicTop->getPicYuvRec(), pcPic->getPicYuvRec(), accessUnit, dEncTime );
    19321898    }
     1899    else if (isField && pcPic->getPOC()!= 0 && (pcPic->getPOC()%m_iGopSize == 0))
     1900    {
     1901      //get complementary bottom field
     1902      TComPic* pcPicBottom;
     1903      TComList<TComPic*>::iterator   iterPic = rcListPic.begin();
     1904      while ((*iterPic)->getPOC() != pcPic->getPOC()+1)
     1905      {
     1906        iterPic ++;
     1907      }
     1908      pcPicBottom = *(iterPic);
     1909      xCalculateInterlacedAddPSNR(pcPic, pcPicBottom, pcPic->getPicYuvRec(), pcPicBottom->getPicYuvRec(), accessUnit, dEncTime );
     1910    }
    19331911   
    19341912      if (digestStr)
     
    19471925        }
    19481926      }
    1949 #if RATE_CONTROL_LAMBDA_DOMAIN
    19501927      if ( m_pcCfg->getUseRateCtrl() )
    19511928      {
    1952 #if !M0036_RC_IMPROVEMENT
    1953         Double effectivePercentage = m_pcRateCtrl->getRCPic()->getEffectivePercentage();
    1954 #endif
    19551929        Double avgQP     = m_pcRateCtrl->getRCPic()->calAverageQP();
    19561930        Double avgLambda = m_pcRateCtrl->getRCPic()->calAverageLambda();
     
    19591933          avgLambda = lambda;
    19601934        }
    1961 #if M0036_RC_IMPROVEMENT
    1962 #if RATE_CONTROL_INTRA
    19631935        m_pcRateCtrl->getRCPic()->updateAfterPicture( actualHeadBits, actualTotalBits, avgQP, avgLambda, pcSlice->getSliceType());
    1964 #else
    1965         m_pcRateCtrl->getRCPic()->updateAfterPicture( actualHeadBits, actualTotalBits, avgQP, avgLambda );
    1966 #endif
    1967 #else
    1968         m_pcRateCtrl->getRCPic()->updateAfterPicture( actualHeadBits, actualTotalBits, avgQP, avgLambda, effectivePercentage );
    1969 #endif
    19701936        m_pcRateCtrl->getRCPic()->addToPictureLsit( m_pcRateCtrl->getPicList() );
    19711937
     
    19801946        }
    19811947      }
    1982 #else
    1983       if(m_pcCfg->getUseRateCtrl())
    1984       {
    1985         UInt  frameBits = m_vRVM_RP[m_vRVM_RP.size()-1];
    1986         m_pcRateCtrl->updataRCFrameStatus((Int)frameBits, pcSlice->getSliceType());
    1987       }
    1988 #endif
    19891948
    19901949      if( ( m_pcCfg->getPictureTimingSEIEnabled() || m_pcCfg->getDecodingUnitInfoSEIEnabled() ) &&
     
    21732132      delete[] pcSubstreamsOut;
    21742133  }
    2175 #if !KWU_FIX_URQ && !RATE_CONTROL_LAMBDA_DOMAIN
    2176   if(m_pcCfg->getUseRateCtrl())
    2177   {
    2178     m_pcRateCtrl->updateRCGOPStatus();
    2179   }
    2180 #endif
    21812134  delete pcBitstreamRedirect;
    21822135
     
    22622215  m_pcEntropyCoder->resetEntropy    ();
    22632216  m_pcEntropyCoder->setBitstream    ( m_pcBitCounter );
    2264   pcSlice = pcPic->getSlice(0);
    2265   if(pcSlice->getSPS()->getUseSAO())
    2266   {
    2267     std::vector<Bool> LFCrossSliceBoundaryFlag(1, true);
    2268     std::vector<Int>  sliceStartAddress;
    2269     sliceStartAddress.push_back(0);
    2270     sliceStartAddress.push_back(pcPic->getNumCUsInFrame()* pcPic->getNumPartInCU());
    2271     pcPic->createNonDBFilterInfo(sliceStartAddress, 0, &LFCrossSliceBoundaryFlag);
    2272   }
    2273  
    2274   if( pcSlice->getSPS()->getUseSAO())
    2275   {
    2276     pcPic->destroyNonDBFilterInfo();
    2277   }
    2278  
    22792217  m_pcEntropyCoder->resetEntropy    ();
    22802218  ruiBits += m_pcEntropyCoder->getNumberOfWrittenBits();
     
    24542392    case NAL_UNIT_CODED_SLICE_TRAIL_R: return "TRAIL_R";
    24552393    case NAL_UNIT_CODED_SLICE_TRAIL_N: return "TRAIL_N";
    2456     case NAL_UNIT_CODED_SLICE_TLA_R:      return "TLA_R";
     2394    case NAL_UNIT_CODED_SLICE_TSA_R:      return "TSA_R";
    24572395    case NAL_UNIT_CODED_SLICE_TSA_N: return "TSA_N";
    24582396    case NAL_UNIT_CODED_SLICE_STSA_R: return "STSA_R";
     
    27022640    for (Int x = 0; x < width; x++)
    27032641    {
    2704       dst[x] = isTff ? (UChar) top[x] : (UChar) bottom[x];
    2705       dst[stride+x] = isTff ? (UChar) bottom[x] : (UChar) top[x];
     2642      dst[x] = isTff ? top[x] : bottom[x];
     2643      dst[stride+x] = isTff ? bottom[x] : top[x];
    27062644    }
    27072645    top += stride;
     
    28622800 * This function checks the configuration and returns the appropriate nal_unit_type for the picture.
    28632801 */
    2864 NalUnitType TEncGOP::getNalUnitType(Int pocCurr, Int lastIDR)
     2802NalUnitType TEncGOP::getNalUnitType(Int pocCurr, Int lastIDR, Bool isField)
    28652803{
    28662804  if (pocCurr == 0)
     
    28682806    return NAL_UNIT_CODED_SLICE_IDR_W_RADL;
    28692807  }
    2870   if (pocCurr % m_pcCfg->getIntraPeriod() == 0)
     2808  if ((pocCurr - isField) % m_pcCfg->getIntraPeriod() == 0)
    28712809  {
    28722810    if (m_pcCfg->getDecodingRefreshType() == 1)
  • branches/HTM-10.0rc1-dev0/source/Lib/TLibEncoder/TEncGOP.h

    r655 r837  
    44 * granted under this license. 
    55 *
    6  * Copyright (c) 2010-2013, ITU/ISO/IEC
     6* Copyright (c) 2010-2014, ITU/ISO/IEC
    77 * All rights reserved.
    88 *
     
    125125  std::vector<Int>        m_storedStartCUAddrForEncodingSlice;
    126126  std::vector<Int>        m_storedStartCUAddrForEncodingSliceSegment;
     127#if FIX1172
     128  NalUnitType             m_associatedIRAPType;
     129  Int                     m_associatedIRAPPOC;
     130#endif
    127131
    128132  std::vector<Int> m_vRVM_RP;
     
    181185
    182186  TEncSlice*  getSliceEncoder()   { return m_pcSliceEncoder; }
    183   NalUnitType getNalUnitType( Int pocCurr, Int lastIdr );
     187  NalUnitType getNalUnitType( Int pocCurr, Int lastIdr, Bool isField );
    184188  Void arrangeLongtermPicturesInRPS(TComSlice *, TComList<TComPic*>& );
    185189protected:
     
    187191
    188192protected:
     193
    189194  Void xInitGOP( Int iPOCLast, Int iNumPicRcvd, TComList<TComPic*>& rcListPic, TComList<TComPicYuv*>& rcListPicYuvRecOut, bool isField );
    190 
    191195  Void  xInitGOP          ( Int iPOC, Int iNumPicRcvd, TComList<TComPic*>& rcListPic, TComList<TComPicYuv*>& rcListPicYuvRecOut );
    192196  Void  xGetBuffer        ( TComList<TComPic*>& rcListPic, TComList<TComPicYuv*>& rcListPicYuvRecOut, Int iNumPicRcvd, Int iTimeOffset, TComPic*& rpcPic, TComPicYuv*& rpcPicYuvRecOut, Int pocCurr, bool isField );
  • branches/HTM-10.0rc1-dev0/source/Lib/TLibEncoder/TEncPic.cpp

    r608 r837  
    44 * granted under this license. 
    55 *
    6  * Copyright (c) 2010-2013, ITU/ISO/IEC
     6* Copyright (c) 2010-2014, ITU/ISO/IEC
    77 * All rights reserved.
    88 *
  • branches/HTM-10.0rc1-dev0/source/Lib/TLibEncoder/TEncPic.h

    r608 r837  
    44 * granted under this license. 
    55 *
    6  * Copyright (c) 2010-2013, ITU/ISO/IEC
     6* Copyright (c) 2010-2014, ITU/ISO/IEC
    77 * All rights reserved.
    88 *
  • branches/HTM-10.0rc1-dev0/source/Lib/TLibEncoder/TEncPreanalyzer.cpp

    r608 r837  
    44 * granted under this license. 
    55 *
    6  * Copyright (c) 2010-2013, ITU/ISO/IEC
     6* Copyright (c) 2010-2014, ITU/ISO/IEC
    77 * All rights reserved.
    88 *
  • branches/HTM-10.0rc1-dev0/source/Lib/TLibEncoder/TEncPreanalyzer.h

    r608 r837  
    44 * granted under this license. 
    55 *
    6  * Copyright (c) 2010-2013, ITU/ISO/IEC
     6* Copyright (c) 2010-2014, ITU/ISO/IEC
    77 * All rights reserved.
    88 *
  • branches/HTM-10.0rc1-dev0/source/Lib/TLibEncoder/TEncRateCtrl.cpp

    r655 r837  
    44 * granted under this license. 
    55 *
    6  * Copyright (c) 2010-2013, ITU/ISO/IEC
     6* Copyright (c) 2010-2014, ITU/ISO/IEC
    77 * All rights reserved.
    88 *
     
    4242using namespace std;
    4343
    44 #if RATE_CONTROL_LAMBDA_DOMAIN
    45 
    4644//sequence level
    4745TEncRCSeq::TEncRCSeq()
     
    6765  m_bitsLeft            = 0;
    6866  m_useLCUSeparateModel = false;
    69 #if M0036_RC_IMPROVEMENT
    7067  m_adaptiveBit         = 0;
    7168  m_lastLambda          = 0.0;
    72 #endif
    7369}
    7470
     
    7874}
    7975
    80 #if M0036_RC_IMPROVEMENT
    8176Void TEncRCSeq::create( Int totalFrames, Int targetBitrate, Int frameRate, Int GOPSize, Int picWidth, Int picHeight, Int LCUWidth, Int LCUHeight, Int numberOfLevel, Bool useLCUSeparateModel, Int adaptiveBit )
    82 #else
    83 Void TEncRCSeq::create( Int totalFrames, Int targetBitrate, Int frameRate, Int GOPSize, Int picWidth, Int picHeight, Int LCUWidth, Int LCUHeight, Int numberOfLevel, Bool useLCUSeparateModel )
    84 #endif
    8577{
    8678  destroy();
     
    109101    m_betaUpdate  = 0.025;
    110102  }
    111 #if M0036_RC_IMPROVEMENT
    112103  else if ( m_seqTargetBpp < 0.2 )
    113104  {
     
    125116    m_betaUpdate  = 0.2;
    126117  }
    127 #else
    128   else
    129   {
    130     m_alphaUpdate = 0.1;
    131     m_betaUpdate  = 0.05;
    132   }
    133 #endif
    134118  m_averageBits     = (Int)(m_targetBits / totalFrames);
    135119  Int picWidthInBU  = ( m_picWidth  % m_LCUWidth  ) == 0 ? m_picWidth  / m_LCUWidth  : m_picWidth  / m_LCUWidth  + 1;
     
    172156  m_framesLeft = m_totalFrames;
    173157  m_bitsLeft   = m_targetBits;
    174 #if M0036_RC_IMPROVEMENT
    175158  m_adaptiveBit = adaptiveBit;
    176159  m_lastLambda = 0.0;
    177 #endif
    178160}
    179161
     
    233215    for ( Int i=0; i<m_numberOfLevel; i++ )
    234216    {
    235 #if RATE_CONTROL_INTRA
    236217      if (i>0)
    237218      {
     
    244225        m_picPara[i].m_beta  = BETA2;
    245226      }
    246 #else
    247       m_picPara[i].m_alpha = 3.2003;
    248       m_picPara[i].m_beta  = -1.367;
    249 #endif
    250227    }
    251228  }
     
    271248      for ( Int j=0; j<m_numberOfLCU; j++)
    272249      {
    273 #if RATE_CONTROL_INTRA
    274250        m_LCUPara[i][j].m_alpha = m_picPara[i].m_alpha;
    275251        m_LCUPara[i][j].m_beta  = m_picPara[i].m_beta;
    276 #else
    277         m_LCUPara[i][j].m_alpha = 3.2003;
    278         m_LCUPara[i][j].m_beta  = -1.367;
    279 #endif
    280252      }
    281253    }
     
    299271}
    300272
    301 #if !RATE_CONTROL_INTRA
    302 Int TEncRCSeq::getRefineBitsForIntra( Int orgBits )
    303 {
    304   Double bpp = ( (Double)orgBits ) / m_picHeight / m_picHeight;
    305   if ( bpp > 0.2 )
    306   {
    307     return orgBits * 5;
    308   }
    309   if ( bpp > 0.1 )
    310   {
    311     return orgBits * 7;
    312   }
    313   return orgBits * 10;
    314 }
    315 #endif
    316 
    317 #if M0036_RC_IMPROVEMENT
    318273Void TEncRCSeq::setAllBitRatio( Double basicLambda, Double* equaCoeffA, Double* equaCoeffB )
    319274{
     
    326281  delete[] bitsRatio;
    327282}
    328 #endif
    329283
    330284//GOP level
     
    349303  Int targetBits = xEstGOPTargetBits( encRCSeq, numPic );
    350304
    351 #if M0036_RC_IMPROVEMENT
    352305  if ( encRCSeq->getAdaptiveBits() > 0 && encRCSeq->getLastLambda() > 0.1 )
    353306  {
     
    409362    delete []equaCoeffB;
    410363  }
    411 #endif
    412364
    413365  m_picTargetBitInGOP = new Int[numPic];
     
    422374  {
    423375    currPicRatio = encRCSeq->getBitRatio( i );
    424 #if M0036_RC_IMPROVEMENT
    425376    m_picTargetBitInGOP[i] = (Int)( ((Double)targetBits) * currPicRatio / totalPicRatio );
    426 #else
    427     m_picTargetBitInGOP[i] = targetBits * currPicRatio / totalPicRatio;
    428 #endif
    429377  }
    430378
     
    436384}
    437385
    438 #if M0036_RC_IMPROVEMENT
    439386Void TEncRCGOP::xCalEquaCoeff( TEncRCSeq* encRCSeq, Double* lambdaRatio, Double* equaCoeffA, Double* equaCoeffB, Int GOPSize )
    440387{
     
    482429  return solution;
    483430}
    484 #endif
    485431
    486432Void TEncRCGOP::destroy()
     
    534480
    535481  m_LCUs         = NULL;
    536 #if !M0036_RC_IMPROVEMENT
    537   m_lastPicture  = NULL;
    538 #endif
    539 
    540482#if KWU_RC_MADPRED_E0227
    541483  m_lastIVPicture = NULL;
     
    543485
    544486  m_picActualHeaderBits = 0;
    545 #if !M0036_RC_IMPROVEMENT
    546   m_totalMAD            = 0.0;
    547 #endif
    548487  m_picActualBits       = 0;
    549488  m_picQP               = 0;
     
    574513  }
    575514
    576 #if M0036_RC_IMPROVEMENT
    577515  targetBits  = Int( ((Double)GOPbitsLeft) * currPicRatio / totalPicRatio );
    578 #else
    579   targetBits  = Int( GOPbitsLeft * currPicRatio / totalPicRatio );
    580 #endif
    581516
    582517  if ( targetBits < 100 )
     
    691626      m_LCUs[LCUIdx].m_lambda     = 0.0;
    692627      m_LCUs[LCUIdx].m_targetBits = 0;
    693 #if M0036_RC_IMPROVEMENT
    694628      m_LCUs[LCUIdx].m_bitWeight  = 1.0;
    695 #else
    696       m_LCUs[LCUIdx].m_MAD        = 0.0;
    697 #endif
    698629      Int currWidth  = ( (i == picWidthInLCU -1) ? picWidth  - LCUWidth *(picWidthInLCU -1) : LCUWidth  );
    699630      Int currHeight = ( (j == picHeightInLCU-1) ? picHeight - LCUHeight*(picHeightInLCU-1) : LCUHeight );
     
    708639  }
    709640  m_picActualHeaderBits = 0;
    710 #if !M0036_RC_IMPROVEMENT
    711   m_totalMAD            = 0.0;
    712 #endif
    713641  m_picActualBits       = 0;
    714642  m_picQP               = 0;
     
    723651
    724652
    725 #if !M0036_RC_IMPROVEMENT
    726   m_lastPicture = NULL;
    727   list<TEncRCPic*>::reverse_iterator it;
    728   for ( it = listPreviousPictures.rbegin(); it != listPreviousPictures.rend(); it++ )
    729   {
    730     if ( (*it)->getFrameLevel() == m_frameLevel )
    731     {
    732       m_lastPicture = (*it);
    733       break;
    734     }
    735   }
    736 #endif
    737 
    738653#if KWU_RC_MADPRED_E0227
    739654  list<TEncRCPic*>::reverse_iterator it;
     
    775690
    776691
    777 #if RATE_CONTROL_INTRA
    778692Double TEncRCPic::estimatePicLambda( list<TEncRCPic*>& listPreviousPictures, SliceType eSliceType)
    779 #else
    780 Double TEncRCPic::estimatePicLambda( list<TEncRCPic*>& listPreviousPictures )
    781 #endif
    782693{
    783694  Double alpha         = m_encRCSeq->getPicPara( m_frameLevel ).m_alpha;
    784695  Double beta          = m_encRCSeq->getPicPara( m_frameLevel ).m_beta;
    785696  Double bpp       = (Double)m_targetBits/(Double)m_numberOfPixel;
    786 #if RATE_CONTROL_INTRA
    787697  Double estLambda;
    788698  if (eSliceType == I_SLICE)
     
    794704    estLambda = alpha * pow( bpp, beta );
    795705  }
    796 #else
    797   Double estLambda = alpha * pow( bpp, beta );
    798 #endif 
    799706 
    800707  Double lastLevelLambda = -1.0;
     
    844751  m_estPicLambda = estLambda;
    845752
    846 #if M0036_RC_IMPROVEMENT
    847753  Double totalWeight = 0.0;
    848754  // initial BU bit allocation weight
    849755  for ( Int i=0; i<m_numberOfLCU; i++ )
    850756  {
    851 #if RC_FIX
    852757    Double alphaLCU, betaLCU;
    853758    if ( m_encRCSeq->getUseLCUSeparateModel() )
     
    861766      betaLCU  = m_encRCSeq->getPicPara( m_frameLevel ).m_beta;
    862767    }
    863 #else
    864     Double alphaLCU = m_encRCSeq->getLCUPara( m_frameLevel, i ).m_alpha;
    865     Double betaLCU  = m_encRCSeq->getLCUPara( m_frameLevel, i ).m_beta;
    866 #endif
    867768
    868769    m_LCUs[i].m_bitWeight =  m_LCUs[i].m_numberOfPixel * pow( estLambda/alphaLCU, 1.0/betaLCU );
     
    879780    m_LCUs[i].m_bitWeight = BUTargetBits;
    880781  }
    881 #endif
    882782
    883783  return estLambda;
     
    989889
    990890
    991 #if RATE_CONTROL_INTRA
    992891Double TEncRCPic::getLCUTargetBpp(SliceType eSliceType) 
    993 #else
    994 Double TEncRCPic::getLCUTargetBpp()
    995 #endif
     892{
     893  Int   LCUIdx    = getLCUCoded();
     894  Double bpp      = -1.0;
     895  Int avgBits     = 0;
     896
     897  if (eSliceType == I_SLICE)
     898  {
     899    Int noOfLCUsLeft = m_numberOfLCU - LCUIdx + 1;
     900    Int bitrateWindow = min(4,noOfLCUsLeft);
     901    Double MAD      = getLCU(LCUIdx).m_costIntra;
     902
     903    if (m_remainingCostIntra > 0.1 )
     904    {
     905      Double weightedBitsLeft = (m_bitsLeft*bitrateWindow+(m_bitsLeft-getLCU(LCUIdx).m_targetBitsLeft)*noOfLCUsLeft)/(Double)bitrateWindow;
     906      avgBits = Int( MAD*weightedBitsLeft/m_remainingCostIntra );
     907    }
     908    else
     909    {
     910      avgBits = Int( m_bitsLeft / m_LCULeft );
     911    }
     912    m_remainingCostIntra -= MAD;
     913  }
     914  else
     915  {
     916  Double totalWeight = 0;
     917  for ( Int i=LCUIdx; i<m_numberOfLCU; i++ )
     918  {
     919    totalWeight += m_LCUs[i].m_bitWeight;
     920  }
     921  Int realInfluenceLCU = min( g_RCLCUSmoothWindowSize, getLCULeft() );
     922  avgBits = (Int)( m_LCUs[LCUIdx].m_bitWeight - ( totalWeight - m_bitsLeft ) / realInfluenceLCU + 0.5 );
     923  }
     924
     925  if ( avgBits < 1 )
     926  {
     927    avgBits = 1;
     928  }
     929
     930  bpp = ( Double )avgBits/( Double )m_LCUs[ LCUIdx ].m_numberOfPixel;
     931  m_LCUs[ LCUIdx ].m_targetBits = avgBits;
     932
     933  return bpp;
     934}
     935
     936
     937#if KWU_RC_MADPRED_E0227
     938Double TEncRCPic::getLCUTargetBppforInterView( list<TEncRCPic*>& listPreviousPictures, TComDataCU* pcCU, Double basePos, Double curPos, Double focalLen, Double znear, Double zfar, Int direction, Int* disparity )
    996939{
    997940  Int   LCUIdx    = getLCUCoded();
     
    1003946#endif
    1004947
    1005 #if RATE_CONTROL_INTRA
    1006   if (eSliceType == I_SLICE){
    1007     Int noOfLCUsLeft = m_numberOfLCU - LCUIdx + 1;
    1008     Int bitrateWindow = min(4,noOfLCUsLeft);
    1009     Double MAD      = getLCU(LCUIdx).m_costIntra;
    1010 
    1011     if (m_remainingCostIntra > 0.1 )
    1012     {
    1013       Double weightedBitsLeft = (m_bitsLeft*bitrateWindow+(m_bitsLeft-getLCU(LCUIdx).m_targetBitsLeft)*noOfLCUsLeft)/(Double)bitrateWindow;
    1014       avgBits = Int( MAD*weightedBitsLeft/m_remainingCostIntra );
    1015     }
    1016     else
    1017     {
    1018       avgBits = Int( m_bitsLeft / m_LCULeft );
    1019     }
    1020     m_remainingCostIntra -= MAD;
    1021   }
    1022   else
    1023   {
    1024 #endif
    1025 #if M0036_RC_IMPROVEMENT
    1026   Double totalWeight = 0;
    1027   for ( Int i=LCUIdx; i<m_numberOfLCU; i++ )
    1028   {
    1029     totalWeight += m_LCUs[i].m_bitWeight;
    1030   }
    1031   Int realInfluenceLCU = min( g_RCLCUSmoothWindowSize, getLCULeft() );
    1032   avgBits = (Int)( m_LCUs[LCUIdx].m_bitWeight - ( totalWeight - m_bitsLeft ) / realInfluenceLCU + 0.5 );
    1033 #else
    1034   if ( m_lastPicture == NULL )
    1035   {
    1036     avgBits = Int( m_bitsLeft / m_LCULeft );
    1037   }
    1038   else
    1039   {
    1040     MAD = m_lastPicture->getLCU(LCUIdx).m_MAD;
    1041     totalMAD = m_lastPicture->getTotalMAD();
    1042     for ( Int i=0; i<LCUIdx; i++ )
    1043     {
    1044       totalMAD -= m_lastPicture->getLCU(i).m_MAD;
    1045     }
    1046 
    1047     if ( totalMAD > 0.1 )
    1048     {
    1049       avgBits = Int( m_bitsLeft * MAD / totalMAD );
    1050     }
    1051     else
    1052     {
    1053       avgBits = Int( m_bitsLeft / m_LCULeft );
    1054     }
    1055   }
    1056 #endif
    1057 #if RATE_CONTROL_INTRA
    1058   }
    1059 #endif
    1060 
    1061   if ( avgBits < 1 )
    1062   {
    1063     avgBits = 1;
    1064   }
    1065 
    1066   bpp = ( Double )avgBits/( Double )m_LCUs[ LCUIdx ].m_numberOfPixel;
    1067   m_LCUs[ LCUIdx ].m_targetBits = avgBits;
    1068 
    1069   return bpp;
    1070 }
    1071 
    1072 
    1073 #if KWU_RC_MADPRED_E0227
    1074 Double TEncRCPic::getLCUTargetBppforInterView( list<TEncRCPic*>& listPreviousPictures, TComDataCU* pcCU, Double basePos, Double curPos, Double focalLen, Double znear, Double zfar, Int direction, Int* disparity )
    1075 {
    1076   Int   LCUIdx    = getLCUCoded();
    1077   Double bpp      = -1.0;
    1078   Int avgBits     = 0;
    1079 #if !M0036_RC_IMPROVEMENT
    1080   Double totalMAD = -1.0;
    1081   Double MAD      = -1.0;
    1082 #endif
    1083 
    1084948  Double totalMAD = -1.0;
    1085949  Double MAD      = -1.0;
     
    13001164    beta  *= ( 1.0 - m_encRCSeq->getBetaUpdate() / 2.0 );
    13011165
    1302 #if M0036_RC_IMPROVEMENT
    13031166    alpha = Clip3( g_RCAlphaMinValue, g_RCAlphaMaxValue, alpha );
    13041167    beta  = Clip3( g_RCBetaMinValue,  g_RCBetaMaxValue,  beta  );
    1305 #else
    1306     alpha = Clip3( 0.05, 20.0, alpha );
    1307     beta  = Clip3( -3.0, -0.1, beta  );
    1308 #endif
    13091168
    13101169    TRCParameter rcPara;
     
    13191178  alpha += m_encRCSeq->getAlphaUpdate() * ( log( inputLambda ) - log( calLambda ) ) * alpha;
    13201179  double lnbpp = log( bpp );
    1321 #if M0036_RC_IMPROVEMENT
    13221180  lnbpp = Clip3( -5.0, -0.1, lnbpp );
    1323 #else
    1324   lnbpp = Clip3( -5.0, 1.0, lnbpp );
    1325 #endif
    13261181  beta  += m_encRCSeq->getBetaUpdate() * ( log( inputLambda ) - log( calLambda ) ) * lnbpp;
    13271182
    1328 #if M0036_RC_IMPROVEMENT
    13291183  alpha = Clip3( g_RCAlphaMinValue, g_RCAlphaMaxValue, alpha );
    13301184  beta  = Clip3( g_RCBetaMinValue,  g_RCBetaMaxValue,  beta  );
    1331 #else
    1332   alpha = Clip3( 0.05, 20.0, alpha );
    1333   beta  = Clip3( -3.0, -0.1, beta  );
    1334 #endif
    13351185  TRCParameter rcPara;
    13361186  rcPara.m_alpha = alpha;
     
    13401190}
    13411191
    1342 #if !M0036_RC_IMPROVEMENT
    1343 Double TEncRCPic::getEffectivePercentage()
    1344 {
    1345   Int effectivePiexels = 0;
    1346   Int totalPixels = 0;
    1347 
    1348   for ( Int i=0; i<m_numberOfLCU; i++ )
    1349   {
    1350     totalPixels += m_LCUs[i].m_numberOfPixel;
    1351     if ( m_LCUs[i].m_QP > 0 )
    1352     {
    1353       effectivePiexels += m_LCUs[i].m_numberOfPixel;
    1354     }
    1355   }
    1356 
    1357   Double effectivePixelPercentage = (Double)effectivePiexels/(Double)totalPixels;
    1358   return effectivePixelPercentage;
    1359 }
    1360 #endif
    1361 
    13621192Double TEncRCPic::calAverageQP()
    13631193{
     
    14141244}
    14151245
    1416 #if M0036_RC_IMPROVEMENT
    1417 #if RATE_CONTROL_INTRA
    14181246Void TEncRCPic::updateAfterPicture( Int actualHeaderBits, Int actualTotalBits, Double averageQP, Double averageLambda, SliceType eSliceType)
    1419 #else
    1420 Void TEncRCPic::updateAfterPicture( Int actualHeaderBits, Int actualTotalBits, Double averageQP, Double averageLambda )
    1421 #endif
    1422 #else
    1423 Void TEncRCPic::updateAfterPicture( Int actualHeaderBits, Int actualTotalBits, Double averageQP, Double averageLambda, Double effectivePercentage )
    1424 #endif
    14251247{
    14261248  m_picActualHeaderBits = actualHeaderBits;
     
    14351257  }
    14361258  m_picLambda           = averageLambda;
    1437 #if !M0036_RC_IMPROVEMENT || KWU_RC_MADPRED_E0227
    14381259#if KWU_RC_MADPRED_E0227
    14391260  m_totalMAD = 0;
    1440 #endif
    14411261  for ( Int i=0; i<m_numberOfLCU; i++ )
    14421262  {
     
    14471267  Double alpha = m_encRCSeq->getPicPara( m_frameLevel ).m_alpha;
    14481268  Double beta  = m_encRCSeq->getPicPara( m_frameLevel ).m_beta;
    1449 #if RATE_CONTROL_INTRA
    14501269  if (eSliceType == I_SLICE)
    14511270  {
     
    14541273  else
    14551274  {
    1456 #endif
    14571275  // update parameters
    14581276  Double picActualBits = ( Double )m_picActualBits;
     
    14611279  Double inputLambda   = m_picLambda;
    14621280
    1463 #if M0036_RC_IMPROVEMENT
    14641281  if ( inputLambda < 0.01 || calLambda < 0.01 || picActualBpp < 0.0001 )
    1465 #else
    1466   if ( inputLambda < 0.01 || calLambda < 0.01 || picActualBpp < 0.0001 || effectivePercentage < 0.05 )
    1467 #endif
    14681282  {
    14691283    alpha *= ( 1.0 - m_encRCSeq->getAlphaUpdate() / 2.0 );
    14701284    beta  *= ( 1.0 - m_encRCSeq->getBetaUpdate() / 2.0 );
    14711285
    1472 #if M0036_RC_IMPROVEMENT
    14731286    alpha = Clip3( g_RCAlphaMinValue, g_RCAlphaMaxValue, alpha );
    14741287    beta  = Clip3( g_RCBetaMinValue,  g_RCBetaMaxValue,  beta  );
    1475 #else
    1476     alpha = Clip3( 0.05, 20.0, alpha );
    1477     beta  = Clip3( -3.0, -0.1, beta  );
    1478 #endif
    14791288    TRCParameter rcPara;
    14801289    rcPara.m_alpha = alpha;
     
    14881297  alpha += m_encRCSeq->getAlphaUpdate() * ( log( inputLambda ) - log( calLambda ) ) * alpha;
    14891298  double lnbpp = log( picActualBpp );
    1490 #if M0036_RC_IMPROVEMENT
    14911299  lnbpp = Clip3( -5.0, -0.1, lnbpp );
    1492 #else
    1493   lnbpp = Clip3( -5.0, 1.0, lnbpp );
    1494 #endif
    14951300  beta  += m_encRCSeq->getBetaUpdate() * ( log( inputLambda ) - log( calLambda ) ) * lnbpp;
    14961301
    1497 #if M0036_RC_IMPROVEMENT
    14981302  alpha = Clip3( g_RCAlphaMinValue, g_RCAlphaMaxValue, alpha );
    14991303  beta  = Clip3( g_RCBetaMinValue,  g_RCBetaMaxValue,  beta  );
    1500 #else
    1501   alpha = Clip3( 0.05, 20.0, alpha );
    1502   beta  = Clip3( -3.0, -0.1, beta  );
    1503 #endif
    1504 #if RATE_CONTROL_INTRA
    1505   }
    1506 #endif
     1304  }
    15071305
    15081306  TRCParameter rcPara;
     
    15121310  m_encRCSeq->setPicPara( m_frameLevel, rcPara );
    15131311
    1514 #if M0036_RC_IMPROVEMENT
    15151312  if ( m_frameLevel == 1 )
    15161313  {
     
    15191316    m_encRCSeq->setLastLambda( updateLastLambda );
    15201317  }
    1521 #endif
    1522 }
    1523 
    1524 #if RATE_CONTROL_INTRA
     1318}
     1319
    15251320Int TEncRCPic::getRefineBitsForIntra( Int orgBits )
    15261321{
     
    16111406  return estLambda;
    16121407}
    1613 #endif
    16141408
    16151409TEncRateCtrl::TEncRateCtrl()
     
    16451439}
    16461440
    1647 #if M0036_RC_IMPROVEMENT
    16481441#if KWU_RC_MADPRED_E0227
    16491442Void TEncRateCtrl::init( Int totalFrames, Int targetBitrate, Int frameRate, Int GOPSize, Int picWidth, Int picHeight, Int LCUWidth, Int LCUHeight, Bool keepHierBits, Bool useLCUSeparateModel, GOPEntry  GOPList[MAX_GOP], Int layerID )
     
    16511444Void TEncRateCtrl::init( Int totalFrames, Int targetBitrate, Int frameRate, Int GOPSize, Int picWidth, Int picHeight, Int LCUWidth, Int LCUHeight, Int keepHierBits, Bool useLCUSeparateModel, GOPEntry  GOPList[MAX_GOP] )
    16521445#endif
    1653 #else
    1654 Void TEncRateCtrl::init( Int totalFrames, Int targetBitrate, Int frameRate, Int GOPSize, Int picWidth, Int picHeight, Int LCUWidth, Int LCUHeight, Bool keepHierBits, Bool useLCUSeparateModel, GOPEntry  GOPList[MAX_GOP] )
    1655 #endif
    16561446{
    16571447  destroy();
     
    16681458
    16691459  Int numberOfLevel = 1;
    1670 #if M0036_RC_IMPROVEMENT
    16711460  Int adaptiveBit = 0;
    16721461  if ( keepHierBits > 0 )
    1673 #else
    1674   if ( keepHierBits )
    1675 #endif
    16761462  {
    16771463    numberOfLevel = Int( log((Double)GOPSize)/log(2.0) + 0.5 ) + 1;
     
    16961482  }
    16971483
    1698 #if M0036_RC_IMPROVEMENT
    16991484  if ( keepHierBits > 0 )
    1700 #else
    1701   if ( keepHierBits )
    1702 #endif
    17031485  {
    17041486    Double bpp = (Double)( targetBitrate / (Double)( frameRate*picWidth*picHeight ) );
     
    17331515        bitsRatio[3] = 14;
    17341516      }
    1735 #if M0036_RC_IMPROVEMENT
    17361517      if ( keepHierBits == 2 )
    17371518      {
    17381519        adaptiveBit = 1;
    17391520      }
    1740 #endif
    17411521    }
    17421522    else if ( GOPSize == 8 && !isLowdelay )
     
    17861566        bitsRatio[7] = 1;
    17871567      }
    1788 #if M0036_RC_IMPROVEMENT
    17891568      if ( keepHierBits == 2 )
    17901569      {
    17911570        adaptiveBit = 2;
    17921571      }
    1793 #endif
    17941572    }
    17951573    else
    17961574    {
    1797 #if M0036_RC_IMPROVEMENT
    17981575      printf( "\n hierarchical bit allocation is not support for the specified coding structure currently.\n" );
    1799 #else
    1800       printf( "\n hierarchical bit allocation is not support for the specified coding structure currently." );
    1801 #endif
    18021576    }
    18031577  }
     
    18121586    }
    18131587  }
    1814 #if M0036_RC_IMPROVEMENT
    18151588  if ( keepHierBits > 0 )
    1816 #else
    1817   if ( keepHierBits )
    1818 #endif
    18191589  {
    18201590    if ( GOPSize == 4 && isLowdelay )
     
    18511621
    18521622  m_encRCSeq = new TEncRCSeq;
    1853 #if M0036_RC_IMPROVEMENT
    18541623  m_encRCSeq->create( totalFrames, targetBitrate, frameRate, GOPSize, picWidth, picHeight, LCUWidth, LCUHeight, numberOfLevel, useLCUSeparateModel, adaptiveBit );
    1855 #else
    1856   m_encRCSeq->create( totalFrames, targetBitrate, frameRate, GOPSize, picWidth, picHeight, LCUWidth, LCUHeight, numberOfLevel, useLCUSeparateModel );
    1857 #endif
    18581624  m_encRCSeq->initBitsRatio( bitsRatio );
    18591625  m_encRCSeq->initGOPID2Level( GOPID2Level );
  • branches/HTM-10.0rc1-dev0/source/Lib/TLibEncoder/TEncRateCtrl.h

    r655 r837  
    44 * granted under this license. 
    55 *
    6  * Copyright (c) 2010-2013, ITU/ISO/IEC
     6* Copyright (c) 2010-2014, ITU/ISO/IEC
    77 * All rights reserved.
    88 *
     
    5555//! \{
    5656
    57 #if RATE_CONTROL_LAMBDA_DOMAIN
    5857#include "../TLibEncoder/TEncCfg.h"
    5958#include <list>
     
    6564const Double g_RCWeightPicTargetBitInGOP    = 0.9;
    6665const Double g_RCWeightPicRargetBitInBuffer = 1.0 - g_RCWeightPicTargetBitInGOP;
    67 #if M0036_RC_IMPROVEMENT
    6866const Int g_RCIterationNum = 20;
    6967const Double g_RCWeightHistoryLambda = 0.5;
     
    7472const Double g_RCBetaMinValue  = -3.0;
    7573const Double g_RCBetaMaxValue  = -0.1;
    76 #endif
    77 
    78 #if RATE_CONTROL_INTRA
     74
    7975#define ALPHA     6.7542;
    8076#define BETA1     1.2517
    8177#define BETA2     1.7860
    82 #endif
    8378
    8479struct TRCLCU
     
    8883  Int m_targetBits;
    8984  Double m_lambda;
    90 #if M0036_RC_IMPROVEMENT
    9185  Double m_bitWeight;
    92 #else
    93   Double m_MAD;
    94 #endif
    9586  Int m_numberOfPixel;
    96 #if RATE_CONTROL_INTRA
    9787  Double m_costIntra;
    9888  Int m_targetBitsLeft;
    99 #endif
    100 
    10189#if KWU_RC_MADPRED_E0227
    10290  Double m_MAD;
    103 
    10491  Int m_CUWidth;
    10592  Int m_CUHeight;
     
    121108
    122109public:
    123 #if M0036_RC_IMPROVEMENT
    124110  Void create( Int totalFrames, Int targetBitrate, Int frameRate, Int GOPSize, Int picWidth, Int picHeight, Int LCUWidth, Int LCUHeight, Int numberOfLevel, Bool useLCUSeparateModel, Int adaptiveBit );
    125 #else
    126   Void create( Int totalFrames, Int targetBitrate, Int frameRate, Int GOPSize, Int picWidth, Int picHeight, Int LCUWidth, Int LCUHeight, Int numberOfLevel, Bool useLCUSeparateModel );
    127 #endif
    128111  Void destroy();
    129112  Void initBitsRatio( Int bitsRatio[] );
     
    132115  Void initLCUPara( TRCParameter** LCUPara = NULL );    // NULL to initial with default value
    133116  Void updateAfterPic ( Int bits );
    134 #if !RATE_CONTROL_INTRA
    135   Int  getRefineBitsForIntra( Int orgBits );
    136 #endif
    137 #if M0036_RC_IMPROVEMENT
    138117  Void setAllBitRatio( Double basicLambda, Double* equaCoeffA, Double* equaCoeffB );
    139 #endif
    140118
    141119public:
     
    175153  Double getBetaUpdate()                { return m_betaUpdate; }
    176154
    177 #if M0036_RC_IMPROVEMENT
    178155  Int    getAdaptiveBits()              { return m_adaptiveBit;  }
    179156  Double getLastLambda()                { return m_lastLambda;   }
    180157  Void   setLastLambda( Double lamdba ) { m_lastLambda = lamdba; }
    181 #endif
    182158
    183159private:
     
    208184  Bool m_useLCUSeparateModel;
    209185
    210 #if M0036_RC_IMPROVEMENT
    211186  Int m_adaptiveBit;
    212187  Double m_lastLambda;
    213 #endif
    214188};
    215189
     
    227201private:
    228202  Int  xEstGOPTargetBits( TEncRCSeq* encRCSeq, Int GOPSize );
    229 #if M0036_RC_IMPROVEMENT
    230203  Void   xCalEquaCoeff( TEncRCSeq* encRCSeq, Double* lambdaRatio, Double* equaCoeffA, Double* equaCoeffB, Int GOPSize );
    231204  Double xSolveEqua( Double targetBpp, Double* equaCoeffA, Double* equaCoeffB, Int GOPSize );
    232 #endif
    233205
    234206public:
     
    266238  Double estimatePicLambdaIV( list<TEncRCPic*>& listPreviousPictures, Int curPOC );
    267239#endif
    268 #if !RATE_CONTROL_INTRA
    269   Double estimatePicLambda( list<TEncRCPic*>& listPreviousPictures );
    270 #endif
    271240  Int    estimatePicQP    ( Double lambda, list<TEncRCPic*>& listPreviousPictures );
    272 #if RATE_CONTROL_INTRA
    273241  Int    getRefineBitsForIntra(Int orgBits);
    274242  Double calculateLambdaIntra(double alpha, double beta, double MADPerPixel, double bitsPerPixel);
     
    279247  Double getLCUTargetBpp(SliceType eSliceType);
    280248  Double getLCUEstLambdaAndQP(Double bpp, Int clipPicQP, Int *estQP);
    281 #else
    282   Double getLCUTargetBpp();
    283 #endif
    284 
    285249#if KWU_RC_MADPRED_E0227
    286250  Double getLCUTargetBppforInterView( list<TEncRCPic*>& listPreviousPictures, TComDataCU* pcCU, Double basePos, Double curPos, Double focalLen, Double znear, Double zfar, Int direction, Int* disparity );
    287251#endif
    288 
    289252  Double getLCUEstLambda( Double bpp );
    290253  Int    getLCUEstQP( Double lambda, Int clipPicQP );
    291254
    292255  Void updateAfterLCU( Int LCUIdx, Int bits, Int QP, Double lambda, Bool updateLCUParameter = true );
    293 #if M0036_RC_IMPROVEMENT
    294 #if RATE_CONTROL_INTRA
    295256  Void updateAfterPicture( Int actualHeaderBits, Int actualTotalBits, Double averageQP, Double averageLambda, SliceType eSliceType);
    296 #else
    297   Void updateAfterPicture( Int actualHeaderBits, Int actualTotalBits, Double averageQP, Double averageLambda );
    298 #endif
    299 #else
    300   Void updateAfterPicture( Int actualHeaderBits, Int actualTotalBits, Double averageQP, Double averageLambda, Double effectivePercentage );
    301 #endif
    302257
    303258  Void addToPictureLsit( list<TEncRCPic*>& listPreviousPictures );
    304 
    305259#if KWU_RC_MADPRED_E0227
    306260  Void addToPictureLsitIV( list<TEncRCPic*>& listPreviousPictures );
    307261  Void setIVPic( TEncRCPic* baseRCPic );
    308 #endif
    309 
    310 #if !M0036_RC_IMPROVEMENT
    311   Double getEffectivePercentage();
    312262#endif
    313263  Double calAverageQP();
     
    326276  Int  getNumberOfLCU()                                   { return m_numberOfLCU; }
    327277  Int  getTargetBits()                                    { return m_targetBits; }
    328 #if !RATE_CONTROL_INTRA
    329   Void setTargetBits( Int bits )                          { m_targetBits = bits; }
    330 #endif
    331278  Int  getEstHeaderBits()                                 { return m_estHeaderBits; }
    332279  Int  getLCULeft()                                       { return m_LCULeft; }
     
    338285  TRCLCU& getLCU( Int LCUIdx )                            { return m_LCUs[LCUIdx]; }
    339286  Int  getPicActualHeaderBits()                           { return m_picActualHeaderBits; }
    340 #if !M0036_RC_IMPROVEMENT
    341   Double getTotalMAD()                                    { return m_totalMAD; }
    342   Void   setTotalMAD( Double MAD )                        { m_totalMAD = MAD; }
    343 #endif
    344 #if RATE_CONTROL_INTRA
    345287  Void setTargetBits( Int bits )                          { m_targetBits = bits; m_bitsLeft = bits;}
    346288  Void setTotalIntraCost(Double cost)                     { m_totalCostIntra = cost; }
    347289  Void getLCUInitTargetBits();
    348 #endif
    349 
    350290#if KWU_RC_MADPRED_E0227
    351291  Double getTotalMAD()                                    { return m_totalMAD; }
     
    368308  Void setLayerID(Int layerid)                              { m_LayerID = layerid; }
    369309#endif
    370 
    371310private:
    372311  TEncRCSeq* m_encRCSeq;
     
    390329  Double m_totalMAD;
    391330#endif
    392 #if RATE_CONTROL_INTRA
    393331  Double m_totalCostIntra;
    394332  Double m_remainingCostIntra;
    395 #endif
    396333  Int m_picActualBits;          // the whole picture, including header
    397334  Int m_picQP;                  // in integer form
    398335  Double m_picLambda;
    399 #if !M0036_RC_IMPROVEMENT
    400   TEncRCPic* m_lastPicture;
    401 #endif
    402 
    403336#if KWU_RC_MADPRED_E0227
    404337  Double m_totalMAD;
     
    417350
    418351public:
    419 #if M0036_RC_IMPROVEMENT
    420352#if KWU_RC_MADPRED_E0227
    421353  Void init( Int totalFrames, Int targetBitrate, Int frameRate, Int GOPSize, Int picWidth, Int picHeight, Int LCUWidth, Int LCUHeight, Bool keepHierBits, Bool useLCUSeparateModel, GOPEntry GOPList[MAX_GOP], Int layerID );
    422354#else
    423355  Void init( Int totalFrames, Int targetBitrate, Int frameRate, Int GOPSize, Int picWidth, Int picHeight, Int LCUWidth, Int LCUHeight, Int keepHierBits, Bool useLCUSeparateModel, GOPEntry GOPList[MAX_GOP] );
    424 #endif
    425 #else
    426   Void init( Int totalFrames, Int targetBitrate, Int frameRate, Int GOPSize, Int picWidth, Int picHeight, Int LCUWidth, Int LCUHeight, Bool keepHierBits, Bool useLCUSeparateModel, GOPEntry GOPList[MAX_GOP] );
    427356#endif
    428357  Void destroy();
     
    443372  Void setLayerID(Int layerid)     { m_LayerID = layerid; }
    444373#endif
    445 
    446374private:
    447375  TEncRCSeq* m_encRCSeq;
     
    450378  list<TEncRCPic*> m_listRCPictures;
    451379  Int        m_RCQP;
    452 
    453380#if KWU_RC_MADPRED_E0227
    454381  Int m_LayerID;
     
    456383};
    457384
    458 #else
    459 
    460 // ====================================================================================================================
    461 // Class definition
    462 // ====================================================================================================================
    463 #define MAX_DELTA_QP    2
    464 #define MAX_CUDQP_DEPTH 0
    465 
    466 typedef struct FrameData
    467 {
    468   Bool       m_isReferenced;
    469   Int        m_qp;
    470   Int        m_bits;
    471   Double     m_costMAD;
    472 }FrameData;
    473 
    474 typedef struct LCUData
    475 {
    476   Int     m_qp;                ///<  coded QP
    477   Int     m_bits;              ///<  actually generated bits
    478   Int     m_pixels;            ///<  number of pixels for a unit
    479   Int     m_widthInPixel;      ///<  number of pixels for width
    480   Int     m_heightInPixel;     ///<  number of pixels for height
    481   Double  m_costMAD;           ///<  texture complexity for a unit
    482 }LCUData;
    483 
    484 class MADLinearModel
    485 {
    486 private:
    487   Bool   m_activeOn;
    488   Double m_paramY1;
    489   Double m_paramY2;
    490   Double m_costMADs[3];
    491 
    492 public:
    493   MADLinearModel ()   {};
    494   ~MADLinearModel()   {};
    495  
    496   Void    initMADLinearModel      ();
    497   Double  getMAD                  ();
    498   Void    updateMADLiearModel     ();
    499   Void    updateMADHistory        (Double costMAD);
    500   Bool    IsUpdateAvailable       ()              { return m_activeOn; }
    501 };
    502 
    503 class PixelBaseURQQuadraticModel
    504 {
    505 private:
    506   Double m_paramHighX1;
    507   Double m_paramHighX2;
    508   Double m_paramLowX1;
    509   Double m_paramLowX2;
    510 public:
    511   PixelBaseURQQuadraticModel () {};
    512   ~PixelBaseURQQuadraticModel() {};
    513 
    514   Void    initPixelBaseQuadraticModel       ();
    515   Int     getQP                             (Int qp, Int targetBits, Int numberOfPixels, Double costPredMAD);
    516   Void    updatePixelBasedURQQuadraticModel (Int qp, Int bits, Int numberOfPixels, Double costMAD);
    517   Bool    checkUpdateAvailable              (Int qpReference );
    518   Double  xConvertQP2QStep                  (Int qp );
    519   Int     xConvertQStep2QP                  (Double qStep );
    520 };
    521 
    522 class TEncRateCtrl
    523 {
    524 private:
    525   Bool            m_isLowdelay;
    526   Int             m_prevBitrate;
    527   Int             m_currBitrate;
    528   Int             m_frameRate;
    529   Int             m_refFrameNum;
    530   Int             m_nonRefFrameNum;
    531   Int             m_numOfPixels;
    532   Int             m_sourceWidthInLCU;
    533   Int             m_sourceHeightInLCU;     
    534   Int             m_sizeGOP;
    535   Int             m_indexGOP;
    536   Int             m_indexFrame;
    537   Int             m_indexLCU;
    538   Int             m_indexUnit;
    539   Int             m_indexRefFrame;
    540   Int             m_indexNonRefFrame;
    541   Int             m_indexPOCInGOP;
    542   Int             m_indexPrevPOCInGOP;
    543   Int             m_occupancyVB;
    544   Int             m_initialOVB;
    545   Int             m_targetBufLevel;
    546   Int             m_initialTBL;
    547   Int             m_remainingBitsInGOP;
    548   Int             m_remainingBitsInFrame;
    549   Int             m_occupancyVBInFrame;
    550   Int             m_targetBits;
    551   Int             m_numUnitInFrame;
    552   Int             m_codedPixels;
    553   Bool            m_activeUnitLevelOn;
    554   Double          m_costNonRefAvgWeighting;
    555   Double          m_costRefAvgWeighting;
    556   Double          m_costAvgbpp;         
    557  
    558   FrameData*      m_pcFrameData;
    559   LCUData*        m_pcLCUData;
    560 
    561   MADLinearModel              m_cMADLinearModel;
    562   PixelBaseURQQuadraticModel  m_cPixelURQQuadraticModel;
    563  
    564 public:
    565   TEncRateCtrl         () {};
    566   virtual ~TEncRateCtrl() {};
    567 
    568   Void          create                (Int sizeIntraPeriod, Int sizeGOP, Int frameRate, Int targetKbps, Int qp, Int numLCUInBasicUnit, Int sourceWidth, Int sourceHeight, Int maxCUWidth, Int maxCUHeight);
    569   Void          destroy               ();
    570 
    571   Void          initFrameData         (Int qp = 0);
    572   Void          initUnitData          (Int qp = 0);
    573   Int           getFrameQP            (Bool isReferenced, Int POC);
    574   Bool          calculateUnitQP       ();
    575   Int           getUnitQP             ()                                          { return m_pcLCUData[m_indexLCU].m_qp;  }
    576   Void          updateRCGOPStatus     ();
    577   Void          updataRCFrameStatus   (Int frameBits, SliceType eSliceType);
    578   Void          updataRCUnitStatus    ();
    579   Void          updateLCUData         (TComDataCU* pcCU, UInt64 actualLCUBits, Int qp);
    580 #if KWU_RC_MADPRED_E0227
    581   Void          updateLCUDataEnhancedView(TComDataCU* pcCU, UInt64 uiBits, Int qp, Double basePos, Double curPos, Double focalLen, Double znear, Double zfar, Int direction);
    582 #endif
    583   Void          updateFrameData       (UInt64 actualFrameBits);
    584   Double        xAdjustmentBits       (Int& reductionBits, Int& compensationBits);
    585   Int           getGOPId              ()                                          { return m_indexFrame; }
    586 };
    587 #endif
    588 
    589 #endif
    590 
    591 
     385#endif
     386
     387
  • branches/HTM-10.0rc1-dev0/source/Lib/TLibEncoder/TEncSampleAdaptiveOffset.cpp

    r608 r837  
    44 * granted under this license. 
    55 *
    6  * Copyright (c) 2010-2013, ITU/ISO/IEC
     6 * Copyright (c) 2010-2014, ITU/ISO/IEC
    77 * All rights reserved.
    88 *
     
    4545//! \{
    4646
    47 TEncSampleAdaptiveOffset::TEncSampleAdaptiveOffset()
    48 {
    49   m_pcEntropyCoder = NULL;
    50   m_pppcRDSbacCoder = NULL;
    51   m_pcRDGoOnSbacCoder = NULL;
    52   m_pppcBinCoderCABAC = NULL;           
    53   m_iCount = NULL;     
    54   m_iOffset = NULL;     
    55   m_iOffsetOrg = NULL; 
    56   m_iRate = NULL;       
    57   m_iDist = NULL;       
    58   m_dCost = NULL;       
    59   m_dCostPartBest = NULL;
    60   m_iDistOrg = NULL;     
    61   m_iTypePartBest = NULL;
    62 #if SAO_ENCODING_CHOICE_CHROMA
    63   m_depthSaoRate[0][0] = 0;
    64   m_depthSaoRate[0][1] = 0;
    65   m_depthSaoRate[0][2] = 0;
    66   m_depthSaoRate[0][3] = 0;
    67   m_depthSaoRate[1][0] = 0;
    68   m_depthSaoRate[1][1] = 0;
    69   m_depthSaoRate[1][2] = 0;
    70   m_depthSaoRate[1][3] = 0;
    71 #endif
    72 }
    73 TEncSampleAdaptiveOffset::~TEncSampleAdaptiveOffset()
    74 {
    75 
    76 }
    77 // ====================================================================================================================
    78 // Constants
    79 // ====================================================================================================================
    80 
    81 
    82 // ====================================================================================================================
    83 // Tables
    84 // ====================================================================================================================
    85 
    86 inline Double xRoundIbdi2(Int bitDepth, Double x)
    87 {
    88   return ((x)>0) ? (Int)(((Int)(x)+(1<<(bitDepth-8-1)))/(1<<(bitDepth-8))) : ((Int)(((Int)(x)-(1<<(bitDepth-8-1)))/(1<<(bitDepth-8))));
    89 }
    9047
    9148/** rounding with IBDI
    9249 * \param  x
    9350 */
     51inline Double xRoundIbdi2(Int bitDepth, Double x)
     52{
     53  return ((x)>0) ? (Int)(((Int)(x)+(1<<(bitDepth-8-1)))/(1<<(bitDepth-8))) : ((Int)(((Int)(x)-(1<<(bitDepth-8-1)))/(1<<(bitDepth-8))));
     54}
     55
    9456inline Double xRoundIbdi(Int bitDepth, Double x)
    9557{
     
    9860
    9961
    100 
    101 /** process SAO for one partition
    102  * \param  *psQTPart, iPartIdx, dLambda
    103  */
    104 Void TEncSampleAdaptiveOffset::rdoSaoOnePart(SAOQTPart *psQTPart, Int iPartIdx, Double dLambda, Int yCbCr)
    105 {
    106   Int iTypeIdx;
    107   Int iNumTotalType = MAX_NUM_SAO_TYPE;
    108   SAOQTPart*  pOnePart = &(psQTPart[iPartIdx]);
    109 
    110   Int64 iEstDist;
    111   Int iClassIdx;
    112   Int uiShift = 2 * DISTORTION_PRECISION_ADJUSTMENT((yCbCr == 0 ? g_bitDepthY : g_bitDepthC)-8);
    113   UInt uiDepth = pOnePart->PartLevel;
    114 
    115   m_iDistOrg [iPartIdx] =  0;
    116 
    117   Double  bestRDCostTableBo = MAX_DOUBLE;
    118   Int     bestClassTableBo    = 0;
    119   Int     currentDistortionTableBo[MAX_NUM_SAO_CLASS];
    120   Double  currentRdCostTableBo[MAX_NUM_SAO_CLASS];
    121 
    122   Int addr;
    123   Int allowMergeLeft;
    124   Int allowMergeUp;
    125   Int frameWidthInCU = m_pcPic->getFrameWidthInCU();
    126   SaoLcuParam  saoLcuParamRdo;
    127 
    128   for (iTypeIdx=-1; iTypeIdx<iNumTotalType; iTypeIdx++)
    129   {
    130     if( m_bUseSBACRD )
    131     {
    132       m_pcRDGoOnSbacCoder->load(m_pppcRDSbacCoder[uiDepth][CI_CURR_BEST]);
    133       m_pcRDGoOnSbacCoder->resetBits();
    134     }
    135     else
    136     {
    137       m_pcEntropyCoder->resetEntropy();
    138       m_pcEntropyCoder->resetBits();
    139     }
    140 
    141     iEstDist = 0;
    142 
    143     if (iTypeIdx == -1)
    144     {     
    145       for (Int ry = pOnePart->StartCUY; ry<= pOnePart->EndCUY; ry++)
    146       {
    147         for (Int rx = pOnePart->StartCUX; rx <= pOnePart->EndCUX; rx++)
    148         {
    149           addr = ry * frameWidthInCU + rx;         
    150 
    151           // get bits for iTypeIdx = -1
    152           allowMergeLeft = 1;
    153           allowMergeUp   = 1;
    154           if (rx != 0)
    155           {
    156             // check tile id and slice id
    157             if ( (m_pcPic->getPicSym()->getTileIdxMap(addr-1) != m_pcPic->getPicSym()->getTileIdxMap(addr)) || (m_pcPic->getCU(addr-1)->getSlice()->getSliceIdx() != m_pcPic->getCU(addr)->getSlice()->getSliceIdx()))
    158             {
    159               allowMergeLeft = 0;
    160             }
    161           }
    162           if (ry!=0)
    163           {
    164             if ( (m_pcPic->getPicSym()->getTileIdxMap(addr-m_iNumCuInWidth) != m_pcPic->getPicSym()->getTileIdxMap(addr)) || (m_pcPic->getCU(addr-m_iNumCuInWidth)->getSlice()->getSliceIdx() != m_pcPic->getCU(addr)->getSlice()->getSliceIdx()))
    165             {
    166               allowMergeUp = 0;
    167             }
    168           }
    169 
    170           // reset
    171           resetSaoUnit(&saoLcuParamRdo);
    172 
    173           // set merge flag
    174           saoLcuParamRdo.mergeUpFlag   = 1;
    175           saoLcuParamRdo.mergeLeftFlag = 1;
    176 
    177           if (ry == pOnePart->StartCUY)
    178           {
    179             saoLcuParamRdo.mergeUpFlag = 0;
    180           }
    181          
    182           if (rx == pOnePart->StartCUX)
    183           {
    184             saoLcuParamRdo.mergeLeftFlag = 0;
    185           }
    186 
    187           m_pcEntropyCoder->encodeSaoUnitInterleaving(yCbCr, 1, rx, ry,  &saoLcuParamRdo, 1,  1,  allowMergeLeft, allowMergeUp);
    188 
    189         }
    190       }
    191     }
    192 
    193     if (iTypeIdx>=0)
    194     {
    195       iEstDist = estSaoTypeDist(iPartIdx, iTypeIdx, uiShift, dLambda, currentDistortionTableBo, currentRdCostTableBo);
    196       if( iTypeIdx == SAO_BO )
    197       {
    198         // Estimate Best Position
    199         Double currentRDCost = 0.0;
    200 
    201         for(Int i=0; i< SAO_MAX_BO_CLASSES -SAO_BO_LEN +1; i++)
    202         {
    203           currentRDCost = 0.0;
    204           for(UInt uj = i; uj < i+SAO_BO_LEN; uj++)
    205           {
    206             currentRDCost += currentRdCostTableBo[uj];
    207           }
    208 
    209           if( currentRDCost < bestRDCostTableBo)
    210           {
    211             bestRDCostTableBo = currentRDCost;
    212             bestClassTableBo  = i;
    213           }
    214         }
    215 
    216         // Re code all Offsets
    217         // Code Center
    218         for(iClassIdx = bestClassTableBo; iClassIdx < bestClassTableBo+SAO_BO_LEN; iClassIdx++)
    219         {
    220           iEstDist += currentDistortionTableBo[iClassIdx];
    221         }
    222       }
    223 
    224       for (Int ry = pOnePart->StartCUY; ry<= pOnePart->EndCUY; ry++)
    225       {
    226         for (Int rx = pOnePart->StartCUX; rx <= pOnePart->EndCUX; rx++)
    227         {
    228           addr = ry * frameWidthInCU + rx;         
    229 
    230           // get bits for iTypeIdx = -1
    231           allowMergeLeft = 1;
    232           allowMergeUp   = 1;
    233           if (rx != 0)
    234           {
    235             // check tile id and slice id
    236             if ( (m_pcPic->getPicSym()->getTileIdxMap(addr-1) != m_pcPic->getPicSym()->getTileIdxMap(addr)) || (m_pcPic->getCU(addr-1)->getSlice()->getSliceIdx() != m_pcPic->getCU(addr)->getSlice()->getSliceIdx()))
    237             {
    238               allowMergeLeft = 0;
    239             }
    240           }
    241           if (ry!=0)
    242           {
    243             if ( (m_pcPic->getPicSym()->getTileIdxMap(addr-m_iNumCuInWidth) != m_pcPic->getPicSym()->getTileIdxMap(addr)) || (m_pcPic->getCU(addr-m_iNumCuInWidth)->getSlice()->getSliceIdx() != m_pcPic->getCU(addr)->getSlice()->getSliceIdx()))
    244             {
    245               allowMergeUp = 0;
    246             }
    247           }
    248 
    249           // reset
    250           resetSaoUnit(&saoLcuParamRdo);
    251          
    252           // set merge flag
    253           saoLcuParamRdo.mergeUpFlag   = 1;
    254           saoLcuParamRdo.mergeLeftFlag = 1;
    255 
    256           if (ry == pOnePart->StartCUY)
    257           {
    258             saoLcuParamRdo.mergeUpFlag = 0;
    259           }
    260          
    261           if (rx == pOnePart->StartCUX)
    262           {
    263             saoLcuParamRdo.mergeLeftFlag = 0;
    264           }
    265 
    266           // set type and offsets
    267           saoLcuParamRdo.typeIdx = iTypeIdx;
    268           saoLcuParamRdo.subTypeIdx = (iTypeIdx==SAO_BO)?bestClassTableBo:0;
    269           saoLcuParamRdo.length = m_iNumClass[iTypeIdx];
    270           for (iClassIdx = 0; iClassIdx < saoLcuParamRdo.length; iClassIdx++)
    271           {
    272             saoLcuParamRdo.offset[iClassIdx] = (Int)m_iOffset[iPartIdx][iTypeIdx][iClassIdx+saoLcuParamRdo.subTypeIdx+1];
    273           }
    274 
    275           m_pcEntropyCoder->encodeSaoUnitInterleaving(yCbCr, 1, rx, ry,  &saoLcuParamRdo, 1,  1,  allowMergeLeft, allowMergeUp);
    276 
    277         }
    278       }
    279 
    280       m_iDist[iPartIdx][iTypeIdx] = iEstDist;
    281       m_iRate[iPartIdx][iTypeIdx] = m_pcEntropyCoder->getNumberOfWrittenBits();
    282 
    283       m_dCost[iPartIdx][iTypeIdx] = (Double)((Double)m_iDist[iPartIdx][iTypeIdx] + dLambda * (Double) m_iRate[iPartIdx][iTypeIdx]);
    284 
    285       if(m_dCost[iPartIdx][iTypeIdx] < m_dCostPartBest[iPartIdx])
    286       {
    287         m_iDistOrg [iPartIdx] = 0;
    288         m_dCostPartBest[iPartIdx] = m_dCost[iPartIdx][iTypeIdx];
    289         m_iTypePartBest[iPartIdx] = iTypeIdx;
    290         if( m_bUseSBACRD )
    291           m_pcRDGoOnSbacCoder->store( m_pppcRDSbacCoder[pOnePart->PartLevel][CI_TEMP_BEST] );
    292       }
    293     }
    294     else
    295     {
    296       if(m_iDistOrg[iPartIdx] < m_dCostPartBest[iPartIdx] )
    297       {
    298         m_dCostPartBest[iPartIdx] = (Double) m_iDistOrg[iPartIdx] + m_pcEntropyCoder->getNumberOfWrittenBits()*dLambda ;
    299         m_iTypePartBest[iPartIdx] = -1;
    300         if( m_bUseSBACRD )
    301         {
    302           m_pcRDGoOnSbacCoder->store( m_pppcRDSbacCoder[pOnePart->PartLevel][CI_TEMP_BEST] );
    303         }
    304       }
    305     }
    306   }
    307 
    308   pOnePart->bProcessed = true;
    309   pOnePart->bSplit     = false;
    310   pOnePart->iMinDist   =        m_iTypePartBest[iPartIdx] >= 0 ? m_iDist[iPartIdx][m_iTypePartBest[iPartIdx]] : m_iDistOrg[iPartIdx];
    311   pOnePart->iMinRate   = (Int) (m_iTypePartBest[iPartIdx] >= 0 ? m_iRate[iPartIdx][m_iTypePartBest[iPartIdx]] : 0);
    312   pOnePart->dMinCost   = pOnePart->iMinDist + dLambda * pOnePart->iMinRate;
    313   pOnePart->iBestType  = m_iTypePartBest[iPartIdx];
    314   if (pOnePart->iBestType != -1)
    315   {
    316     //     pOnePart->bEnableFlag =  1;
    317     pOnePart->iLength = m_iNumClass[pOnePart->iBestType];
    318     Int minIndex = 0;
    319     if( pOnePart->iBestType == SAO_BO )
    320     {
    321       pOnePart->subTypeIdx = bestClassTableBo;
    322       minIndex = pOnePart->subTypeIdx;
    323     }
    324     for (Int i=0; i< pOnePart->iLength ; i++)
    325     {
    326       pOnePart->iOffset[i] = (Int) m_iOffset[iPartIdx][pOnePart->iBestType][minIndex+i+1];
    327     }
    328 
    329   }
    330   else
    331   {
    332     //     pOnePart->bEnableFlag = 0;
    333     pOnePart->iLength     = 0;
    334   }
    335 }
    336 
    337 /** Run partition tree disable
    338  */
    339 Void TEncSampleAdaptiveOffset::disablePartTree(SAOQTPart *psQTPart, Int iPartIdx)
    340 {
    341   SAOQTPart*  pOnePart= &(psQTPart[iPartIdx]);
    342   pOnePart->bSplit      = false;
    343   pOnePart->iLength     =  0;
    344   pOnePart->iBestType   = -1;
    345 
    346   if (pOnePart->PartLevel < m_uiMaxSplitLevel)
    347   {
    348     for (Int i=0; i<NUM_DOWN_PART; i++)
    349     {
    350       disablePartTree(psQTPart, pOnePart->DownPartsIdx[i]);
    351     }
    352   }
    353 }
    354 
    355 /** Run quadtree decision function
    356  * \param  iPartIdx, pcPicOrg, pcPicDec, pcPicRest, &dCostFinal
    357  */
    358 Void TEncSampleAdaptiveOffset::runQuadTreeDecision(SAOQTPart *psQTPart, Int iPartIdx, Double &dCostFinal, Int iMaxLevel, Double dLambda, Int yCbCr)
    359 {
    360   SAOQTPart*  pOnePart = &(psQTPart[iPartIdx]);
    361 
    362   UInt uiDepth = pOnePart->PartLevel;
    363   UInt uhNextDepth = uiDepth+1;
    364 
    365   if (iPartIdx == 0)
    366   {
    367     dCostFinal = 0;
    368   }
    369 
    370   //SAO for this part
    371   if(!pOnePart->bProcessed)
    372   {
    373     rdoSaoOnePart (psQTPart, iPartIdx, dLambda, yCbCr);
    374   }
    375 
    376   //SAO for sub 4 parts
    377   if (pOnePart->PartLevel < iMaxLevel)
    378   {
    379     Double      dCostNotSplit = dLambda + pOnePart->dMinCost;
    380     Double      dCostSplit    = dLambda;
    381 
    382     for (Int i=0; i< NUM_DOWN_PART ;i++)
    383     {
    384       if( m_bUseSBACRD ) 
    385       {
    386         if ( 0 == i) //initialize RD with previous depth buffer
    387         {
    388           m_pppcRDSbacCoder[uhNextDepth][CI_CURR_BEST]->load(m_pppcRDSbacCoder[uiDepth][CI_CURR_BEST]);
    389         }
    390         else
    391         {
    392           m_pppcRDSbacCoder[uhNextDepth][CI_CURR_BEST]->load(m_pppcRDSbacCoder[uhNextDepth][CI_NEXT_BEST]);
    393         }
    394       } 
    395       runQuadTreeDecision(psQTPart, pOnePart->DownPartsIdx[i], dCostFinal, iMaxLevel, dLambda, yCbCr);
    396       dCostSplit += dCostFinal;
    397       if( m_bUseSBACRD )
    398       {
    399         m_pppcRDSbacCoder[uhNextDepth][CI_NEXT_BEST]->load(m_pppcRDSbacCoder[uhNextDepth][CI_TEMP_BEST]);
    400       }
    401     }
    402 
    403     if(dCostSplit < dCostNotSplit)
    404     {
    405       dCostFinal = dCostSplit;
    406       pOnePart->bSplit      = true;
    407       pOnePart->iLength     =  0;
    408       pOnePart->iBestType   = -1;
    409       if( m_bUseSBACRD )
    410       {
    411         m_pppcRDSbacCoder[uiDepth][CI_NEXT_BEST]->load(m_pppcRDSbacCoder[uhNextDepth][CI_NEXT_BEST]);
    412       }
    413     }
    414     else
    415     {
    416       dCostFinal = dCostNotSplit;
    417       pOnePart->bSplit = false;
    418       for (Int i=0; i<NUM_DOWN_PART; i++)
    419       {
    420         disablePartTree(psQTPart, pOnePart->DownPartsIdx[i]);
    421       }
    422       if( m_bUseSBACRD )
    423       {
    424         m_pppcRDSbacCoder[uiDepth][CI_NEXT_BEST]->load(m_pppcRDSbacCoder[uiDepth][CI_TEMP_BEST]);
    425       }
    426     }
    427   }
    428   else
    429   {
    430     dCostFinal = pOnePart->dMinCost;
    431   }
    432 }
    433 
    434 /** delete allocated memory of TEncSampleAdaptiveOffset class.
    435  */
    436 Void TEncSampleAdaptiveOffset::destroyEncBuffer()
    437 {
    438   for (Int i=0;i<m_iNumTotalParts;i++)
    439   {
    440     for (Int j=0;j<MAX_NUM_SAO_TYPE;j++)
    441     {
    442       if (m_iCount [i][j])
    443       {
    444         delete [] m_iCount [i][j];
    445       }
    446       if (m_iOffset[i][j])
    447       {
    448         delete [] m_iOffset[i][j];
    449       }
    450       if (m_iOffsetOrg[i][j])
    451       {
    452         delete [] m_iOffsetOrg[i][j];
    453       }
    454     }
    455     if (m_iRate[i])
    456     {
    457       delete [] m_iRate[i];
    458     }
    459     if (m_iDist[i])
    460     {
    461       delete [] m_iDist[i];
    462     }
    463     if (m_dCost[i])
    464     {
    465       delete [] m_dCost[i];
    466     }
    467     if (m_iCount [i])
    468     {
    469       delete [] m_iCount [i];
    470     }
    471     if (m_iOffset[i])
    472     {
    473       delete [] m_iOffset[i];
    474     }
    475     if (m_iOffsetOrg[i])
    476     {
    477       delete [] m_iOffsetOrg[i];
    478     }
    479 
    480   }
    481   if (m_iDistOrg)
    482   {
    483     delete [] m_iDistOrg ; m_iDistOrg = NULL;
    484   }
    485   if (m_dCostPartBest)
    486   {
    487     delete [] m_dCostPartBest ; m_dCostPartBest = NULL;
    488   }
    489   if (m_iTypePartBest)
    490   {
    491     delete [] m_iTypePartBest ; m_iTypePartBest = NULL;
    492   }
    493   if (m_iRate)
    494   {
    495     delete [] m_iRate ; m_iRate = NULL;
    496   }
    497   if (m_iDist)
    498   {
    499     delete [] m_iDist ; m_iDist = NULL;
    500   }
    501   if (m_dCost)
    502   {
    503     delete [] m_dCost ; m_dCost = NULL;
    504   }
    505   if (m_iCount)
    506   {
    507     delete [] m_iCount  ; m_iCount = NULL;
    508   }
    509   if (m_iOffset)
    510   {
    511     delete [] m_iOffset ; m_iOffset = NULL;
    512   }
    513   if (m_iOffsetOrg)
    514   {
    515     delete [] m_iOffsetOrg ; m_iOffsetOrg = NULL;
    516   }
    517   Int numLcu = m_iNumCuInWidth * m_iNumCuInHeight;
    518 
    519   for (Int i=0;i<numLcu;i++)
    520   {
    521     for (Int j=0;j<3;j++)
    522     {
    523       for (Int k=0;k<MAX_NUM_SAO_TYPE;k++)
    524       {
    525         if (m_count_PreDblk [i][j][k])
    526         {
    527           delete [] m_count_PreDblk [i][j][k];
    528         }
    529         if (m_offsetOrg_PreDblk[i][j][k])
    530         {
    531           delete [] m_offsetOrg_PreDblk[i][j][k];
    532         }
    533       }
    534       if (m_count_PreDblk [i][j])
    535       {
    536         delete [] m_count_PreDblk [i][j];
    537       }
    538       if (m_offsetOrg_PreDblk[i][j])
    539       {
    540         delete [] m_offsetOrg_PreDblk[i][j];
    541       }
    542     }
    543     if (m_count_PreDblk [i])
    544     {
    545       delete [] m_count_PreDblk [i];
    546     }
    547     if (m_offsetOrg_PreDblk[i])
    548     {
    549       delete [] m_offsetOrg_PreDblk[i];
    550     }
    551   }
    552   if (m_count_PreDblk)
    553   {
    554     delete [] m_count_PreDblk  ; m_count_PreDblk = NULL;
    555   }
    556   if (m_offsetOrg_PreDblk)
    557   {
    558     delete [] m_offsetOrg_PreDblk ; m_offsetOrg_PreDblk = NULL;
    559   }
    560 
    561   Int iMaxDepth = 4;
    562   Int iDepth;
    563   for ( iDepth = 0; iDepth < iMaxDepth+1; iDepth++ )
    564   {
    565     for (Int iCIIdx = 0; iCIIdx < CI_NUM; iCIIdx ++ )
    566     {
    567       delete m_pppcRDSbacCoder[iDepth][iCIIdx];
    568       delete m_pppcBinCoderCABAC[iDepth][iCIIdx];
    569     }
    570   }
    571 
    572   for ( iDepth = 0; iDepth < iMaxDepth+1; iDepth++ )
    573   {
    574     delete [] m_pppcRDSbacCoder[iDepth];
    575     delete [] m_pppcBinCoderCABAC[iDepth];
    576   }
    577 
    578   delete [] m_pppcRDSbacCoder;
    579   delete [] m_pppcBinCoderCABAC;
    580 }
    581 
    582 /** create Encoder Buffer for SAO
    583  * \param
    584  */
    585 Void TEncSampleAdaptiveOffset::createEncBuffer()
    586 {
    587   m_iDistOrg = new Int64 [m_iNumTotalParts];
    588   m_dCostPartBest = new Double [m_iNumTotalParts];
    589   m_iTypePartBest = new Int [m_iNumTotalParts];
    590 
    591   m_iRate = new Int64* [m_iNumTotalParts];
    592   m_iDist = new Int64* [m_iNumTotalParts];
    593   m_dCost = new Double*[m_iNumTotalParts];
    594 
    595   m_iCount  = new Int64 **[m_iNumTotalParts];
    596   m_iOffset = new Int64 **[m_iNumTotalParts];
    597   m_iOffsetOrg = new Int64 **[m_iNumTotalParts];
    598 
    599   for (Int i=0;i<m_iNumTotalParts;i++)
    600   {
    601     m_iRate[i] = new Int64  [MAX_NUM_SAO_TYPE];
    602     m_iDist[i] = new Int64  [MAX_NUM_SAO_TYPE];
    603     m_dCost[i] = new Double [MAX_NUM_SAO_TYPE];
    604 
    605     m_iCount [i] = new Int64 *[MAX_NUM_SAO_TYPE];
    606     m_iOffset[i] = new Int64 *[MAX_NUM_SAO_TYPE];
    607     m_iOffsetOrg[i] = new Int64 *[MAX_NUM_SAO_TYPE];
    608 
    609     for (Int j=0;j<MAX_NUM_SAO_TYPE;j++)
    610     {
    611       m_iCount [i][j]   = new Int64 [MAX_NUM_SAO_CLASS];
    612       m_iOffset[i][j]   = new Int64 [MAX_NUM_SAO_CLASS];
    613       m_iOffsetOrg[i][j]= new Int64 [MAX_NUM_SAO_CLASS];
    614     }
    615   }
    616   Int numLcu = m_iNumCuInWidth * m_iNumCuInHeight;
    617   m_count_PreDblk  = new Int64 ***[numLcu];
    618   m_offsetOrg_PreDblk = new Int64 ***[numLcu];
    619   for (Int i=0; i<numLcu; i++)
    620   {
    621     m_count_PreDblk[i]  = new Int64 **[3];
    622     m_offsetOrg_PreDblk[i] = new Int64 **[3];
    623 
    624     for (Int j=0;j<3;j++)
    625     {
    626       m_count_PreDblk [i][j] = new Int64 *[MAX_NUM_SAO_TYPE];
    627       m_offsetOrg_PreDblk[i][j] = new Int64 *[MAX_NUM_SAO_TYPE];
    628 
    629       for (Int k=0;k<MAX_NUM_SAO_TYPE;k++)
    630       {
    631         m_count_PreDblk [i][j][k]   = new Int64 [MAX_NUM_SAO_CLASS];
    632         m_offsetOrg_PreDblk[i][j][k]= new Int64 [MAX_NUM_SAO_CLASS];
    633       }
    634     }
    635   }
    636 
    637   Int iMaxDepth = 4;
    638   m_pppcRDSbacCoder = new TEncSbac** [iMaxDepth+1];
    639 #if FAST_BIT_EST
    640   m_pppcBinCoderCABAC = new TEncBinCABACCounter** [iMaxDepth+1];
    641 #else
    642   m_pppcBinCoderCABAC = new TEncBinCABAC** [iMaxDepth+1];
    643 #endif
    644 
    645   for ( Int iDepth = 0; iDepth < iMaxDepth+1; iDepth++ )
    646   {
    647     m_pppcRDSbacCoder[iDepth] = new TEncSbac* [CI_NUM];
    648 #if FAST_BIT_EST
    649     m_pppcBinCoderCABAC[iDepth] = new TEncBinCABACCounter* [CI_NUM];
    650 #else
    651     m_pppcBinCoderCABAC[iDepth] = new TEncBinCABAC* [CI_NUM];
    652 #endif
    653     for (Int iCIIdx = 0; iCIIdx < CI_NUM; iCIIdx ++ )
    654     {
    655       m_pppcRDSbacCoder[iDepth][iCIIdx] = new TEncSbac;
    656 #if FAST_BIT_EST
    657       m_pppcBinCoderCABAC [iDepth][iCIIdx] = new TEncBinCABACCounter;
    658 #else
    659       m_pppcBinCoderCABAC [iDepth][iCIIdx] = new TEncBinCABAC;
    660 #endif
    661       m_pppcRDSbacCoder   [iDepth][iCIIdx]->init( m_pppcBinCoderCABAC [iDepth][iCIIdx] );
    662     }
    663   }
    664 }
    665 
    666 /** Start SAO encoder
    667  * \param pcPic, pcEntropyCoder, pppcRDSbacCoder, pcRDGoOnSbacCoder
    668  */
    669 Void TEncSampleAdaptiveOffset::startSaoEnc( TComPic* pcPic, TEncEntropy* pcEntropyCoder, TEncSbac*** pppcRDSbacCoder, TEncSbac* pcRDGoOnSbacCoder)
    670 {
    671     m_bUseSBACRD = true;
    672   m_pcPic = pcPic;
    673   m_pcEntropyCoder = pcEntropyCoder;
    674 
     62TEncSampleAdaptiveOffset::TEncSampleAdaptiveOffset()
     63{
     64  m_pppcRDSbacCoder = NULL;           
     65  m_pcRDGoOnSbacCoder = NULL;
     66  m_pppcBinCoderCABAC = NULL;   
     67  m_statData = NULL;
     68#if SAO_ENCODE_ALLOW_USE_PREDEBLOCK
     69  m_preDBFstatData = NULL;
     70#endif
     71}
     72
     73TEncSampleAdaptiveOffset::~TEncSampleAdaptiveOffset()
     74{
     75  destroyEncData();
     76}
     77
     78#if SAO_ENCODE_ALLOW_USE_PREDEBLOCK
     79Void TEncSampleAdaptiveOffset::createEncData(Bool isPreDBFSamplesUsed)
     80#else
     81Void TEncSampleAdaptiveOffset::createEncData()
     82#endif
     83{
     84
     85  //cabac coder for RDO
     86  m_pppcRDSbacCoder = new TEncSbac* [NUM_SAO_CABACSTATE_LABELS];
     87  m_pppcBinCoderCABAC = new TEncBinCABACCounter* [NUM_SAO_CABACSTATE_LABELS];
     88
     89  for(Int cs=0; cs < NUM_SAO_CABACSTATE_LABELS; cs++)
     90  {
     91    m_pppcRDSbacCoder[cs] = new TEncSbac;
     92    m_pppcBinCoderCABAC[cs] = new TEncBinCABACCounter;
     93    m_pppcRDSbacCoder   [cs]->init( m_pppcBinCoderCABAC [cs] );
     94  }
     95
     96
     97  //statistics
     98  m_statData = new SAOStatData**[m_numCTUsPic];
     99  for(Int i=0; i< m_numCTUsPic; i++)
     100  {
     101    m_statData[i] = new SAOStatData*[NUM_SAO_COMPONENTS];
     102    for(Int compIdx=0; compIdx < NUM_SAO_COMPONENTS; compIdx++)
     103    {
     104      m_statData[i][compIdx] = new SAOStatData[NUM_SAO_NEW_TYPES];
     105    }
     106  }
     107#if SAO_ENCODE_ALLOW_USE_PREDEBLOCK
     108  if(isPreDBFSamplesUsed)
     109  {
     110    m_preDBFstatData = new SAOStatData**[m_numCTUsPic];
     111    for(Int i=0; i< m_numCTUsPic; i++)
     112    {
     113      m_preDBFstatData[i] = new SAOStatData*[NUM_SAO_COMPONENTS];
     114      for(Int compIdx=0; compIdx < NUM_SAO_COMPONENTS; compIdx++)
     115      {
     116        m_preDBFstatData[i][compIdx] = new SAOStatData[NUM_SAO_NEW_TYPES];
     117      }
     118    }
     119
     120  }
     121#endif
     122
     123#if SAO_ENCODING_CHOICE
     124  ::memset(m_saoDisabledRate, 0, sizeof(m_saoDisabledRate));
     125#endif
     126
     127  for(Int typeIdc=0; typeIdc < NUM_SAO_NEW_TYPES; typeIdc++)
     128  {
     129    m_skipLinesR[SAO_Y ][typeIdc]= 5;
     130    m_skipLinesR[SAO_Cb][typeIdc]= m_skipLinesR[SAO_Cr][typeIdc]= 3;
     131
     132    m_skipLinesB[SAO_Y ][typeIdc]= 4;
     133    m_skipLinesB[SAO_Cb][typeIdc]= m_skipLinesB[SAO_Cr][typeIdc]= 2;
     134
     135#if SAO_ENCODE_ALLOW_USE_PREDEBLOCK
     136    if(isPreDBFSamplesUsed)
     137    {
     138      switch(typeIdc)
     139      {
     140      case SAO_TYPE_EO_0:
     141        {
     142          m_skipLinesR[SAO_Y ][typeIdc]= 5;
     143          m_skipLinesR[SAO_Cb][typeIdc]= m_skipLinesR[SAO_Cr][typeIdc]= 3;
     144
     145          m_skipLinesB[SAO_Y ][typeIdc]= 3;
     146          m_skipLinesB[SAO_Cb][typeIdc]= m_skipLinesB[SAO_Cr][typeIdc]= 1;
     147        }
     148        break;
     149      case SAO_TYPE_EO_90:
     150        {
     151          m_skipLinesR[SAO_Y ][typeIdc]= 4;
     152          m_skipLinesR[SAO_Cb][typeIdc]= m_skipLinesR[SAO_Cr][typeIdc]= 2;
     153
     154          m_skipLinesB[SAO_Y ][typeIdc]= 4;
     155          m_skipLinesB[SAO_Cb][typeIdc]= m_skipLinesB[SAO_Cr][typeIdc]= 2;
     156        }
     157        break;
     158      case SAO_TYPE_EO_135:
     159      case SAO_TYPE_EO_45:
     160        {
     161          m_skipLinesR[SAO_Y ][typeIdc]= 5;
     162          m_skipLinesR[SAO_Cb][typeIdc]= m_skipLinesR[SAO_Cr][typeIdc]= 3;
     163
     164          m_skipLinesB[SAO_Y ][typeIdc]= 4;
     165          m_skipLinesB[SAO_Cb][typeIdc]= m_skipLinesB[SAO_Cr][typeIdc]= 2;
     166        }
     167        break;
     168      case SAO_TYPE_BO:
     169        {
     170          m_skipLinesR[SAO_Y ][typeIdc]= 4;
     171          m_skipLinesR[SAO_Cb][typeIdc]= m_skipLinesR[SAO_Cr][typeIdc]= 2;
     172
     173          m_skipLinesB[SAO_Y ][typeIdc]= 3;
     174          m_skipLinesB[SAO_Cb][typeIdc]= m_skipLinesB[SAO_Cr][typeIdc]= 1;
     175        }
     176        break;
     177      default:
     178        {
     179          printf("Not a supported type");
     180          assert(0);
     181          exit(-1);
     182        }
     183      }
     184    }
     185#endif   
     186  }
     187
     188}
     189
     190Void TEncSampleAdaptiveOffset::destroyEncData()
     191{
     192  if(m_pppcRDSbacCoder != NULL)
     193  {
     194    for (Int cs = 0; cs < NUM_SAO_CABACSTATE_LABELS; cs ++ )
     195    {
     196      delete m_pppcRDSbacCoder[cs];
     197    }
     198    delete[] m_pppcRDSbacCoder; m_pppcRDSbacCoder = NULL;
     199  }
     200
     201  if(m_pppcBinCoderCABAC != NULL)
     202  {
     203    for (Int cs = 0; cs < NUM_SAO_CABACSTATE_LABELS; cs ++ )
     204    {
     205      delete m_pppcBinCoderCABAC[cs];
     206    }
     207    delete[] m_pppcBinCoderCABAC; m_pppcBinCoderCABAC = NULL;
     208  }
     209
     210  if(m_statData != NULL)
     211  {
     212    for(Int i=0; i< m_numCTUsPic; i++)
     213    {
     214      for(Int compIdx=0; compIdx< NUM_SAO_COMPONENTS; compIdx++)
     215      {
     216        delete[] m_statData[i][compIdx];
     217      }
     218      delete[] m_statData[i];
     219    }
     220    delete[] m_statData; m_statData = NULL;
     221  }
     222#if SAO_ENCODE_ALLOW_USE_PREDEBLOCK
     223  if(m_preDBFstatData != NULL)
     224  {
     225    for(Int i=0; i< m_numCTUsPic; i++)
     226    {
     227      for(Int compIdx=0; compIdx< NUM_SAO_COMPONENTS; compIdx++)
     228      {
     229        delete[] m_preDBFstatData[i][compIdx];
     230      }
     231      delete[] m_preDBFstatData[i];
     232    }
     233    delete[] m_preDBFstatData; m_preDBFstatData = NULL;
     234  }
     235
     236#endif
     237}
     238
     239Void TEncSampleAdaptiveOffset::initRDOCabacCoder(TEncSbac* pcRDGoOnSbacCoder, TComSlice* pcSlice)
     240{
    675241  m_pcRDGoOnSbacCoder = pcRDGoOnSbacCoder;
    676   m_pcEntropyCoder->setEntropyCoder(m_pcRDGoOnSbacCoder, pcPic->getSlice(0));
    677   m_pcEntropyCoder->resetEntropy();
    678   m_pcEntropyCoder->resetBits();
    679 
    680   if( m_bUseSBACRD )
    681   {
    682     m_pcRDGoOnSbacCoder->store( m_pppcRDSbacCoder[0][CI_NEXT_BEST]);
    683     m_pppcRDSbacCoder[0][CI_CURR_BEST]->load( m_pppcRDSbacCoder[0][CI_NEXT_BEST]);
    684   }
    685 }
    686 
    687 /** End SAO encoder
    688  */
    689 Void TEncSampleAdaptiveOffset::endSaoEnc()
    690 {
    691   m_pcPic = NULL;
    692   m_pcEntropyCoder = NULL;
    693 }
    694 
    695 inline Int xSign(Int x)
    696 {
    697   return ((x >> 31) | ((Int)( (((UInt) -x)) >> 31)));
    698 }
    699 
    700 /** Calculate SAO statistics for non-cross-slice or non-cross-tile processing
    701  * \param  pRecStart to-be-filtered block buffer pointer
    702  * \param  pOrgStart original block buffer pointer
    703  * \param  stride picture buffer stride
    704  * \param  ppStat statistics buffer
    705  * \param  ppCount counter buffer
    706  * \param  width block width
    707  * \param  height block height
    708  * \param  pbBorderAvail availabilities of block border pixels
    709  */
    710 Void TEncSampleAdaptiveOffset::calcSaoStatsBlock( Pel* pRecStart, Pel* pOrgStart, Int stride, Int64** ppStats, Int64** ppCount, UInt width, UInt height, Bool* pbBorderAvail, Int iYCbCr)
    711 {
    712   Int64 *stats, *count;
    713   Int classIdx, posShift, startX, endX, startY, endY, signLeft,signRight,signDown,signDown1;
    714   Pel *pOrg, *pRec;
    715   UInt edgeType;
    716   Int x, y;
    717   Pel *pTableBo = (iYCbCr==0)?m_lumaTableBo:m_chromaTableBo;
    718 
    719   //--------- Band offset-----------//
    720   stats = ppStats[SAO_BO];
    721   count = ppCount[SAO_BO];
    722   pOrg   = pOrgStart;
    723   pRec   = pRecStart;
    724   for (y=0; y< height; y++)
    725   {
    726     for (x=0; x< width; x++)
    727     {
    728       classIdx = pTableBo[pRec[x]];
    729       if (classIdx)
    730       {
    731         stats[classIdx] += (pOrg[x] - pRec[x]);
    732         count[classIdx] ++;
    733       }
    734     }
    735     pOrg += stride;
    736     pRec += stride;
    737   }
    738   //---------- Edge offset 0--------------//
    739   stats = ppStats[SAO_EO_0];
    740   count = ppCount[SAO_EO_0];
    741   pOrg   = pOrgStart;
    742   pRec   = pRecStart;
    743 
    744 
    745   startX = (pbBorderAvail[SGU_L]) ? 0 : 1;
    746   endX   = (pbBorderAvail[SGU_R]) ? width : (width -1);
    747   for (y=0; y< height; y++)
    748   {
    749     signLeft = xSign(pRec[startX] - pRec[startX-1]);
    750     for (x=startX; x< endX; x++)
    751     {
    752       signRight =  xSign(pRec[x] - pRec[x+1]);
    753       edgeType =  signRight + signLeft + 2;
    754       signLeft  = -signRight;
    755 
    756       stats[m_auiEoTable[edgeType]] += (pOrg[x] - pRec[x]);
    757       count[m_auiEoTable[edgeType]] ++;
    758     }
    759     pRec  += stride;
    760     pOrg += stride;
    761   }
    762 
    763   //---------- Edge offset 1--------------//
    764   stats = ppStats[SAO_EO_1];
    765   count = ppCount[SAO_EO_1];
    766   pOrg   = pOrgStart;
    767   pRec   = pRecStart;
    768 
    769   startY = (pbBorderAvail[SGU_T]) ? 0 : 1;
    770   endY   = (pbBorderAvail[SGU_B]) ? height : height-1;
    771   if (!pbBorderAvail[SGU_T])
    772   {
    773     pRec  += stride;
    774     pOrg  += stride;
    775   }
    776 
    777   for (x=0; x< width; x++)
    778   {
    779     m_iUpBuff1[x] = xSign(pRec[x] - pRec[x-stride]);
    780   }
    781   for (y=startY; y<endY; y++)
    782   {
    783     for (x=0; x< width; x++)
    784     {
    785       signDown     =  xSign(pRec[x] - pRec[x+stride]);
    786       edgeType    =  signDown + m_iUpBuff1[x] + 2;
    787       m_iUpBuff1[x] = -signDown;
    788 
    789       stats[m_auiEoTable[edgeType]] += (pOrg[x] - pRec[x]);
    790       count[m_auiEoTable[edgeType]] ++;
    791     }
    792     pOrg += stride;
    793     pRec += stride;
    794   }
    795   //---------- Edge offset 2--------------//
    796   stats = ppStats[SAO_EO_2];
    797   count = ppCount[SAO_EO_2];
    798   pOrg   = pOrgStart;
    799   pRec   = pRecStart;
    800 
    801   posShift= stride + 1;
    802 
    803   startX = (pbBorderAvail[SGU_L]) ? 0 : 1 ;
    804   endX   = (pbBorderAvail[SGU_R]) ? width : (width-1);
    805 
    806   //prepare 2nd line upper sign
    807   pRec += stride;
    808   for (x=startX; x< endX+1; x++)
    809   {
    810     m_iUpBuff1[x] = xSign(pRec[x] - pRec[x- posShift]);
    811   }
    812 
    813   //1st line
    814   pRec -= stride;
    815   if(pbBorderAvail[SGU_TL])
    816   {
    817     x= 0;
    818     edgeType      =  xSign(pRec[x] - pRec[x- posShift]) - m_iUpBuff1[x+1] + 2;
    819     stats[m_auiEoTable[edgeType]] += (pOrg[x] - pRec[x]);
    820     count[m_auiEoTable[edgeType]] ++;
    821   }
    822   if(pbBorderAvail[SGU_T])
    823   {
    824     for(x= 1; x< endX; x++)
    825     {
    826       edgeType      =  xSign(pRec[x] - pRec[x- posShift]) - m_iUpBuff1[x+1] + 2;
    827       stats[m_auiEoTable[edgeType]] += (pOrg[x] - pRec[x]);
    828       count[m_auiEoTable[edgeType]] ++;
    829     }
    830   }
    831   pRec   += stride;
    832   pOrg   += stride;
    833 
    834   //middle lines
    835   for (y= 1; y< height-1; y++)
    836   {
    837     for (x=startX; x<endX; x++)
    838     {
    839       signDown1      =  xSign(pRec[x] - pRec[x+ posShift]) ;
    840       edgeType      =  signDown1 + m_iUpBuff1[x] + 2;
    841       stats[m_auiEoTable[edgeType]] += (pOrg[x] - pRec[x]);
    842       count[m_auiEoTable[edgeType]] ++;
    843 
    844       m_iUpBufft[x+1] = -signDown1;
    845     }
    846     m_iUpBufft[startX] = xSign(pRec[stride+startX] - pRec[startX-1]);
    847 
    848     ipSwap     = m_iUpBuff1;
    849     m_iUpBuff1 = m_iUpBufft;
    850     m_iUpBufft = ipSwap;
    851 
    852     pRec  += stride;
    853     pOrg  += stride;
    854   }
    855 
    856   //last line
    857   if(pbBorderAvail[SGU_B])
    858   {
    859     for(x= startX; x< width-1; x++)
    860     {
    861       edgeType =  xSign(pRec[x] - pRec[x+ posShift]) + m_iUpBuff1[x] + 2;
    862       stats[m_auiEoTable[edgeType]] += (pOrg[x] - pRec[x]);
    863       count[m_auiEoTable[edgeType]] ++;
    864     }
    865   }
    866   if(pbBorderAvail[SGU_BR])
    867   {
    868     x= width -1;
    869     edgeType =  xSign(pRec[x] - pRec[x+ posShift]) + m_iUpBuff1[x] + 2;
    870     stats[m_auiEoTable[edgeType]] += (pOrg[x] - pRec[x]);
    871     count[m_auiEoTable[edgeType]] ++;
    872   }
    873 
    874   //---------- Edge offset 3--------------//
    875 
    876   stats = ppStats[SAO_EO_3];
    877   count = ppCount[SAO_EO_3];
    878   pOrg   = pOrgStart;
    879   pRec   = pRecStart;
    880 
    881   posShift     = stride - 1;
    882   startX = (pbBorderAvail[SGU_L]) ? 0 : 1;
    883   endX   = (pbBorderAvail[SGU_R]) ? width : (width -1);
    884 
    885   //prepare 2nd line upper sign
    886   pRec += stride;
    887   for (x=startX-1; x< endX; x++)
    888   {
    889     m_iUpBuff1[x] = xSign(pRec[x] - pRec[x- posShift]);
    890   }
    891 
    892 
    893   //first line
    894   pRec -= stride;
    895   if(pbBorderAvail[SGU_T])
    896   {
    897     for(x= startX; x< width -1; x++)
    898     {
    899       edgeType = xSign(pRec[x] - pRec[x- posShift]) -m_iUpBuff1[x-1] + 2;
    900       stats[m_auiEoTable[edgeType]] += (pOrg[x] - pRec[x]);
    901       count[m_auiEoTable[edgeType]] ++;
    902     }
    903   }
    904   if(pbBorderAvail[SGU_TR])
    905   {
    906     x= width-1;
    907     edgeType = xSign(pRec[x] - pRec[x- posShift]) -m_iUpBuff1[x-1] + 2;
    908     stats[m_auiEoTable[edgeType]] += (pOrg[x] - pRec[x]);
    909     count[m_auiEoTable[edgeType]] ++;
    910   }
    911   pRec  += stride;
    912   pOrg  += stride;
    913 
    914   //middle lines
    915   for (y= 1; y< height-1; y++)
    916   {
    917     for(x= startX; x< endX; x++)
    918     {
    919       signDown1      =  xSign(pRec[x] - pRec[x+ posShift]) ;
    920       edgeType      =  signDown1 + m_iUpBuff1[x] + 2;
    921 
    922       stats[m_auiEoTable[edgeType]] += (pOrg[x] - pRec[x]);
    923       count[m_auiEoTable[edgeType]] ++;
    924       m_iUpBuff1[x-1] = -signDown1;
    925 
    926     }
    927     m_iUpBuff1[endX-1] = xSign(pRec[endX-1 + stride] - pRec[endX]);
    928 
    929     pRec  += stride;
    930     pOrg  += stride;
    931   }
    932 
    933   //last line
    934   if(pbBorderAvail[SGU_BL])
    935   {
    936     x= 0;
    937     edgeType = xSign(pRec[x] - pRec[x+ posShift]) + m_iUpBuff1[x] + 2;
    938     stats[m_auiEoTable[edgeType]] += (pOrg[x] - pRec[x]);
    939     count[m_auiEoTable[edgeType]] ++;
    940 
    941   }
    942   if(pbBorderAvail[SGU_B])
    943   {
    944     for(x= 1; x< endX; x++)
    945     {
    946       edgeType = xSign(pRec[x] - pRec[x+ posShift]) + m_iUpBuff1[x] + 2;
    947       stats[m_auiEoTable[edgeType]] += (pOrg[x] - pRec[x]);
    948       count[m_auiEoTable[edgeType]] ++;
    949     }
    950   }
    951 }
    952 
    953 /** Calculate SAO statistics for current LCU
    954  * \param  iAddr,  iPartIdx,  iYCbCr
    955  */
    956 Void TEncSampleAdaptiveOffset::calcSaoStatsCu(Int iAddr, Int iPartIdx, Int iYCbCr)
    957 {
    958   if(!m_bUseNIF)
    959   {
    960     calcSaoStatsCuOrg( iAddr, iPartIdx, iYCbCr);
    961   }
    962   else
    963   {
    964     Int64** ppStats = m_iOffsetOrg[iPartIdx];
    965     Int64** ppCount = m_iCount    [iPartIdx];
    966 
    967     //parameters
    968     Int  isChroma = (iYCbCr != 0)? 1:0;
    969     Int  stride   = (iYCbCr != 0)?(m_pcPic->getCStride()):(m_pcPic->getStride());
    970     Pel* pPicOrg = getPicYuvAddr (m_pcPic->getPicYuvOrg(), iYCbCr);
    971     Pel* pPicRec  = getPicYuvAddr(m_pcYuvTmp, iYCbCr);
    972 
    973     std::vector<NDBFBlockInfo>& vFilterBlocks = *(m_pcPic->getCU(iAddr)->getNDBFilterBlocks());
    974 
    975     //variables
    976     UInt  xPos, yPos, width, height;
    977     Bool* pbBorderAvail;
    978     UInt  posOffset;
    979 
    980     for(Int i=0; i< vFilterBlocks.size(); i++)
    981     {
    982       xPos        = vFilterBlocks[i].posX   >> isChroma;
    983       yPos        = vFilterBlocks[i].posY   >> isChroma;
    984       width       = vFilterBlocks[i].width  >> isChroma;
    985       height      = vFilterBlocks[i].height >> isChroma;
    986       pbBorderAvail = vFilterBlocks[i].isBorderAvailable;
    987 
    988       posOffset = (yPos* stride) + xPos;
    989 
    990       calcSaoStatsBlock(pPicRec+ posOffset, pPicOrg+ posOffset, stride, ppStats, ppCount,width, height, pbBorderAvail, iYCbCr);
    991     }
    992   }
    993 
    994 }
    995 
    996 /** Calculate SAO statistics for current LCU without non-crossing slice
    997  * \param  iAddr,  iPartIdx,  iYCbCr
    998  */
    999 Void TEncSampleAdaptiveOffset::calcSaoStatsCuOrg(Int iAddr, Int iPartIdx, Int iYCbCr)
    1000 {
    1001   Int x,y;
    1002   TComDataCU *pTmpCu = m_pcPic->getCU(iAddr);
    1003   TComSPS *pTmpSPS =  m_pcPic->getSlice(0)->getSPS();
    1004 
    1005   Pel* pOrg;
    1006   Pel* pRec;
    1007   Int iStride;
    1008   Int iLcuHeight = pTmpSPS->getMaxCUHeight();
    1009   Int iLcuWidth  = pTmpSPS->getMaxCUWidth();
    1010   UInt uiLPelX   = pTmpCu->getCUPelX();
    1011   UInt uiTPelY   = pTmpCu->getCUPelY();
    1012   UInt uiRPelX;
    1013   UInt uiBPelY;
    1014   Int64* iStats;
    1015   Int64* iCount;
    1016   Int iClassIdx;
    1017   Int iPicWidthTmp;
    1018   Int iPicHeightTmp;
    1019   Int iStartX;
    1020   Int iStartY;
    1021   Int iEndX;
    1022   Int iEndY;
    1023   Pel* pTableBo = (iYCbCr==0)?m_lumaTableBo:m_chromaTableBo;
    1024 
    1025   Int iIsChroma = (iYCbCr!=0)? 1:0;
    1026   Int numSkipLine = iIsChroma? 2:4;
    1027   if (m_saoLcuBasedOptimization == 0)
    1028   {
    1029     numSkipLine = 0;
    1030   }
    1031 
    1032   Int numSkipLineRight = iIsChroma? 3:5;
    1033   if (m_saoLcuBasedOptimization == 0)
    1034   {
    1035     numSkipLineRight = 0;
    1036   }
    1037 
    1038   iPicWidthTmp  = m_iPicWidth  >> iIsChroma;
    1039   iPicHeightTmp = m_iPicHeight >> iIsChroma;
    1040   iLcuWidth     = iLcuWidth    >> iIsChroma;
    1041   iLcuHeight    = iLcuHeight   >> iIsChroma;
    1042   uiLPelX       = uiLPelX      >> iIsChroma;
    1043   uiTPelY       = uiTPelY      >> iIsChroma;
    1044   uiRPelX       = uiLPelX + iLcuWidth  ;
    1045   uiBPelY       = uiTPelY + iLcuHeight ;
    1046   uiRPelX       = uiRPelX > iPicWidthTmp  ? iPicWidthTmp  : uiRPelX;
    1047   uiBPelY       = uiBPelY > iPicHeightTmp ? iPicHeightTmp : uiBPelY;
    1048   iLcuWidth     = uiRPelX - uiLPelX;
    1049   iLcuHeight    = uiBPelY - uiTPelY;
    1050 
    1051   iStride    =  (iYCbCr == 0)? m_pcPic->getStride(): m_pcPic->getCStride();
    1052 
    1053 //if(iSaoType == BO_0 || iSaoType == BO_1)
    1054   {
    1055     if( m_saoLcuBasedOptimization && m_saoLcuBoundary )
    1056     {
    1057       numSkipLine = iIsChroma? 1:3;
    1058       numSkipLineRight = iIsChroma? 2:4;
    1059     }
    1060     iStats = m_iOffsetOrg[iPartIdx][SAO_BO];
    1061     iCount = m_iCount    [iPartIdx][SAO_BO];
    1062 
    1063     pOrg = getPicYuvAddr(m_pcPic->getPicYuvOrg(), iYCbCr, iAddr);
    1064     pRec = getPicYuvAddr(m_pcPic->getPicYuvRec(), iYCbCr, iAddr);
    1065 
    1066     iEndX   = (uiRPelX == iPicWidthTmp) ? iLcuWidth : iLcuWidth-numSkipLineRight;
    1067     iEndY   = (uiBPelY == iPicHeightTmp) ? iLcuHeight : iLcuHeight-numSkipLine;
    1068     for (y=0; y<iEndY; y++)
    1069     {
    1070       for (x=0; x<iEndX; x++)
    1071       {
    1072         iClassIdx = pTableBo[pRec[x]];
    1073         if (iClassIdx)
    1074         {
    1075           iStats[iClassIdx] += (pOrg[x] - pRec[x]);
    1076           iCount[iClassIdx] ++;
    1077         }
    1078       }
    1079       pOrg += iStride;
    1080       pRec += iStride;
    1081     }
    1082 
    1083   }
    1084   Int iSignLeft;
    1085   Int iSignRight;
    1086   Int iSignDown;
    1087   Int iSignDown1;
    1088   Int iSignDown2;
    1089 
    1090   UInt uiEdgeType;
    1091 
    1092 //if (iSaoType == EO_0  || iSaoType == EO_1 || iSaoType == EO_2 || iSaoType == EO_3)
    1093   {
    1094   //if (iSaoType == EO_0)
    1095     {
    1096       if( m_saoLcuBasedOptimization && m_saoLcuBoundary )
    1097       {
    1098         numSkipLine = iIsChroma? 1:3;
    1099         numSkipLineRight = iIsChroma? 3:5;
    1100       }
    1101       iStats = m_iOffsetOrg[iPartIdx][SAO_EO_0];
    1102       iCount = m_iCount    [iPartIdx][SAO_EO_0];
    1103 
    1104       pOrg = getPicYuvAddr(m_pcPic->getPicYuvOrg(), iYCbCr, iAddr);
    1105       pRec = getPicYuvAddr(m_pcPic->getPicYuvRec(), iYCbCr, iAddr);
    1106 
    1107       iStartX = (uiLPelX == 0) ? 1 : 0;
    1108       iEndX   = (uiRPelX == iPicWidthTmp) ? iLcuWidth-1 : iLcuWidth-numSkipLineRight;
    1109       for (y=0; y<iLcuHeight-numSkipLine; y++)
    1110       {
    1111         iSignLeft = xSign(pRec[iStartX] - pRec[iStartX-1]);
    1112         for (x=iStartX; x< iEndX; x++)
    1113         {
    1114           iSignRight =  xSign(pRec[x] - pRec[x+1]);
    1115           uiEdgeType =  iSignRight + iSignLeft + 2;
    1116           iSignLeft  = -iSignRight;
    1117 
    1118           iStats[m_auiEoTable[uiEdgeType]] += (pOrg[x] - pRec[x]);
    1119           iCount[m_auiEoTable[uiEdgeType]] ++;
    1120         }
    1121         pOrg += iStride;
    1122         pRec += iStride;
    1123       }
    1124     }
    1125 
    1126   //if (iSaoType == EO_1)
    1127     {
    1128       if( m_saoLcuBasedOptimization && m_saoLcuBoundary )
    1129       {
    1130         numSkipLine = iIsChroma? 2:4;
    1131         numSkipLineRight = iIsChroma? 2:4;
    1132       }
    1133       iStats = m_iOffsetOrg[iPartIdx][SAO_EO_1];
    1134       iCount = m_iCount    [iPartIdx][SAO_EO_1];
    1135 
    1136       pOrg = getPicYuvAddr(m_pcPic->getPicYuvOrg(), iYCbCr, iAddr);
    1137       pRec = getPicYuvAddr(m_pcPic->getPicYuvRec(), iYCbCr, iAddr);
    1138 
    1139       iStartY = (uiTPelY == 0) ? 1 : 0;
    1140       iEndX   = (uiRPelX == iPicWidthTmp) ? iLcuWidth : iLcuWidth-numSkipLineRight;
    1141       iEndY   = (uiBPelY == iPicHeightTmp) ? iLcuHeight-1 : iLcuHeight-numSkipLine;
    1142       if (uiTPelY == 0)
    1143       {
    1144         pOrg += iStride;
    1145         pRec += iStride;
    1146       }
    1147 
    1148       for (x=0; x< iLcuWidth; x++)
    1149       {
    1150         m_iUpBuff1[x] = xSign(pRec[x] - pRec[x-iStride]);
    1151       }
    1152       for (y=iStartY; y<iEndY; y++)
    1153       {
    1154         for (x=0; x<iEndX; x++)
    1155         {
    1156           iSignDown     =  xSign(pRec[x] - pRec[x+iStride]);
    1157           uiEdgeType    =  iSignDown + m_iUpBuff1[x] + 2;
    1158           m_iUpBuff1[x] = -iSignDown;
    1159 
    1160           iStats[m_auiEoTable[uiEdgeType]] += (pOrg[x] - pRec[x]);
    1161           iCount[m_auiEoTable[uiEdgeType]] ++;
    1162         }
    1163         pOrg += iStride;
    1164         pRec += iStride;
    1165       }
    1166     }
    1167   //if (iSaoType == EO_2)
    1168     {
    1169       if( m_saoLcuBasedOptimization && m_saoLcuBoundary )
    1170       {
    1171         numSkipLine = iIsChroma? 2:4;
    1172         numSkipLineRight = iIsChroma? 3:5;
    1173       }
    1174       iStats = m_iOffsetOrg[iPartIdx][SAO_EO_2];
    1175       iCount = m_iCount    [iPartIdx][SAO_EO_2];
    1176 
    1177       pOrg = getPicYuvAddr(m_pcPic->getPicYuvOrg(), iYCbCr, iAddr);
    1178       pRec = getPicYuvAddr(m_pcPic->getPicYuvRec(), iYCbCr, iAddr);
    1179 
    1180       iStartX = (uiLPelX == 0) ? 1 : 0;
    1181       iEndX   = (uiRPelX == iPicWidthTmp) ? iLcuWidth-1 : iLcuWidth-numSkipLineRight;
    1182 
    1183       iStartY = (uiTPelY == 0) ? 1 : 0;
    1184       iEndY   = (uiBPelY == iPicHeightTmp) ? iLcuHeight-1 : iLcuHeight-numSkipLine;
    1185       if (uiTPelY == 0)
    1186       {
    1187         pOrg += iStride;
    1188         pRec += iStride;
    1189       }
    1190 
    1191       for (x=iStartX; x<iEndX; x++)
    1192       {
    1193         m_iUpBuff1[x] = xSign(pRec[x] - pRec[x-iStride-1]);
    1194       }
    1195       for (y=iStartY; y<iEndY; y++)
    1196       {
    1197         iSignDown2 = xSign(pRec[iStride+iStartX] - pRec[iStartX-1]);
    1198         for (x=iStartX; x<iEndX; x++)
    1199         {
    1200           iSignDown1      =  xSign(pRec[x] - pRec[x+iStride+1]) ;
    1201           uiEdgeType      =  iSignDown1 + m_iUpBuff1[x] + 2;
    1202           m_iUpBufft[x+1] = -iSignDown1;
    1203           iStats[m_auiEoTable[uiEdgeType]] += (pOrg[x] - pRec[x]);
    1204           iCount[m_auiEoTable[uiEdgeType]] ++;
    1205         }
    1206         m_iUpBufft[iStartX] = iSignDown2;
    1207         ipSwap     = m_iUpBuff1;
    1208         m_iUpBuff1 = m_iUpBufft;
    1209         m_iUpBufft = ipSwap;
    1210 
    1211         pRec += iStride;
    1212         pOrg += iStride;
    1213       }
    1214     }
    1215   //if (iSaoType == EO_3  )
    1216     {
    1217       if( m_saoLcuBasedOptimization && m_saoLcuBoundary )
    1218       {
    1219         numSkipLine = iIsChroma? 2:4;
    1220         numSkipLineRight = iIsChroma? 3:5;
    1221       }
    1222       iStats = m_iOffsetOrg[iPartIdx][SAO_EO_3];
    1223       iCount = m_iCount    [iPartIdx][SAO_EO_3];
    1224 
    1225       pOrg = getPicYuvAddr(m_pcPic->getPicYuvOrg(), iYCbCr, iAddr);
    1226       pRec = getPicYuvAddr(m_pcPic->getPicYuvRec(), iYCbCr, iAddr);
    1227 
    1228       iStartX = (uiLPelX == 0) ? 1 : 0;
    1229       iEndX   = (uiRPelX == iPicWidthTmp) ? iLcuWidth-1 : iLcuWidth-numSkipLineRight;
    1230 
    1231       iStartY = (uiTPelY == 0) ? 1 : 0;
    1232       iEndY   = (uiBPelY == iPicHeightTmp) ? iLcuHeight-1 : iLcuHeight-numSkipLine;
    1233       if (iStartY == 1)
    1234       {
    1235         pOrg += iStride;
    1236         pRec += iStride;
    1237       }
    1238 
    1239       for (x=iStartX-1; x<iEndX; x++)
    1240       {
    1241         m_iUpBuff1[x] = xSign(pRec[x] - pRec[x-iStride+1]);
    1242       }
    1243 
    1244       for (y=iStartY; y<iEndY; y++)
    1245       {
    1246         for (x=iStartX; x<iEndX; x++)
    1247         {
    1248           iSignDown1      =  xSign(pRec[x] - pRec[x+iStride-1]) ;
    1249           uiEdgeType      =  iSignDown1 + m_iUpBuff1[x] + 2;
    1250           m_iUpBuff1[x-1] = -iSignDown1;
    1251           iStats[m_auiEoTable[uiEdgeType]] += (pOrg[x] - pRec[x]);
    1252           iCount[m_auiEoTable[uiEdgeType]] ++;
    1253         }
    1254         m_iUpBuff1[iEndX-1] = xSign(pRec[iEndX-1 + iStride] - pRec[iEndX]);
    1255 
    1256         pRec += iStride;
    1257         pOrg += iStride;
    1258       }
    1259     }
    1260   }
    1261 }
    1262 
    1263 
    1264 Void TEncSampleAdaptiveOffset::calcSaoStatsCu_BeforeDblk( TComPic* pcPic )
    1265 {
    1266   Int addr, yCbCr;
    1267   Int x,y;
    1268   TComSPS *pTmpSPS =  pcPic->getSlice(0)->getSPS();
    1269 
    1270   Pel* pOrg;
    1271   Pel* pRec;
    1272   Int stride;
    1273   Int lcuHeight = pTmpSPS->getMaxCUHeight();
    1274   Int lcuWidth  = pTmpSPS->getMaxCUWidth();
    1275   UInt rPelX;
    1276   UInt bPelY;
    1277   Int64* stats;
    1278   Int64* count;
    1279   Int classIdx;
    1280   Int picWidthTmp = 0;
    1281   Int picHeightTmp = 0;
    1282   Int startX;
    1283   Int startY;
    1284   Int endX;
    1285   Int endY;
    1286   Int firstX, firstY;
    1287 
    1288   Int idxY;
    1289   Int idxX;
    1290   Int frameHeightInCU = m_iNumCuInHeight;
    1291   Int frameWidthInCU  = m_iNumCuInWidth;
    1292   Int j, k;
    1293 
    1294   Int isChroma;
    1295   Int numSkipLine, numSkipLineRight;
    1296 
    1297   UInt lPelX, tPelY;
    1298   TComDataCU *pTmpCu;
    1299   Pel* pTableBo;
    1300 
    1301   for (idxY = 0; idxY< frameHeightInCU; idxY++)
    1302   {
    1303     for (idxX = 0; idxX< frameWidthInCU; idxX++)
    1304     {
    1305       lcuHeight = pTmpSPS->getMaxCUHeight();
    1306       lcuWidth  = pTmpSPS->getMaxCUWidth();
    1307       addr     = idxX  + frameWidthInCU*idxY;
    1308       pTmpCu = pcPic->getCU(addr);
    1309       lPelX   = pTmpCu->getCUPelX();
    1310       tPelY   = pTmpCu->getCUPelY();
    1311       for( yCbCr = 0; yCbCr < 3; yCbCr++ )
    1312       {
    1313         isChroma = (yCbCr!=0)? 1:0;
    1314 
    1315         for ( j=0;j<MAX_NUM_SAO_TYPE;j++)
    1316         {
    1317           for ( k=0;k< MAX_NUM_SAO_CLASS;k++)
    1318           {
    1319             m_count_PreDblk    [addr][yCbCr][j][k] = 0;
    1320             m_offsetOrg_PreDblk[addr][yCbCr][j][k] = 0;
    1321           } 
    1322         }
    1323         if( yCbCr == 0 )
    1324         {
    1325           picWidthTmp  = m_iPicWidth;
    1326           picHeightTmp = m_iPicHeight;
    1327         }
    1328         else if( yCbCr == 1 )
    1329         {
    1330           picWidthTmp  = m_iPicWidth  >> isChroma;
    1331           picHeightTmp = m_iPicHeight >> isChroma;
    1332           lcuWidth     = lcuWidth    >> isChroma;
    1333           lcuHeight    = lcuHeight   >> isChroma;
    1334           lPelX       = lPelX      >> isChroma;
    1335           tPelY       = tPelY      >> isChroma;
    1336         }
    1337         rPelX       = lPelX + lcuWidth  ;
    1338         bPelY       = tPelY + lcuHeight ;
    1339         rPelX       = rPelX > picWidthTmp  ? picWidthTmp  : rPelX;
    1340         bPelY       = bPelY > picHeightTmp ? picHeightTmp : bPelY;
    1341         lcuWidth     = rPelX - lPelX;
    1342         lcuHeight    = bPelY - tPelY;
    1343 
    1344         stride    =  (yCbCr == 0)? pcPic->getStride(): pcPic->getCStride();
    1345         pTableBo = (yCbCr==0)?m_lumaTableBo:m_chromaTableBo;
    1346 
    1347         //if(iSaoType == BO)
    1348 
    1349         numSkipLine = isChroma? 1:3;
    1350         numSkipLineRight = isChroma? 2:4;
    1351 
    1352         stats = m_offsetOrg_PreDblk[addr][yCbCr][SAO_BO];
    1353         count = m_count_PreDblk[addr][yCbCr][SAO_BO];
    1354 
    1355         pOrg = getPicYuvAddr(pcPic->getPicYuvOrg(), yCbCr, addr);
    1356         pRec = getPicYuvAddr(pcPic->getPicYuvRec(), yCbCr, addr);
    1357 
    1358         startX   = (rPelX == picWidthTmp) ? lcuWidth : lcuWidth-numSkipLineRight;
    1359         startY   = (bPelY == picHeightTmp) ? lcuHeight : lcuHeight-numSkipLine;
    1360 
    1361         for (y=0; y<lcuHeight; y++)
    1362         {
    1363           for (x=0; x<lcuWidth; x++)
    1364           {
    1365             if( x < startX && y < startY )
    1366               continue;
    1367 
    1368             classIdx = pTableBo[pRec[x]];
    1369             if (classIdx)
    1370             {
    1371               stats[classIdx] += (pOrg[x] - pRec[x]);
    1372               count[classIdx] ++;
    1373             }
    1374           }
    1375           pOrg += stride;
    1376           pRec += stride;
    1377         }
    1378 
    1379         Int signLeft;
    1380         Int signRight;
    1381         Int signDown;
    1382         Int signDown1;
    1383         Int signDown2;
    1384 
    1385         UInt uiEdgeType;
    1386 
    1387         //if (iSaoType == EO_0)
    1388 
    1389         numSkipLine = isChroma? 1:3;
    1390         numSkipLineRight = isChroma? 3:5;
    1391 
    1392         stats = m_offsetOrg_PreDblk[addr][yCbCr][SAO_EO_0];
    1393         count = m_count_PreDblk[addr][yCbCr][SAO_EO_0];
    1394 
    1395         pOrg = getPicYuvAddr(pcPic->getPicYuvOrg(), yCbCr, addr);
    1396         pRec = getPicYuvAddr(pcPic->getPicYuvRec(), yCbCr, addr);
    1397 
    1398         startX   = (rPelX == picWidthTmp) ? lcuWidth-1 : lcuWidth-numSkipLineRight;
    1399         startY   = (bPelY == picHeightTmp) ? lcuHeight : lcuHeight-numSkipLine;
    1400         firstX   = (lPelX == 0) ? 1 : 0;
    1401         endX   = (rPelX == picWidthTmp) ? lcuWidth-1 : lcuWidth;
    1402 
    1403         for (y=0; y<lcuHeight; y++)
    1404         {
    1405           signLeft = xSign(pRec[firstX] - pRec[firstX-1]);
    1406           for (x=firstX; x< endX; x++)
    1407           {
    1408             signRight =  xSign(pRec[x] - pRec[x+1]);
    1409             uiEdgeType =  signRight + signLeft + 2;
    1410             signLeft  = -signRight;
    1411 
    1412             if( x < startX && y < startY )
    1413               continue;
    1414 
    1415             stats[m_auiEoTable[uiEdgeType]] += (pOrg[x] - pRec[x]);
    1416             count[m_auiEoTable[uiEdgeType]] ++;
    1417           }
    1418           pOrg += stride;
    1419           pRec += stride;
    1420         }
    1421 
    1422         //if (iSaoType == EO_1)
    1423 
    1424         numSkipLine = isChroma? 2:4;
    1425         numSkipLineRight = isChroma? 2:4;
    1426 
    1427         stats = m_offsetOrg_PreDblk[addr][yCbCr][SAO_EO_1];
    1428         count = m_count_PreDblk[addr][yCbCr][SAO_EO_1];
    1429 
    1430         pOrg = getPicYuvAddr(pcPic->getPicYuvOrg(), yCbCr, addr);
    1431         pRec = getPicYuvAddr(pcPic->getPicYuvRec(), yCbCr, addr);
    1432 
    1433         startX   = (rPelX == picWidthTmp) ? lcuWidth : lcuWidth-numSkipLineRight;
    1434         startY   = (bPelY == picHeightTmp) ? lcuHeight-1 : lcuHeight-numSkipLine;
    1435         firstY = (tPelY == 0) ? 1 : 0;
    1436         endY   = (bPelY == picHeightTmp) ? lcuHeight-1 : lcuHeight;
    1437         if (firstY == 1)
    1438         {
    1439           pOrg += stride;
    1440           pRec += stride;
    1441         }
    1442 
    1443         for (x=0; x< lcuWidth; x++)
    1444         {
    1445           m_iUpBuff1[x] = xSign(pRec[x] - pRec[x-stride]);
    1446         }
    1447         for (y=firstY; y<endY; y++)
    1448         {
    1449           for (x=0; x<lcuWidth; x++)
    1450           {
    1451             signDown     =  xSign(pRec[x] - pRec[x+stride]);
    1452             uiEdgeType    =  signDown + m_iUpBuff1[x] + 2;
    1453             m_iUpBuff1[x] = -signDown;
    1454 
    1455             if( x < startX && y < startY )
    1456               continue;
    1457 
    1458             stats[m_auiEoTable[uiEdgeType]] += (pOrg[x] - pRec[x]);
    1459             count[m_auiEoTable[uiEdgeType]] ++;
    1460           }
    1461           pOrg += stride;
    1462           pRec += stride;
    1463         }
    1464 
    1465         //if (iSaoType == EO_2)
    1466 
    1467         numSkipLine = isChroma? 2:4;
    1468         numSkipLineRight = isChroma? 3:5;
    1469 
    1470         stats = m_offsetOrg_PreDblk[addr][yCbCr][SAO_EO_2];
    1471         count = m_count_PreDblk[addr][yCbCr][SAO_EO_2];
    1472 
    1473         pOrg = getPicYuvAddr(pcPic->getPicYuvOrg(), yCbCr, addr);
    1474         pRec = getPicYuvAddr(pcPic->getPicYuvRec(), yCbCr, addr);
    1475 
    1476         startX   = (rPelX == picWidthTmp) ? lcuWidth-1 : lcuWidth-numSkipLineRight;
    1477         startY   = (bPelY == picHeightTmp) ? lcuHeight-1 : lcuHeight-numSkipLine;
    1478         firstX   = (lPelX == 0) ? 1 : 0;
    1479         firstY = (tPelY == 0) ? 1 : 0;
    1480         endX   = (rPelX == picWidthTmp) ? lcuWidth-1 : lcuWidth;
    1481         endY   = (bPelY == picHeightTmp) ? lcuHeight-1 : lcuHeight;
    1482         if (firstY == 1)
    1483         {
    1484           pOrg += stride;
    1485           pRec += stride;
    1486         }
    1487 
    1488         for (x=firstX; x<endX; x++)
    1489         {
    1490           m_iUpBuff1[x] = xSign(pRec[x] - pRec[x-stride-1]);
    1491         }
    1492         for (y=firstY; y<endY; y++)
    1493         {
    1494           signDown2 = xSign(pRec[stride+startX] - pRec[startX-1]);
    1495           for (x=firstX; x<endX; x++)
    1496           {
    1497             signDown1      =  xSign(pRec[x] - pRec[x+stride+1]) ;
    1498             uiEdgeType      =  signDown1 + m_iUpBuff1[x] + 2;
    1499             m_iUpBufft[x+1] = -signDown1;
    1500 
    1501             if( x < startX && y < startY )
    1502               continue;
    1503 
    1504             stats[m_auiEoTable[uiEdgeType]] += (pOrg[x] - pRec[x]);
    1505             count[m_auiEoTable[uiEdgeType]] ++;
    1506           }
    1507           m_iUpBufft[firstX] = signDown2;
    1508           ipSwap     = m_iUpBuff1;
    1509           m_iUpBuff1 = m_iUpBufft;
    1510           m_iUpBufft = ipSwap;
    1511 
    1512           pRec += stride;
    1513           pOrg += stride;
    1514         }
    1515 
    1516         //if (iSaoType == EO_3)
    1517 
    1518         numSkipLine = isChroma? 2:4;
    1519         numSkipLineRight = isChroma? 3:5;
    1520 
    1521         stats = m_offsetOrg_PreDblk[addr][yCbCr][SAO_EO_3];
    1522         count = m_count_PreDblk[addr][yCbCr][SAO_EO_3];
    1523 
    1524         pOrg = getPicYuvAddr(pcPic->getPicYuvOrg(), yCbCr, addr);
    1525         pRec = getPicYuvAddr(pcPic->getPicYuvRec(), yCbCr, addr);
    1526 
    1527         startX   = (rPelX == picWidthTmp) ? lcuWidth-1 : lcuWidth-numSkipLineRight;
    1528         startY   = (bPelY == picHeightTmp) ? lcuHeight-1 : lcuHeight-numSkipLine;
    1529         firstX   = (lPelX == 0) ? 1 : 0;
    1530         firstY = (tPelY == 0) ? 1 : 0;
    1531         endX   = (rPelX == picWidthTmp) ? lcuWidth-1 : lcuWidth;
    1532         endY   = (bPelY == picHeightTmp) ? lcuHeight-1 : lcuHeight;
    1533         if (firstY == 1)
    1534         {
    1535           pOrg += stride;
    1536           pRec += stride;
    1537         }
    1538 
    1539         for (x=firstX-1; x<endX; x++)
    1540         {
    1541           m_iUpBuff1[x] = xSign(pRec[x] - pRec[x-stride+1]);
    1542         }
    1543 
    1544         for (y=firstY; y<endY; y++)
    1545         {
    1546           for (x=firstX; x<endX; x++)
    1547           {
    1548             signDown1      =  xSign(pRec[x] - pRec[x+stride-1]) ;
    1549             uiEdgeType      =  signDown1 + m_iUpBuff1[x] + 2;
    1550             m_iUpBuff1[x-1] = -signDown1;
    1551 
    1552             if( x < startX && y < startY )
    1553               continue;
    1554 
    1555             stats[m_auiEoTable[uiEdgeType]] += (pOrg[x] - pRec[x]);
    1556             count[m_auiEoTable[uiEdgeType]] ++;
    1557           }
    1558           m_iUpBuff1[endX-1] = xSign(pRec[endX-1 + stride] - pRec[endX]);
    1559 
    1560           pRec += stride;
    1561           pOrg += stride;
    1562         }
    1563       }
    1564     }
    1565   }
    1566 }
    1567 
    1568 
    1569 /** get SAO statistics
    1570  * \param  *psQTPart,  iYCbCr
    1571  */
    1572 Void TEncSampleAdaptiveOffset::getSaoStats(SAOQTPart *psQTPart, Int iYCbCr)
    1573 {
    1574   Int iLevelIdx, iPartIdx, iTypeIdx, iClassIdx;
    1575   Int i;
    1576   Int iNumTotalType = MAX_NUM_SAO_TYPE;
    1577   Int LcuIdxX;
    1578   Int LcuIdxY;
    1579   Int iAddr;
    1580   Int iFrameWidthInCU = m_pcPic->getFrameWidthInCU();
    1581   Int iDownPartIdx;
    1582   Int iPartStart;
    1583   Int iPartEnd;
    1584   SAOQTPart*  pOnePart;
    1585 
    1586   if (m_uiMaxSplitLevel == 0)
    1587   {
    1588     iPartIdx = 0;
    1589     pOnePart = &(psQTPart[iPartIdx]);
    1590     for (LcuIdxY = pOnePart->StartCUY; LcuIdxY<= pOnePart->EndCUY; LcuIdxY++)
    1591     {
    1592       for (LcuIdxX = pOnePart->StartCUX; LcuIdxX<= pOnePart->EndCUX; LcuIdxX++)
    1593       {
    1594         iAddr = LcuIdxY*iFrameWidthInCU + LcuIdxX;
    1595         calcSaoStatsCu(iAddr, iPartIdx, iYCbCr);
    1596       }
    1597     }
    1598   }
    1599   else
    1600   {
    1601     for(iPartIdx=m_aiNumCulPartsLevel[m_uiMaxSplitLevel-1]; iPartIdx<m_aiNumCulPartsLevel[m_uiMaxSplitLevel]; iPartIdx++)
    1602     {
    1603       pOnePart = &(psQTPart[iPartIdx]);
    1604       for (LcuIdxY = pOnePart->StartCUY; LcuIdxY<= pOnePart->EndCUY; LcuIdxY++)
    1605       {
    1606         for (LcuIdxX = pOnePart->StartCUX; LcuIdxX<= pOnePart->EndCUX; LcuIdxX++)
    1607         {
    1608           iAddr = LcuIdxY*iFrameWidthInCU + LcuIdxX;
    1609           calcSaoStatsCu(iAddr, iPartIdx, iYCbCr);
    1610         }
    1611       }
    1612     }
    1613     for (iLevelIdx = m_uiMaxSplitLevel-1; iLevelIdx>=0; iLevelIdx-- )
    1614     {
    1615       iPartStart = (iLevelIdx > 0) ? m_aiNumCulPartsLevel[iLevelIdx-1] : 0;
    1616       iPartEnd   = m_aiNumCulPartsLevel[iLevelIdx];
    1617 
    1618       for(iPartIdx = iPartStart; iPartIdx < iPartEnd; iPartIdx++)
    1619       {
    1620         pOnePart = &(psQTPart[iPartIdx]);
    1621         for (i=0; i< NUM_DOWN_PART; i++)
    1622         {
    1623           iDownPartIdx = pOnePart->DownPartsIdx[i];
    1624           for (iTypeIdx=0; iTypeIdx<iNumTotalType; iTypeIdx++)
    1625           {
    1626             for (iClassIdx=0; iClassIdx< (iTypeIdx < SAO_BO ? m_iNumClass[iTypeIdx] : SAO_MAX_BO_CLASSES) +1; iClassIdx++)
    1627             {
    1628               m_iOffsetOrg[iPartIdx][iTypeIdx][iClassIdx] += m_iOffsetOrg[iDownPartIdx][iTypeIdx][iClassIdx];
    1629               m_iCount [iPartIdx][iTypeIdx][iClassIdx]    += m_iCount [iDownPartIdx][iTypeIdx][iClassIdx];
    1630             }
    1631           }
    1632         }
    1633       }
    1634     }
    1635   }
    1636 }
    1637 
    1638 /** reset offset statistics
    1639  * \param
    1640  */
    1641 Void TEncSampleAdaptiveOffset::resetStats()
    1642 {
    1643   for (Int i=0;i<m_iNumTotalParts;i++)
    1644   {
    1645     m_dCostPartBest[i] = MAX_DOUBLE;
    1646     m_iTypePartBest[i] = -1;
    1647     m_iDistOrg[i] = 0;
    1648     for (Int j=0;j<MAX_NUM_SAO_TYPE;j++)
    1649     {
    1650       m_iDist[i][j] = 0;
    1651       m_iRate[i][j] = 0;
    1652       m_dCost[i][j] = 0;
    1653       for (Int k=0;k<MAX_NUM_SAO_CLASS;k++)
    1654       {
    1655         m_iCount [i][j][k] = 0;
    1656         m_iOffset[i][j][k] = 0;
    1657         m_iOffsetOrg[i][j][k] = 0;
    1658       } 
    1659     }
    1660   }
    1661 }
    1662 
    1663 #if SAO_CHROMA_LAMBDA
    1664 /** Sample adaptive offset process
    1665  * \param pcSaoParam
    1666  * \param dLambdaLuma
    1667  * \param dLambdaChroma
    1668  */
    1669 #if SAO_ENCODING_CHOICE
    1670 Void TEncSampleAdaptiveOffset::SAOProcess(SAOParam *pcSaoParam, Double dLambdaLuma, Double dLambdaChroma, Int depth)
    1671 #else
    1672 Void TEncSampleAdaptiveOffset::SAOProcess(SAOParam *pcSaoParam, Double dLambdaLuma, Double dLambdaChroma)
    1673 #endif
    1674 #else
    1675 /** Sample adaptive offset process
    1676  * \param dLambda
    1677  */
    1678 Void TEncSampleAdaptiveOffset::SAOProcess(SAOParam *pcSaoParam, Double dLambda)
    1679 #endif
    1680 {
    1681   if(m_bUseNIF)
    1682   {
    1683     m_pcPic->getPicYuvRec()->copyToPic(m_pcYuvTmp);
    1684   }
    1685 
    1686   m_uiSaoBitIncreaseY = max(g_bitDepthY - 10, 0);
    1687   m_uiSaoBitIncreaseC = max(g_bitDepthC - 10, 0);
    1688   m_iOffsetThY = 1 << min(g_bitDepthY - 5, 5);
    1689   m_iOffsetThC = 1 << min(g_bitDepthC - 5, 5);
    1690   resetSAOParam(pcSaoParam);
    1691   if( !m_saoLcuBasedOptimization || !m_saoLcuBoundary )
    1692   {
    1693     resetStats();
    1694   }
    1695   Double dCostFinal = 0;
    1696   if ( m_saoLcuBasedOptimization)
    1697   {
    1698 #if SAO_ENCODING_CHOICE
    1699     rdoSaoUnitAll(pcSaoParam, dLambdaLuma, dLambdaChroma, depth);
    1700 #else
    1701     rdoSaoUnitAll(pcSaoParam, dLambdaLuma, dLambdaChroma);
    1702 #endif
    1703   }
    1704   else
    1705   {
    1706     pcSaoParam->bSaoFlag[0] = 1;
    1707     pcSaoParam->bSaoFlag[1] = 0;
    1708     dCostFinal = 0;
    1709     Double lambdaRdo =  dLambdaLuma;
    1710     resetStats();
    1711     getSaoStats(pcSaoParam->psSaoPart[0], 0);
    1712     runQuadTreeDecision(pcSaoParam->psSaoPart[0], 0, dCostFinal, m_uiMaxSplitLevel, lambdaRdo, 0);
    1713     pcSaoParam->bSaoFlag[0] = dCostFinal < 0 ? 1:0;
    1714     if(pcSaoParam->bSaoFlag[0])
    1715     {
    1716       convertQT2SaoUnit(pcSaoParam, 0, 0);
    1717       assignSaoUnitSyntax(pcSaoParam->saoLcuParam[0],  pcSaoParam->psSaoPart[0], pcSaoParam->oneUnitFlag[0], 0);
    1718     }
    1719   }
    1720   if (pcSaoParam->bSaoFlag[0])
    1721   {
    1722     processSaoUnitAll( pcSaoParam->saoLcuParam[0], pcSaoParam->oneUnitFlag[0], 0);
    1723   }
    1724   if (pcSaoParam->bSaoFlag[1])
    1725   {
    1726     processSaoUnitAll( pcSaoParam->saoLcuParam[1], pcSaoParam->oneUnitFlag[1], 1);
    1727     processSaoUnitAll( pcSaoParam->saoLcuParam[2], pcSaoParam->oneUnitFlag[2], 2);
    1728   }
    1729 }
    1730 /** Check merge SAO unit
    1731  * \param saoUnitCurr current SAO unit
    1732  * \param saoUnitCheck SAO unit tobe check
    1733  * \param dir direction
    1734  */
    1735 Void TEncSampleAdaptiveOffset::checkMerge(SaoLcuParam * saoUnitCurr, SaoLcuParam * saoUnitCheck, Int dir)
    1736 {
    1737   Int i ;
    1738   Int countDiff = 0;
    1739   if (saoUnitCurr->partIdx != saoUnitCheck->partIdx)
    1740   {
    1741     if (saoUnitCurr->typeIdx !=-1)
    1742     {
    1743       if (saoUnitCurr->typeIdx == saoUnitCheck->typeIdx)
    1744       {
    1745         for (i=0;i<saoUnitCurr->length;i++)
    1746         {
    1747           countDiff += (saoUnitCurr->offset[i] != saoUnitCheck->offset[i]);
    1748         }
    1749         countDiff += (saoUnitCurr->subTypeIdx != saoUnitCheck->subTypeIdx);
    1750         if (countDiff ==0)
    1751         {
    1752           saoUnitCurr->partIdx = saoUnitCheck->partIdx;
    1753           if (dir == 1)
    1754           {
    1755             saoUnitCurr->mergeUpFlag = 1;
    1756             saoUnitCurr->mergeLeftFlag = 0;
    1757           }
    1758           else
    1759           {
    1760             saoUnitCurr->mergeUpFlag = 0;
    1761             saoUnitCurr->mergeLeftFlag = 1;
    1762           }
    1763         }
    1764       }
    1765     }
    1766     else
    1767     {
    1768       if (saoUnitCurr->typeIdx == saoUnitCheck->typeIdx)
    1769       {
    1770         saoUnitCurr->partIdx = saoUnitCheck->partIdx;
    1771         if (dir == 1)
    1772         {
    1773           saoUnitCurr->mergeUpFlag = 1;
    1774           saoUnitCurr->mergeLeftFlag = 0;
    1775         }
    1776         else
    1777         {
    1778           saoUnitCurr->mergeUpFlag = 0;
    1779           saoUnitCurr->mergeLeftFlag = 1;
    1780         }
    1781       }
    1782     }
    1783   }
    1784 }
    1785 /** Assign SAO unit syntax from picture-based algorithm
    1786  * \param saoLcuParam SAO LCU parameters
    1787  * \param saoPart SAO part
    1788  * \param oneUnitFlag SAO one unit flag
    1789  * \param iYCbCr color component Index
    1790  */
    1791 Void TEncSampleAdaptiveOffset::assignSaoUnitSyntax(SaoLcuParam* saoLcuParam,  SAOQTPart* saoPart, Bool &oneUnitFlag, Int yCbCr)
    1792 {
    1793   if (saoPart->bSplit == 0)
    1794   {
    1795     oneUnitFlag = 1;
    1796   }
    1797   else
    1798   {
    1799     Int i,j, addr, addrUp, addrLeft,  idx, idxUp, idxLeft,  idxCount;
    1800 
    1801     oneUnitFlag = 0;
    1802 
    1803     idxCount = -1;
    1804     saoLcuParam[0].mergeUpFlag = 0;
    1805     saoLcuParam[0].mergeLeftFlag = 0;
    1806 
    1807     for (j=0;j<m_iNumCuInHeight;j++)
    1808     {
    1809       for (i=0;i<m_iNumCuInWidth;i++)
    1810       {
    1811         addr     = i + j*m_iNumCuInWidth;
    1812         addrLeft = (addr%m_iNumCuInWidth == 0) ? -1 : addr - 1;
    1813         addrUp   = (addr<m_iNumCuInWidth)      ? -1 : addr - m_iNumCuInWidth;
    1814         idx      = saoLcuParam[addr].partIdxTmp;
    1815         idxLeft  = (addrLeft == -1) ? -1 : saoLcuParam[addrLeft].partIdxTmp;
    1816         idxUp    = (addrUp == -1)   ? -1 : saoLcuParam[addrUp].partIdxTmp;
    1817 
    1818         if(idx!=idxLeft && idx!=idxUp)
    1819         {
    1820           saoLcuParam[addr].mergeUpFlag   = 0; idxCount++;
    1821           saoLcuParam[addr].mergeLeftFlag = 0;
    1822           saoLcuParam[addr].partIdx = idxCount;
    1823         }
    1824         else if (idx==idxLeft)
    1825         {
    1826           saoLcuParam[addr].mergeUpFlag   = 1;
    1827           saoLcuParam[addr].mergeLeftFlag = 1;
    1828           saoLcuParam[addr].partIdx = saoLcuParam[addrLeft].partIdx;
    1829         }
    1830         else if (idx==idxUp)
    1831         {
    1832           saoLcuParam[addr].mergeUpFlag   = 1;
    1833           saoLcuParam[addr].mergeLeftFlag = 0;
    1834           saoLcuParam[addr].partIdx = saoLcuParam[addrUp].partIdx;
    1835         }
    1836         if (addrUp != -1)
    1837         {
    1838           checkMerge(&saoLcuParam[addr], &saoLcuParam[addrUp], 1);
    1839         }
    1840         if (addrLeft != -1)
    1841         {
    1842           checkMerge(&saoLcuParam[addr], &saoLcuParam[addrLeft], 0);
    1843         }
    1844       }
    1845     }
    1846   }
    1847 }
    1848 /** rate distortion optimization of all SAO units
    1849  * \param saoParam SAO parameters
    1850  * \param lambda
    1851  * \param lambdaChroma
    1852  */
    1853 #if SAO_ENCODING_CHOICE
    1854 Void TEncSampleAdaptiveOffset::rdoSaoUnitAll(SAOParam *saoParam, Double lambda, Double lambdaChroma, Int depth)
    1855 #else
    1856 Void TEncSampleAdaptiveOffset::rdoSaoUnitAll(SAOParam *saoParam, Double lambda, Double lambdaChroma)
    1857 #endif
    1858 {
    1859 
    1860   Int idxY;
    1861   Int idxX;
    1862   Int frameHeightInCU = saoParam->numCuInHeight;
    1863   Int frameWidthInCU  = saoParam->numCuInWidth;
    1864   Int j, k;
    1865   Int addr = 0;
    1866   Int addrUp = -1;
    1867   Int addrLeft = -1;
    1868   Int compIdx = 0;
    1869   SaoLcuParam mergeSaoParam[3][2];
    1870   Double compDistortion[3];
    1871 
    1872   saoParam->bSaoFlag[0] = true;
    1873   saoParam->bSaoFlag[1] = true;
    1874   saoParam->oneUnitFlag[0] = false;
    1875   saoParam->oneUnitFlag[1] = false;
    1876   saoParam->oneUnitFlag[2] = false;
     242  m_pcRDGoOnSbacCoder->setSlice(pcSlice);
     243  m_pcRDGoOnSbacCoder->resetEntropy();
     244  m_pcRDGoOnSbacCoder->resetBits();
     245
     246  m_pcRDGoOnSbacCoder->store( m_pppcRDSbacCoder[SAO_CABACSTATE_PIC_INIT]);
     247}
     248
     249
     250
     251Void TEncSampleAdaptiveOffset::SAOProcess(TComPic* pPic, Bool* sliceEnabled, const Double *lambdas
     252#if SAO_ENCODE_ALLOW_USE_PREDEBLOCK
     253                                         , Bool isPreDBFSamplesUsed
     254#endif
     255                                          )
     256{
     257  TComPicYuv* orgYuv= pPic->getPicYuvOrg();
     258  TComPicYuv* resYuv= pPic->getPicYuvRec();
     259  m_lambda[SAO_Y]= lambdas[0]; m_lambda[SAO_Cb]= lambdas[1]; m_lambda[SAO_Cr]= lambdas[2];
     260  TComPicYuv* srcYuv = m_tempPicYuv;
     261  resYuv->copyToPic(srcYuv);
     262  srcYuv->setBorderExtension(false);
     263  srcYuv->extendPicBorder();
     264
     265  //collect statistics
     266  getStatistics(m_statData, orgYuv, srcYuv, pPic);
     267#if SAO_ENCODE_ALLOW_USE_PREDEBLOCK
     268  if(isPreDBFSamplesUsed)
     269  {
     270    addPreDBFStatistics(m_statData);
     271  }
     272#endif
     273  //slice on/off
     274  decidePicParams(sliceEnabled, pPic->getSlice(0)->getDepth());
     275
     276  //block on/off
     277  SAOBlkParam* reconParams = new SAOBlkParam[m_numCTUsPic]; //temporary parameter buffer for storing reconstructed SAO parameters
     278  decideBlkParams(pPic, sliceEnabled, m_statData, srcYuv, resYuv, reconParams, pPic->getPicSym()->getSAOBlkParam());
     279  delete[] reconParams;
     280
     281}
     282
     283#if SAO_ENCODE_ALLOW_USE_PREDEBLOCK
     284Void TEncSampleAdaptiveOffset::getPreDBFStatistics(TComPic* pPic)
     285{
     286  getStatistics(m_preDBFstatData, pPic->getPicYuvOrg(), pPic->getPicYuvRec(), pPic, true);
     287}
     288
     289Void TEncSampleAdaptiveOffset::addPreDBFStatistics(SAOStatData*** blkStats)
     290{
     291  for(Int n=0; n< m_numCTUsPic; n++)
     292  {
     293    for(Int compIdx=0; compIdx < NUM_SAO_COMPONENTS; compIdx++)
     294    {
     295      for(Int typeIdc=0; typeIdc < NUM_SAO_NEW_TYPES; typeIdc++)
     296      {
     297        blkStats[n][compIdx][typeIdc] += m_preDBFstatData[n][compIdx][typeIdc];
     298      }
     299    }
     300  }
     301}
     302
     303#endif
     304
     305Void TEncSampleAdaptiveOffset::getStatistics(SAOStatData*** blkStats, TComPicYuv* orgYuv, TComPicYuv* srcYuv, TComPic* pPic
     306#if SAO_ENCODE_ALLOW_USE_PREDEBLOCK
     307                          , Bool isCalculatePreDeblockSamples
     308#endif
     309                          )
     310{
     311  Bool isLeftAvail,isRightAvail,isAboveAvail,isBelowAvail,isAboveLeftAvail,isAboveRightAvail,isBelowLeftAvail,isBelowRightAvail;
     312
     313  for(Int ctu= 0; ctu < m_numCTUsPic; ctu++)
     314  {
     315    Int yPos   = (ctu / m_numCTUInWidth)*m_maxCUHeight;
     316    Int xPos   = (ctu % m_numCTUInWidth)*m_maxCUWidth;
     317    Int height = (yPos + m_maxCUHeight > m_picHeight)?(m_picHeight- yPos):m_maxCUHeight;
     318    Int width  = (xPos + m_maxCUWidth  > m_picWidth )?(m_picWidth - xPos):m_maxCUWidth;
     319
     320    pPic->getPicSym()->deriveLoopFilterBoundaryAvailibility(ctu, isLeftAvail,isRightAvail,isAboveAvail,isBelowAvail,isAboveLeftAvail,isAboveRightAvail,isBelowLeftAvail,isBelowRightAvail);
     321
     322    //NOTE: The number of skipped lines during gathering CTU statistics depends on the slice boundary availabilities.
     323    //For simplicity, here only picture boundaries are considered.
     324
     325    isRightAvail      = (xPos + m_maxCUWidth  < m_picWidth );
     326    isBelowAvail      = (yPos + m_maxCUHeight < m_picHeight);
     327    isBelowRightAvail = (isRightAvail && isBelowAvail);
     328    isBelowLeftAvail  = ((xPos > 0) && (isBelowAvail));
     329    isAboveRightAvail = ((yPos > 0) && (isRightAvail));
     330
     331    for(Int compIdx=0; compIdx< NUM_SAO_COMPONENTS; compIdx++)
     332    {
     333      Bool isLuma     = (compIdx == SAO_Y);
     334      Int  formatShift= isLuma?0:1;
     335
     336      Int  srcStride = isLuma?srcYuv->getStride():srcYuv->getCStride();
     337      Pel* srcBlk    = getPicBuf(srcYuv, compIdx)+ (yPos >> formatShift)*srcStride+ (xPos >> formatShift);
     338
     339      Int  orgStride  = isLuma?orgYuv->getStride():orgYuv->getCStride();
     340      Pel* orgBlk     = getPicBuf(orgYuv, compIdx)+ (yPos >> formatShift)*orgStride+ (xPos >> formatShift);
     341
     342      getBlkStats(compIdx, blkStats[ctu][compIdx] 
     343                , srcBlk, orgBlk, srcStride, orgStride, (width  >> formatShift), (height >> formatShift)
     344                , isLeftAvail,  isRightAvail, isAboveAvail, isBelowAvail, isAboveLeftAvail, isAboveRightAvail, isBelowLeftAvail, isBelowRightAvail
     345#if SAO_ENCODE_ALLOW_USE_PREDEBLOCK
     346                , isCalculatePreDeblockSamples
     347#endif
     348                );
     349
     350    }
     351  }
     352}
     353
     354Void TEncSampleAdaptiveOffset::decidePicParams(Bool* sliceEnabled, Int picTempLayer)
     355{
     356  //decide sliceEnabled[compIdx]
     357  for (Int compIdx=0; compIdx<NUM_SAO_COMPONENTS; compIdx++)
     358  {
     359    // reset flags & counters
     360    sliceEnabled[compIdx] = true;
    1877361
    1878362#if SAO_ENCODING_CHOICE
    1879363#if SAO_ENCODING_CHOICE_CHROMA
    1880   Int numNoSao[2];
    1881   numNoSao[0] = 0;// Luma
    1882   numNoSao[1] = 0;// Chroma
    1883   if( depth > 0 && m_depthSaoRate[0][depth-1] > SAO_ENCODING_RATE )
    1884   {
    1885     saoParam->bSaoFlag[0] = false;
    1886   }
    1887   if( depth > 0 && m_depthSaoRate[1][depth-1] > SAO_ENCODING_RATE_CHROMA )
    1888   {
    1889     saoParam->bSaoFlag[1] = false;
    1890   }
    1891 #else
    1892   Int numNoSao = 0;
    1893 
    1894   if( depth > 0 && m_depth0SaoRate > SAO_ENCODING_RATE )
    1895   {
    1896     saoParam->bSaoFlag[0] = false;
    1897     saoParam->bSaoFlag[1] = false;
    1898   }
    1899 #endif
    1900 #endif
    1901 
    1902   for (idxY = 0; idxY< frameHeightInCU; idxY++)
    1903   {
    1904     for (idxX = 0; idxX< frameWidthInCU; idxX++)
    1905     {
    1906       addr     = idxX  + frameWidthInCU*idxY;
    1907       addrUp   = addr < frameWidthInCU ? -1:idxX   + frameWidthInCU*(idxY-1);
    1908       addrLeft = idxX == 0               ? -1:idxX-1 + frameWidthInCU*idxY;
    1909       Int allowMergeLeft = 1;
    1910       Int allowMergeUp   = 1;
    1911       UInt rate;
    1912       Double bestCost, mergeCost;
    1913       if (idxX!=0)
    1914       {
    1915         // check tile id and slice id
    1916         if ( (m_pcPic->getPicSym()->getTileIdxMap(addr-1) != m_pcPic->getPicSym()->getTileIdxMap(addr)) || (m_pcPic->getCU(addr-1)->getSlice()->getSliceIdx() != m_pcPic->getCU(addr)->getSlice()->getSliceIdx()))
    1917         {
    1918           allowMergeLeft = 0;
    1919         }
    1920       }
    1921       else
    1922       {
    1923         allowMergeLeft = 0;
    1924       }
    1925       if (idxY!=0)
    1926       {
    1927         if ( (m_pcPic->getPicSym()->getTileIdxMap(addr-m_iNumCuInWidth) != m_pcPic->getPicSym()->getTileIdxMap(addr)) || (m_pcPic->getCU(addr-m_iNumCuInWidth)->getSlice()->getSliceIdx() != m_pcPic->getCU(addr)->getSlice()->getSliceIdx()))
    1928         {
    1929           allowMergeUp = 0;
    1930         }
    1931       }
    1932       else
    1933       {
    1934         allowMergeUp = 0;
    1935       }
    1936 
    1937       compDistortion[0] = 0;
    1938       compDistortion[1] = 0;
    1939       compDistortion[2] = 0;
    1940       m_pcRDGoOnSbacCoder->load(m_pppcRDSbacCoder[0][CI_CURR_BEST]);
    1941       if (allowMergeLeft)
    1942       {
    1943         m_pcEntropyCoder->m_pcEntropyCoderIf->codeSaoMerge(0);
    1944       }
    1945       if (allowMergeUp)
    1946       {
    1947         m_pcEntropyCoder->m_pcEntropyCoderIf->codeSaoMerge(0);
    1948       }
    1949       m_pcRDGoOnSbacCoder->store( m_pppcRDSbacCoder[0][CI_TEMP_BEST] );
    1950       // reset stats Y, Cb, Cr
    1951       for ( compIdx=0;compIdx<3;compIdx++)
    1952       {
    1953         for ( j=0;j<MAX_NUM_SAO_TYPE;j++)
    1954         {
    1955           for ( k=0;k< MAX_NUM_SAO_CLASS;k++)
    1956           {
    1957             m_iOffset   [compIdx][j][k] = 0;
    1958             if( m_saoLcuBasedOptimization && m_saoLcuBoundary ){
    1959               m_iCount    [compIdx][j][k] = m_count_PreDblk    [addr][compIdx][j][k];
    1960               m_iOffsetOrg[compIdx][j][k] = m_offsetOrg_PreDblk[addr][compIdx][j][k];
    1961             }
    1962             else
    1963             {
    1964               m_iCount    [compIdx][j][k] = 0;
    1965               m_iOffsetOrg[compIdx][j][k] = 0;
    1966             }
    1967           } 
    1968         }
    1969         saoParam->saoLcuParam[compIdx][addr].typeIdx       =  -1;
    1970         saoParam->saoLcuParam[compIdx][addr].mergeUpFlag   = 0;
    1971         saoParam->saoLcuParam[compIdx][addr].mergeLeftFlag = 0;
    1972         saoParam->saoLcuParam[compIdx][addr].subTypeIdx    = 0;
    1973 #if SAO_ENCODING_CHOICE
    1974   if( (compIdx ==0 && saoParam->bSaoFlag[0])|| (compIdx >0 && saoParam->bSaoFlag[1]) )
    1975 #endif
    1976         {
    1977           calcSaoStatsCu(addr, compIdx,  compIdx);
    1978 
    1979        }
    1980       }
    1981       saoComponentParamDist(allowMergeLeft, allowMergeUp, saoParam, addr, addrUp, addrLeft, 0,  lambda, &mergeSaoParam[0][0], &compDistortion[0]);
    1982       sao2ChromaParamDist(allowMergeLeft, allowMergeUp, saoParam, addr, addrUp, addrLeft, lambdaChroma, &mergeSaoParam[1][0], &mergeSaoParam[2][0], &compDistortion[0]);
    1983      if( saoParam->bSaoFlag[0] || saoParam->bSaoFlag[1] )
    1984       {
    1985         // Cost of new SAO_params
    1986         m_pcRDGoOnSbacCoder->load(m_pppcRDSbacCoder[0][CI_CURR_BEST]);
    1987         m_pcRDGoOnSbacCoder->resetBits();
    1988         if (allowMergeLeft)
    1989         {
    1990           m_pcEntropyCoder->m_pcEntropyCoderIf->codeSaoMerge(0);
    1991         }
    1992         if (allowMergeUp)
    1993         {
    1994           m_pcEntropyCoder->m_pcEntropyCoderIf->codeSaoMerge(0);
    1995         }
    1996         for ( compIdx=0;compIdx<3;compIdx++)
    1997         {
    1998         if( (compIdx ==0 && saoParam->bSaoFlag[0]) || (compIdx >0 && saoParam->bSaoFlag[1]))
    1999           {
    2000            m_pcEntropyCoder->encodeSaoOffset(&saoParam->saoLcuParam[compIdx][addr], compIdx);
    2001           }
    2002         }
    2003 
    2004         rate = m_pcEntropyCoder->getNumberOfWrittenBits();
    2005         bestCost = compDistortion[0] + (Double)rate;
    2006         m_pcRDGoOnSbacCoder->store(m_pppcRDSbacCoder[0][CI_TEMP_BEST]);
    2007 
    2008         // Cost of Merge
    2009         for(Int mergeUp=0; mergeUp<2; ++mergeUp)
    2010         {
    2011           if ( (allowMergeLeft && (mergeUp==0)) || (allowMergeUp && (mergeUp==1)) )
    2012           {
    2013             m_pcRDGoOnSbacCoder->load(m_pppcRDSbacCoder[0][CI_CURR_BEST]);
    2014             m_pcRDGoOnSbacCoder->resetBits();
    2015             if (allowMergeLeft)
    2016             {
    2017               m_pcEntropyCoder->m_pcEntropyCoderIf->codeSaoMerge(1-mergeUp);
    2018             }
    2019             if ( allowMergeUp && (mergeUp==1) )
    2020             {
    2021               m_pcEntropyCoder->m_pcEntropyCoderIf->codeSaoMerge(1);
    2022             }
    2023 
    2024             rate = m_pcEntropyCoder->getNumberOfWrittenBits();
    2025             mergeCost = compDistortion[mergeUp+1] + (Double)rate;
    2026             if (mergeCost < bestCost)
    2027             {
    2028               bestCost = mergeCost;
    2029               m_pcRDGoOnSbacCoder->store(m_pppcRDSbacCoder[0][CI_TEMP_BEST]);             
    2030               for ( compIdx=0;compIdx<3;compIdx++)
    2031               {
    2032                 mergeSaoParam[compIdx][mergeUp].mergeLeftFlag = 1-mergeUp;
    2033                 mergeSaoParam[compIdx][mergeUp].mergeUpFlag = mergeUp;
    2034                 if( (compIdx==0 && saoParam->bSaoFlag[0]) || (compIdx>0 && saoParam->bSaoFlag[1]))
    2035                 {
    2036                   copySaoUnit(&saoParam->saoLcuParam[compIdx][addr], &mergeSaoParam[compIdx][mergeUp] );             
    2037                 }
    2038               }
    2039             }
    2040           }
    2041         }
    2042 #if SAO_ENCODING_CHOICE
    2043 #if SAO_ENCODING_CHOICE_CHROMA
    2044 if( saoParam->saoLcuParam[0][addr].typeIdx == -1)
    2045 {
    2046   numNoSao[0]++;
    2047 }
    2048 if( saoParam->saoLcuParam[1][addr].typeIdx == -1)
    2049 {
    2050   numNoSao[1]+=2;
    2051 }
    2052 #else
    2053         for ( compIdx=0;compIdx<3;compIdx++)
    2054         {
    2055           if( depth == 0 && saoParam->saoLcuParam[compIdx][addr].typeIdx == -1)
    2056           {
    2057             numNoSao++;
    2058           }
    2059         }
    2060 #endif
    2061 #endif
    2062         m_pcRDGoOnSbacCoder->load(m_pppcRDSbacCoder[0][CI_TEMP_BEST]);
    2063         m_pcRDGoOnSbacCoder->store(m_pppcRDSbacCoder[0][CI_CURR_BEST]);
    2064       }
    2065     }
    2066   }
    2067 #if SAO_ENCODING_CHOICE
    2068 #if SAO_ENCODING_CHOICE_CHROMA
    2069   if( !saoParam->bSaoFlag[0])
    2070   {
    2071     m_depthSaoRate[0][depth] = 1.0;
    2072   }
    2073   else
    2074   {
    2075     m_depthSaoRate[0][depth] = numNoSao[0]/((Double) frameHeightInCU*frameWidthInCU);
    2076   }
    2077   if( !saoParam->bSaoFlag[1])
    2078   {
    2079     m_depthSaoRate[1][depth] = 1.0;
    2080   }
    2081   else
    2082   {
    2083     m_depthSaoRate[1][depth] = numNoSao[1]/((Double) frameHeightInCU*frameWidthInCU*2);
    2084   }
    2085 #else
    2086   if( depth == 0)
    2087   {
    2088     // update SAO Rate
    2089     m_depth0SaoRate = numNoSao/((Double) frameHeightInCU*frameWidthInCU*3);
    2090   }
    2091 #endif
    2092 #endif
    2093 
    2094 }
    2095 /** rate distortion optimization of SAO unit
    2096  * \param saoParam SAO parameters
    2097  * \param addr address
    2098  * \param addrUp above address
    2099  * \param addrLeft left address
    2100  * \param yCbCr color component index
    2101  * \param lambda
    2102  */
    2103 inline Int64 TEncSampleAdaptiveOffset::estSaoTypeDist(Int compIdx, Int typeIdx, Int shift, Double lambda, Int *currentDistortionTableBo, Double *currentRdCostTableBo)
    2104 {
    2105   Int64 estDist = 0;
    2106   Int classIdx;
    2107   Int bitDepth = (compIdx==0) ? g_bitDepthY : g_bitDepthC;
    2108   Int saoBitIncrease = (compIdx==0) ? m_uiSaoBitIncreaseY : m_uiSaoBitIncreaseC;
    2109   Int saoOffsetTh = (compIdx==0) ? m_iOffsetThY : m_iOffsetThC;
    2110 
    2111   for(classIdx=1; classIdx < ( (typeIdx < SAO_BO) ?  m_iNumClass[typeIdx]+1 : SAO_MAX_BO_CLASSES+1); classIdx++)
    2112   {
    2113     if( typeIdx == SAO_BO)
    2114     {
    2115       currentDistortionTableBo[classIdx-1] = 0;
    2116       currentRdCostTableBo[classIdx-1] = lambda;
    2117     }
    2118     if(m_iCount [compIdx][typeIdx][classIdx])
    2119     {
    2120       m_iOffset[compIdx][typeIdx][classIdx] = (Int64) xRoundIbdi(bitDepth, (Double)(m_iOffsetOrg[compIdx][typeIdx][classIdx]<<(bitDepth-8)) / (Double)(m_iCount [compIdx][typeIdx][classIdx]<<saoBitIncrease));
    2121       m_iOffset[compIdx][typeIdx][classIdx] = Clip3(-saoOffsetTh+1, saoOffsetTh-1, (Int)m_iOffset[compIdx][typeIdx][classIdx]);
    2122       if (typeIdx < 4)
    2123       {
    2124         if ( m_iOffset[compIdx][typeIdx][classIdx]<0 && classIdx<3 )
    2125         {
    2126           m_iOffset[compIdx][typeIdx][classIdx] = 0;
    2127         }
    2128         if ( m_iOffset[compIdx][typeIdx][classIdx]>0 && classIdx>=3)
    2129         {
    2130           m_iOffset[compIdx][typeIdx][classIdx] = 0;
    2131         }
    2132       }
    2133       m_iOffset[compIdx][typeIdx][classIdx] = estIterOffset( typeIdx, classIdx, lambda, m_iOffset[compIdx][typeIdx][classIdx], m_iCount [compIdx][typeIdx][classIdx], m_iOffsetOrg[compIdx][typeIdx][classIdx], shift, saoBitIncrease, currentDistortionTableBo, currentRdCostTableBo, saoOffsetTh );
    2134     }
    2135     else
    2136     {
    2137       m_iOffsetOrg[compIdx][typeIdx][classIdx] = 0;
    2138       m_iOffset[compIdx][typeIdx][classIdx] = 0;
    2139     }
    2140     if( typeIdx != SAO_BO )
    2141     {
    2142       estDist   += estSaoDist( m_iCount [compIdx][typeIdx][classIdx], m_iOffset[compIdx][typeIdx][classIdx] << saoBitIncrease, m_iOffsetOrg[compIdx][typeIdx][classIdx], shift);
    2143     }
    2144 
    2145   }
    2146   return estDist;
    2147 }
    2148 
    2149 inline Int64 TEncSampleAdaptiveOffset::estSaoDist(Int64 count, Int64 offset, Int64 offsetOrg, Int shift)
    2150 {
    2151   return (( count*offset*offset-offsetOrg*offset*2 ) >> shift);
    2152 }
    2153 inline Int64 TEncSampleAdaptiveOffset::estIterOffset(Int typeIdx, Int classIdx, Double lambda, Int64 offsetInput, Int64 count, Int64 offsetOrg, Int shift, Int bitIncrease, Int *currentDistortionTableBo, Double *currentRdCostTableBo, Int offsetTh )
    2154 {
    2155   //Clean up, best_q_offset.
    2156   Int64 iterOffset, tempOffset;
     364    // decide slice-level on/off based on previous results
     365    if( (picTempLayer > 0)
     366      && (m_saoDisabledRate[compIdx][picTempLayer-1] > ((compIdx==SAO_Y) ? SAO_ENCODING_RATE : SAO_ENCODING_RATE_CHROMA)) )
     367    {
     368      sliceEnabled[compIdx] = false;
     369    }
     370#else
     371    // decide slice-level on/off based on previous results
     372    if( (picTempLayer > 0)
     373      && (m_saoDisabledRate[SAO_Y][0] > SAO_ENCODING_RATE) )
     374    {
     375      sliceEnabled[compIdx] = false;
     376    }
     377#endif
     378#endif
     379  }
     380}
     381
     382Int64 TEncSampleAdaptiveOffset::getDistortion(Int ctu, Int compIdx, Int typeIdc, Int typeAuxInfo, Int* invQuantOffset, SAOStatData& statData)
     383{
     384  Int64 dist=0;
     385  Int inputBitDepth    = (compIdx == SAO_Y) ? g_bitDepthY : g_bitDepthC ;
     386  Int shift = 2 * DISTORTION_PRECISION_ADJUSTMENT(inputBitDepth-8);
     387
     388  switch(typeIdc)
     389  {
     390    case SAO_TYPE_EO_0:
     391    case SAO_TYPE_EO_90:
     392    case SAO_TYPE_EO_135:
     393    case SAO_TYPE_EO_45:
     394      {
     395        for (Int offsetIdx=0; offsetIdx<NUM_SAO_EO_CLASSES; offsetIdx++)
     396        {
     397          dist += estSaoDist( statData.count[offsetIdx], invQuantOffset[offsetIdx], statData.diff[offsetIdx], shift);
     398        }       
     399      }
     400      break;
     401    case SAO_TYPE_BO:
     402      {
     403        for (Int offsetIdx=typeAuxInfo; offsetIdx<typeAuxInfo+4; offsetIdx++)
     404        {
     405          Int bandIdx = offsetIdx % NUM_SAO_BO_CLASSES ;
     406          dist += estSaoDist( statData.count[bandIdx], invQuantOffset[bandIdx], statData.diff[bandIdx], shift);
     407        }
     408      }
     409      break;
     410    default:
     411      {
     412        printf("Not a supported type");
     413        assert(0);
     414        exit(-1);
     415      }
     416  }
     417
     418  return dist;
     419}
     420
     421inline Int64 TEncSampleAdaptiveOffset::estSaoDist(Int64 count, Int64 offset, Int64 diffSum, Int shift)
     422{
     423  return (( count*offset*offset-diffSum*offset*2 ) >> shift);
     424}
     425
     426
     427inline Int TEncSampleAdaptiveOffset::estIterOffset(Int typeIdx, Int classIdx, Double lambda, Int offsetInput, Int64 count, Int64 diffSum, Int shift, Int bitIncrease, Int64& bestDist, Double& bestCost, Int offsetTh )
     428{
     429  Int iterOffset, tempOffset;
    2157430  Int64 tempDist, tempRate;
    2158431  Double tempCost, tempMinCost;
    2159   Int64 offsetOutput = 0;
     432  Int offsetOutput = 0;
    2160433  iterOffset = offsetInput;
    2161434  // Assuming sending quantized value 0 results in zero offset and sending the value zero needs 1 bit. entropy coder can be used to measure the exact rate here.
     
    2163436  while (iterOffset != 0)
    2164437  {
    2165     // Calculate the bits required for signalling the offset
    2166     tempRate = (typeIdx == SAO_BO) ? (abs((Int)iterOffset)+2) : (abs((Int)iterOffset)+1);
    2167     if (abs((Int)iterOffset)==offsetTh-1)
     438    // Calculate the bits required for signaling the offset
     439    tempRate = (typeIdx == SAO_TYPE_BO) ? (abs((Int)iterOffset)+2) : (abs((Int)iterOffset)+1);
     440    if (abs((Int)iterOffset)==offsetTh) //inclusive
    2168441    { 
    2169442      tempRate --;
    2170443    }
    2171     // Do the dequntization before distorion calculation
     444    // Do the dequantization before distortion calculation
    2172445    tempOffset  = iterOffset << bitIncrease;
    2173     tempDist    = estSaoDist( count, tempOffset, offsetOrg, shift);
     446    tempDist    = estSaoDist( count, tempOffset, diffSum, shift);
    2174447    tempCost    = ((Double)tempDist + lambda * (Double) tempRate);
    2175448    if(tempCost < tempMinCost)
     
    2177450      tempMinCost = tempCost;
    2178451      offsetOutput = iterOffset;
    2179       if(typeIdx == SAO_BO)
    2180       {
    2181         currentDistortionTableBo[classIdx-1] = (Int) tempDist;
    2182         currentRdCostTableBo[classIdx-1] = tempCost;
    2183       }
     452      bestDist = tempDist;
     453      bestCost = tempCost;
    2184454    }
    2185455    iterOffset = (iterOffset > 0) ? (iterOffset-1):(iterOffset+1);
     
    2189459
    2190460
    2191 Void TEncSampleAdaptiveOffset::saoComponentParamDist(Int allowMergeLeft, Int allowMergeUp, SAOParam *saoParam, Int addr, Int addrUp, Int addrLeft, Int yCbCr, Double lambda, SaoLcuParam *compSaoParam, Double *compDistortion)
    2192 {
    2193   Int typeIdx;
    2194 
    2195   Int64 estDist;
    2196   Int classIdx;
    2197   Int shift = 2 * DISTORTION_PRECISION_ADJUSTMENT(((yCbCr==0)?g_bitDepthY:g_bitDepthC)-8);
    2198   Int64 bestDist;
    2199 
    2200   SaoLcuParam*  saoLcuParam = &(saoParam->saoLcuParam[yCbCr][addr]);
    2201   SaoLcuParam*  saoLcuParamNeighbor = NULL;
    2202 
    2203   resetSaoUnit(saoLcuParam);
    2204   resetSaoUnit(&compSaoParam[0]);
    2205   resetSaoUnit(&compSaoParam[1]);
    2206 
    2207 
    2208   Double dCostPartBest = MAX_DOUBLE;
    2209 
    2210   Double  bestRDCostTableBo = MAX_DOUBLE;
    2211   Int     bestClassTableBo    = 0;
    2212   Int     currentDistortionTableBo[MAX_NUM_SAO_CLASS];
    2213   Double  currentRdCostTableBo[MAX_NUM_SAO_CLASS];
    2214 
    2215 
    2216   SaoLcuParam   saoLcuParamRdo;   
    2217   Double   estRate = 0;
    2218 
    2219   resetSaoUnit(&saoLcuParamRdo);
    2220 
    2221   m_pcRDGoOnSbacCoder->load(m_pppcRDSbacCoder[0][CI_TEMP_BEST]);
     461Void TEncSampleAdaptiveOffset::deriveOffsets(Int ctu, Int compIdx, Int typeIdc, SAOStatData& statData, Int* quantOffsets, Int& typeAuxInfo)
     462{
     463  Int bitDepth = (compIdx== SAO_Y) ? g_bitDepthY : g_bitDepthC;
     464  Int shift = 2 * DISTORTION_PRECISION_ADJUSTMENT(bitDepth-8);
     465  Int offsetTh = g_saoMaxOffsetQVal[compIdx];  //inclusive
     466
     467  ::memset(quantOffsets, 0, sizeof(Int)*MAX_NUM_SAO_CLASSES);
     468
     469  //derive initial offsets
     470  Int numClasses = (typeIdc == SAO_TYPE_BO)?((Int)NUM_SAO_BO_CLASSES):((Int)NUM_SAO_EO_CLASSES);
     471  for(Int classIdx=0; classIdx< numClasses; classIdx++)
     472  {
     473    if( (typeIdc != SAO_TYPE_BO) && (classIdx==SAO_CLASS_EO_PLAIN)  )
     474    {
     475      continue; //offset will be zero
     476    }
     477
     478    if(statData.count[classIdx] == 0)
     479    {
     480      continue; //offset will be zero
     481    }
     482
     483    quantOffsets[classIdx] = (Int) xRoundIbdi(bitDepth, (Double)( statData.diff[classIdx]<<(bitDepth-8))
     484                                                                  /
     485                                                          (Double)( statData.count[classIdx]<< m_offsetStepLog2[compIdx])
     486                                               );
     487    quantOffsets[classIdx] = Clip3(-offsetTh, offsetTh, quantOffsets[classIdx]);
     488  }
     489
     490  // adjust offsets
     491  switch(typeIdc)
     492  {
     493    case SAO_TYPE_EO_0:
     494    case SAO_TYPE_EO_90:
     495    case SAO_TYPE_EO_135:
     496    case SAO_TYPE_EO_45:
     497      {
     498        Int64 classDist;
     499        Double classCost;
     500        for(Int classIdx=0; classIdx<NUM_SAO_EO_CLASSES; classIdx++) 
     501        {         
     502          if(classIdx==SAO_CLASS_EO_FULL_VALLEY && quantOffsets[classIdx] < 0) quantOffsets[classIdx] =0;
     503          if(classIdx==SAO_CLASS_EO_HALF_VALLEY && quantOffsets[classIdx] < 0) quantOffsets[classIdx] =0;
     504          if(classIdx==SAO_CLASS_EO_HALF_PEAK   && quantOffsets[classIdx] > 0) quantOffsets[classIdx] =0;
     505          if(classIdx==SAO_CLASS_EO_FULL_PEAK   && quantOffsets[classIdx] > 0) quantOffsets[classIdx] =0;
     506
     507          if( quantOffsets[classIdx] != 0 ) //iterative adjustment only when derived offset is not zero
     508          {
     509            quantOffsets[classIdx] = estIterOffset( typeIdc, classIdx, m_lambda[compIdx], quantOffsets[classIdx], statData.count[classIdx], statData.diff[classIdx], shift, m_offsetStepLog2[compIdx], classDist , classCost , offsetTh );
     510          }
     511        }
     512     
     513        typeAuxInfo =0;
     514      }
     515      break;
     516    case SAO_TYPE_BO:
     517      {
     518        Int64  distBOClasses[NUM_SAO_BO_CLASSES];
     519        Double costBOClasses[NUM_SAO_BO_CLASSES];
     520        ::memset(distBOClasses, 0, sizeof(Int64)*NUM_SAO_BO_CLASSES);
     521        for(Int classIdx=0; classIdx< NUM_SAO_BO_CLASSES; classIdx++)
     522        {         
     523          costBOClasses[classIdx]= m_lambda[compIdx];
     524          if( quantOffsets[classIdx] != 0 ) //iterative adjustment only when derived offset is not zero
     525          {
     526            quantOffsets[classIdx] = estIterOffset( typeIdc, classIdx, m_lambda[compIdx], quantOffsets[classIdx], statData.count[classIdx], statData.diff[classIdx], shift, m_offsetStepLog2[compIdx], distBOClasses[classIdx], costBOClasses[classIdx], offsetTh );
     527          }
     528        }
     529
     530        //decide the starting band index
     531        Double minCost = MAX_DOUBLE, cost;
     532        for(Int band=0; band< NUM_SAO_BO_CLASSES- 4+ 1; band++)
     533        {
     534          cost  = costBOClasses[band  ];
     535          cost += costBOClasses[band+1];
     536          cost += costBOClasses[band+2];
     537          cost += costBOClasses[band+3];
     538
     539          if(cost < minCost)
     540          {
     541            minCost = cost;
     542            typeAuxInfo = band;
     543          }
     544        }
     545        //clear those unused classes
     546        Int clearQuantOffset[NUM_SAO_BO_CLASSES];
     547        ::memset(clearQuantOffset, 0, sizeof(Int)*NUM_SAO_BO_CLASSES);
     548        for(Int i=0; i< 4; i++)
     549        {
     550          Int band = (typeAuxInfo+i)%NUM_SAO_BO_CLASSES;
     551          clearQuantOffset[band] = quantOffsets[band];
     552        }
     553        ::memcpy(quantOffsets, clearQuantOffset, sizeof(Int)*NUM_SAO_BO_CLASSES);       
     554      }
     555      break;
     556    default:
     557      {
     558        printf("Not a supported type");
     559        assert(0);
     560        exit(-1);
     561      }
     562
     563  }
     564
     565
     566}
     567
     568
     569Void TEncSampleAdaptiveOffset::deriveModeNewRDO(Int ctu, std::vector<SAOBlkParam*>& mergeList, Bool* sliceEnabled, SAOStatData*** blkStats, SAOBlkParam& modeParam, Double& modeNormCost, TEncSbac** cabacCoderRDO, Int inCabacLabel)
     570{
     571  Double minCost, cost;
     572  Int rate;
     573  UInt previousWrittenBits;
     574  Int64 dist[NUM_SAO_COMPONENTS], modeDist[NUM_SAO_COMPONENTS];
     575  SAOOffset testOffset[NUM_SAO_COMPONENTS];
     576  Int compIdx;
     577  Int invQuantOffset[MAX_NUM_SAO_CLASSES];
     578
     579  modeDist[SAO_Y]= modeDist[SAO_Cb] = modeDist[SAO_Cr] = 0;
     580
     581  //pre-encode merge flags
     582  modeParam[SAO_Y ].modeIdc = SAO_MODE_OFF;
     583  m_pcRDGoOnSbacCoder->load(cabacCoderRDO[inCabacLabel]);
     584  m_pcRDGoOnSbacCoder->codeSAOBlkParam(modeParam, sliceEnabled, (mergeList[SAO_MERGE_LEFT]!= NULL), (mergeList[SAO_MERGE_ABOVE]!= NULL), true);
     585  m_pcRDGoOnSbacCoder->store(cabacCoderRDO[SAO_CABACSTATE_BLK_MID]);
     586
     587  //------ luma --------//
     588  compIdx = SAO_Y;
     589  //"off" case as initial cost
     590  modeParam[compIdx].modeIdc = SAO_MODE_OFF;
    2222591  m_pcRDGoOnSbacCoder->resetBits();
    2223  m_pcEntropyCoder->encodeSaoOffset(&saoLcuParamRdo, yCbCr);
    2224  
    2225   dCostPartBest = m_pcEntropyCoder->getNumberOfWrittenBits()*lambda ;
    2226   copySaoUnit(saoLcuParam, &saoLcuParamRdo );
    2227   bestDist = 0;
    2228  
    2229 
    2230 
    2231   for (typeIdx=0; typeIdx<MAX_NUM_SAO_TYPE; typeIdx++)
    2232   {
    2233     estDist = estSaoTypeDist(yCbCr, typeIdx, shift, lambda, currentDistortionTableBo, currentRdCostTableBo);
    2234 
    2235     if( typeIdx == SAO_BO )
    2236     {
    2237       // Estimate Best Position
    2238       Double currentRDCost = 0.0;
    2239 
    2240       for(Int i=0; i< SAO_MAX_BO_CLASSES -SAO_BO_LEN +1; i++)
    2241       {
    2242         currentRDCost = 0.0;
    2243         for(UInt uj = i; uj < i+SAO_BO_LEN; uj++)
    2244         {
    2245           currentRDCost += currentRdCostTableBo[uj];
    2246         }
    2247 
    2248         if( currentRDCost < bestRDCostTableBo)
    2249         {
    2250           bestRDCostTableBo = currentRDCost;
    2251           bestClassTableBo  = i;
    2252         }
    2253       }
    2254 
    2255       // Re code all Offsets
    2256       // Code Center
    2257       estDist = 0;
    2258       for(classIdx = bestClassTableBo; classIdx < bestClassTableBo+SAO_BO_LEN; classIdx++)
    2259       {
    2260         estDist += currentDistortionTableBo[classIdx];
    2261       }
    2262     }
    2263     resetSaoUnit(&saoLcuParamRdo);
    2264     saoLcuParamRdo.length = m_iNumClass[typeIdx];
    2265     saoLcuParamRdo.typeIdx = typeIdx;
    2266     saoLcuParamRdo.mergeLeftFlag = 0;
    2267     saoLcuParamRdo.mergeUpFlag   = 0;
    2268     saoLcuParamRdo.subTypeIdx = (typeIdx == SAO_BO) ? bestClassTableBo : 0;
    2269     for (classIdx = 0; classIdx < saoLcuParamRdo.length; classIdx++)
    2270     {
    2271       saoLcuParamRdo.offset[classIdx] = (Int)m_iOffset[yCbCr][typeIdx][classIdx+saoLcuParamRdo.subTypeIdx+1];
    2272     }
    2273     m_pcRDGoOnSbacCoder->load(m_pppcRDSbacCoder[0][CI_TEMP_BEST]);
     592  m_pcRDGoOnSbacCoder->codeSAOOffsetParam(compIdx, modeParam[compIdx], sliceEnabled[compIdx]);
     593  modeDist[compIdx] = 0;
     594  minCost= m_lambda[compIdx]*((Double)m_pcRDGoOnSbacCoder->getNumberOfWrittenBits());
     595  m_pcRDGoOnSbacCoder->store(cabacCoderRDO[SAO_CABACSTATE_BLK_TEMP]);
     596  if(sliceEnabled[compIdx])
     597  {
     598    for(Int typeIdc=0; typeIdc< NUM_SAO_NEW_TYPES; typeIdc++)
     599    {
     600      testOffset[compIdx].modeIdc = SAO_MODE_NEW;
     601      testOffset[compIdx].typeIdc = typeIdc;
     602
     603      //derive coded offset
     604      deriveOffsets(ctu, compIdx, typeIdc, blkStats[ctu][compIdx][typeIdc], testOffset[compIdx].offset, testOffset[compIdx].typeAuxInfo);
     605
     606      //inversed quantized offsets
     607      invertQuantOffsets(compIdx, typeIdc, testOffset[compIdx].typeAuxInfo, invQuantOffset, testOffset[compIdx].offset);
     608
     609      //get distortion
     610      dist[compIdx] = getDistortion(ctu, compIdx, testOffset[compIdx].typeIdc, testOffset[compIdx].typeAuxInfo, invQuantOffset, blkStats[ctu][compIdx][typeIdc]);
     611
     612      //get rate
     613      m_pcRDGoOnSbacCoder->load(cabacCoderRDO[SAO_CABACSTATE_BLK_MID]);
     614      m_pcRDGoOnSbacCoder->resetBits();
     615      m_pcRDGoOnSbacCoder->codeSAOOffsetParam(compIdx, testOffset[compIdx], sliceEnabled[compIdx]);
     616      rate = m_pcRDGoOnSbacCoder->getNumberOfWrittenBits();
     617      cost = (Double)dist[compIdx] + m_lambda[compIdx]*((Double)rate);
     618      if(cost < minCost)
     619      {
     620        minCost = cost;
     621        modeDist[compIdx] = dist[compIdx];
     622        modeParam[compIdx]= testOffset[compIdx];
     623        m_pcRDGoOnSbacCoder->store(cabacCoderRDO[SAO_CABACSTATE_BLK_TEMP]);
     624      }
     625    }
     626  }
     627  m_pcRDGoOnSbacCoder->load(cabacCoderRDO[SAO_CABACSTATE_BLK_TEMP]);
     628  m_pcRDGoOnSbacCoder->store(cabacCoderRDO[SAO_CABACSTATE_BLK_MID]);
     629
     630  //------ chroma --------//
     631  //"off" case as initial cost
     632  cost = 0;
     633  previousWrittenBits = 0;
     634  m_pcRDGoOnSbacCoder->resetBits();
     635  for (Int component = SAO_Cb; component < NUM_SAO_COMPONENTS; component++)
     636  {
     637    modeParam[component].modeIdc = SAO_MODE_OFF;
     638    modeDist [component] = 0;
     639
     640    m_pcRDGoOnSbacCoder->codeSAOOffsetParam(component, modeParam[component], sliceEnabled[component]);
     641
     642    const UInt currentWrittenBits = m_pcRDGoOnSbacCoder->getNumberOfWrittenBits();
     643    cost += m_lambda[component] * (currentWrittenBits - previousWrittenBits);
     644    previousWrittenBits = currentWrittenBits;
     645  }
     646
     647  minCost = cost;
     648
     649  //doesn't need to store cabac status here since the whole CTU parameters will be re-encoded at the end of this function
     650
     651  for(Int typeIdc=0; typeIdc< NUM_SAO_NEW_TYPES; typeIdc++)
     652  {
     653    m_pcRDGoOnSbacCoder->load(cabacCoderRDO[SAO_CABACSTATE_BLK_MID]);
    2274654    m_pcRDGoOnSbacCoder->resetBits();
    2275     m_pcEntropyCoder->encodeSaoOffset(&saoLcuParamRdo, yCbCr);
    2276 
    2277     estRate = m_pcEntropyCoder->getNumberOfWrittenBits();
    2278     m_dCost[yCbCr][typeIdx] = (Double)((Double)estDist + lambda * (Double) estRate);
    2279 
    2280     if(m_dCost[yCbCr][typeIdx] < dCostPartBest)
    2281     {
    2282       dCostPartBest = m_dCost[yCbCr][typeIdx];
    2283       copySaoUnit(saoLcuParam, &saoLcuParamRdo );
    2284       bestDist = estDist;       
    2285     }
    2286   }
    2287   compDistortion[0] += ((Double)bestDist/lambda);
    2288   m_pcRDGoOnSbacCoder->load(m_pppcRDSbacCoder[0][CI_TEMP_BEST]);
    2289  m_pcEntropyCoder->encodeSaoOffset(saoLcuParam, yCbCr);
    2290   m_pcRDGoOnSbacCoder->store( m_pppcRDSbacCoder[0][CI_TEMP_BEST] );
    2291 
    2292 
    2293   // merge left or merge up
    2294 
    2295   for (Int idxNeighbor=0;idxNeighbor<2;idxNeighbor++)
    2296   {
    2297     saoLcuParamNeighbor = NULL;
    2298     if (allowMergeLeft && addrLeft>=0 && idxNeighbor ==0)
    2299     {
    2300       saoLcuParamNeighbor = &(saoParam->saoLcuParam[yCbCr][addrLeft]);
    2301     }
    2302     else if (allowMergeUp && addrUp>=0 && idxNeighbor ==1)
    2303     {
    2304       saoLcuParamNeighbor = &(saoParam->saoLcuParam[yCbCr][addrUp]);
    2305     }
    2306     if (saoLcuParamNeighbor!=NULL)
    2307     {
    2308       estDist = 0;
    2309       typeIdx = saoLcuParamNeighbor->typeIdx;
    2310       if (typeIdx>=0)
    2311       {
    2312         Int mergeBandPosition = (typeIdx == SAO_BO)?saoLcuParamNeighbor->subTypeIdx:0;
    2313         Int   merge_iOffset;
    2314         for(classIdx = 0; classIdx < m_iNumClass[typeIdx]; classIdx++)
    2315         {
    2316           merge_iOffset = saoLcuParamNeighbor->offset[classIdx];
    2317           estDist   += estSaoDist(m_iCount [yCbCr][typeIdx][classIdx+mergeBandPosition+1], merge_iOffset, m_iOffsetOrg[yCbCr][typeIdx][classIdx+mergeBandPosition+1],  shift);
    2318         }
    2319       }
    2320       else
    2321       {
    2322         estDist = 0;
    2323       }
    2324 
    2325       copySaoUnit(&compSaoParam[idxNeighbor], saoLcuParamNeighbor );
    2326       compSaoParam[idxNeighbor].mergeUpFlag   = idxNeighbor;
    2327       compSaoParam[idxNeighbor].mergeLeftFlag = !idxNeighbor;
    2328 
    2329       compDistortion[idxNeighbor+1] += ((Double)estDist/lambda);
    2330     }
    2331   }
    2332 }
    2333 Void TEncSampleAdaptiveOffset::sao2ChromaParamDist(Int allowMergeLeft, Int allowMergeUp, SAOParam *saoParam, Int addr, Int addrUp, Int addrLeft, Double lambda, SaoLcuParam *crSaoParam, SaoLcuParam *cbSaoParam, Double *distortion)
    2334 {
    2335   Int typeIdx;
    2336 
    2337   Int64 estDist[2];
    2338   Int classIdx;
    2339   Int shift = 2 * DISTORTION_PRECISION_ADJUSTMENT(g_bitDepthC-8);
    2340   Int64 bestDist = 0;
    2341 
    2342   SaoLcuParam*  saoLcuParam[2] = {&(saoParam->saoLcuParam[1][addr]), &(saoParam->saoLcuParam[2][addr])};
    2343   SaoLcuParam*  saoLcuParamNeighbor[2] = {NULL, NULL};
    2344   SaoLcuParam*  saoMergeParam[2][2];
    2345   saoMergeParam[0][0] = &crSaoParam[0];
    2346   saoMergeParam[0][1] = &crSaoParam[1];
    2347   saoMergeParam[1][0] = &cbSaoParam[0];
    2348   saoMergeParam[1][1] = &cbSaoParam[1];
    2349 
    2350   resetSaoUnit(saoLcuParam[0]);
    2351   resetSaoUnit(saoLcuParam[1]);
    2352   resetSaoUnit(saoMergeParam[0][0]);
    2353   resetSaoUnit(saoMergeParam[0][1]);
    2354   resetSaoUnit(saoMergeParam[1][0]);
    2355   resetSaoUnit(saoMergeParam[1][1]);
    2356 
    2357 
    2358   Double costPartBest = MAX_DOUBLE;
    2359 
    2360   Double  bestRDCostTableBo;
    2361   Int     bestClassTableBo[2]    = {0, 0};
    2362   Int     currentDistortionTableBo[MAX_NUM_SAO_CLASS];
    2363   Double  currentRdCostTableBo[MAX_NUM_SAO_CLASS];
    2364 
    2365   SaoLcuParam   saoLcuParamRdo[2];   
    2366   Double   estRate = 0;
    2367 
    2368   resetSaoUnit(&saoLcuParamRdo[0]);
    2369   resetSaoUnit(&saoLcuParamRdo[1]);
    2370 
    2371   m_pcRDGoOnSbacCoder->load(m_pppcRDSbacCoder[0][CI_TEMP_BEST]);
     655    previousWrittenBits = 0;
     656    cost = 0;
     657
     658    for(compIdx= SAO_Cb; compIdx< NUM_SAO_COMPONENTS; compIdx++)
     659    {
     660      if(!sliceEnabled[compIdx])
     661      {
     662        testOffset[compIdx].modeIdc = SAO_MODE_OFF;
     663        dist[compIdx]= 0;
     664        continue;
     665      }
     666      testOffset[compIdx].modeIdc = SAO_MODE_NEW;
     667      testOffset[compIdx].typeIdc = typeIdc;
     668
     669      //derive offset & get distortion
     670      deriveOffsets(ctu, compIdx, typeIdc, blkStats[ctu][compIdx][typeIdc], testOffset[compIdx].offset, testOffset[compIdx].typeAuxInfo);
     671      invertQuantOffsets(compIdx, typeIdc, testOffset[compIdx].typeAuxInfo, invQuantOffset, testOffset[compIdx].offset);
     672      dist[compIdx]= getDistortion(ctu, compIdx, typeIdc, testOffset[compIdx].typeAuxInfo, invQuantOffset, blkStats[ctu][compIdx][typeIdc]);
     673     
     674      m_pcRDGoOnSbacCoder->codeSAOOffsetParam(compIdx, testOffset[compIdx], sliceEnabled[compIdx]);
     675
     676      const UInt currentWrittenBits = m_pcRDGoOnSbacCoder->getNumberOfWrittenBits();
     677      cost += dist[compIdx] + (m_lambda[compIdx] * (currentWrittenBits - previousWrittenBits));
     678      previousWrittenBits = currentWrittenBits;
     679    }
     680
     681    if(cost < minCost)
     682    {
     683      minCost = cost;
     684      for(compIdx= SAO_Cb; compIdx< NUM_SAO_COMPONENTS; compIdx++)
     685      {
     686        modeDist [compIdx] = dist      [compIdx];
     687        modeParam[compIdx] = testOffset[compIdx];
     688      }
     689    }
     690  }
     691
     692
     693  //----- re-gen rate & normalized cost----//
     694  modeNormCost = 0;
     695  for(UInt component = SAO_Y; component < NUM_SAO_COMPONENTS; component++)
     696  {
     697    modeNormCost += (Double)modeDist[component] / m_lambda[component];
     698  }
     699  m_pcRDGoOnSbacCoder->load(cabacCoderRDO[inCabacLabel]);
    2372700  m_pcRDGoOnSbacCoder->resetBits();
    2373   m_pcEntropyCoder->encodeSaoOffset(&saoLcuParamRdo[0], 1);
    2374   m_pcEntropyCoder->encodeSaoOffset(&saoLcuParamRdo[1], 2);
    2375  
    2376   costPartBest = m_pcEntropyCoder->getNumberOfWrittenBits()*lambda ;
    2377   copySaoUnit(saoLcuParam[0], &saoLcuParamRdo[0] );
    2378   copySaoUnit(saoLcuParam[1], &saoLcuParamRdo[1] );
    2379 
    2380   for (typeIdx=0; typeIdx<MAX_NUM_SAO_TYPE; typeIdx++)
    2381   {
    2382     if( typeIdx == SAO_BO )
    2383     {
    2384       // Estimate Best Position
    2385       for(Int compIdx = 0; compIdx < 2; compIdx++)
    2386       {
    2387         Double currentRDCost = 0.0;
    2388         bestRDCostTableBo = MAX_DOUBLE;
    2389         estDist[compIdx] = estSaoTypeDist(compIdx+1, typeIdx, shift, lambda, currentDistortionTableBo, currentRdCostTableBo);
    2390         for(Int i=0; i< SAO_MAX_BO_CLASSES -SAO_BO_LEN +1; i++)
    2391         {
    2392           currentRDCost = 0.0;
    2393           for(UInt uj = i; uj < i+SAO_BO_LEN; uj++)
     701  m_pcRDGoOnSbacCoder->codeSAOBlkParam(modeParam, sliceEnabled, (mergeList[SAO_MERGE_LEFT]!= NULL), (mergeList[SAO_MERGE_ABOVE]!= NULL), false);
     702  modeNormCost += (Double)m_pcRDGoOnSbacCoder->getNumberOfWrittenBits();
     703
     704}
     705
     706Void TEncSampleAdaptiveOffset::deriveModeMergeRDO(Int ctu, std::vector<SAOBlkParam*>& mergeList, Bool* sliceEnabled, SAOStatData*** blkStats, SAOBlkParam& modeParam, Double& modeNormCost, TEncSbac** cabacCoderRDO, Int inCabacLabel)
     707{
     708  Int mergeListSize = (Int)mergeList.size();
     709  modeNormCost = MAX_DOUBLE;
     710
     711  Double cost;
     712  SAOBlkParam testBlkParam;
     713
     714  for(Int mergeType=0; mergeType< mergeListSize; mergeType++)
     715  {
     716    if(mergeList[mergeType] == NULL)
     717    {
     718      continue;
     719    }
     720
     721    testBlkParam = *(mergeList[mergeType]);
     722    //normalized distortion
     723    Double normDist=0;
     724    for(Int compIdx=0; compIdx< NUM_SAO_COMPONENTS; compIdx++)
     725    {
     726      testBlkParam[compIdx].modeIdc = SAO_MODE_MERGE;
     727      testBlkParam[compIdx].typeIdc = mergeType;
     728
     729      SAOOffset& mergedOffsetParam = (*(mergeList[mergeType]))[compIdx];
     730
     731      if( mergedOffsetParam.modeIdc != SAO_MODE_OFF)
     732      {
     733        //offsets have been reconstructed. Don't call inversed quantization function.
     734        normDist += (((Double)getDistortion(ctu, compIdx, mergedOffsetParam.typeIdc, mergedOffsetParam.typeAuxInfo, mergedOffsetParam.offset, blkStats[ctu][compIdx][mergedOffsetParam.typeIdc]))
     735                       /m_lambda[compIdx]
     736                    );
     737      }
     738
     739    }
     740
     741    //rate
     742    m_pcRDGoOnSbacCoder->load(cabacCoderRDO[inCabacLabel]);
     743    m_pcRDGoOnSbacCoder->resetBits();
     744    m_pcRDGoOnSbacCoder->codeSAOBlkParam(testBlkParam, sliceEnabled, (mergeList[SAO_MERGE_LEFT]!= NULL), (mergeList[SAO_MERGE_ABOVE]!= NULL), false);
     745    Int rate = m_pcRDGoOnSbacCoder->getNumberOfWrittenBits();
     746
     747    cost = normDist+(Double)rate;
     748
     749    if(cost < modeNormCost)
     750    {
     751      modeNormCost = cost;
     752      modeParam    = testBlkParam;
     753      m_pcRDGoOnSbacCoder->store(cabacCoderRDO[SAO_CABACSTATE_BLK_TEMP]);
     754    }
     755  }
     756
     757  m_pcRDGoOnSbacCoder->load(cabacCoderRDO[SAO_CABACSTATE_BLK_TEMP]);
     758
     759
     760}
     761
     762Void TEncSampleAdaptiveOffset::decideBlkParams(TComPic* pic, Bool* sliceEnabled, SAOStatData*** blkStats, TComPicYuv* srcYuv, TComPicYuv* resYuv, SAOBlkParam* reconParams, SAOBlkParam* codedParams)
     763{
     764  Bool isAllBlksDisabled = false;
     765  if(!sliceEnabled[SAO_Y] && !sliceEnabled[SAO_Cb] && !sliceEnabled[SAO_Cr])
     766  {
     767    isAllBlksDisabled = true;
     768  }
     769
     770  m_pcRDGoOnSbacCoder->load(m_pppcRDSbacCoder[ SAO_CABACSTATE_PIC_INIT ]);
     771
     772  SAOBlkParam modeParam;
     773  Double minCost, modeCost;
     774
     775  for(Int ctu=0; ctu< m_numCTUsPic; ctu++)
     776  {
     777    if(isAllBlksDisabled)
     778    {
     779      codedParams[ctu].reset();
     780      continue;
     781    }
     782
     783    m_pcRDGoOnSbacCoder->store(m_pppcRDSbacCoder[ SAO_CABACSTATE_BLK_CUR ]);
     784
     785    //get merge list
     786    std::vector<SAOBlkParam*> mergeList;
     787    getMergeList(pic, ctu, reconParams, mergeList);
     788
     789    minCost = MAX_DOUBLE;
     790    for(Int mode=0; mode < NUM_SAO_MODES; mode++)
     791    {
     792      switch(mode)
     793      {
     794      case SAO_MODE_OFF:
     795        {
     796          continue; //not necessary, since all-off case will be tested in SAO_MODE_NEW case.
     797        }
     798        break;
     799      case SAO_MODE_NEW:
     800        {
     801          deriveModeNewRDO(ctu, mergeList, sliceEnabled, blkStats, modeParam, modeCost, m_pppcRDSbacCoder, SAO_CABACSTATE_BLK_CUR);
     802
     803        }
     804        break;
     805      case SAO_MODE_MERGE:
     806        {
     807          deriveModeMergeRDO(ctu, mergeList, sliceEnabled, blkStats , modeParam, modeCost, m_pppcRDSbacCoder, SAO_CABACSTATE_BLK_CUR);
     808        }
     809        break;
     810      default:
     811        {
     812          printf("Not a supported SAO mode\n");
     813          assert(0);
     814          exit(-1);
     815        }
     816      }
     817
     818      if(modeCost < minCost)
     819      {
     820        minCost = modeCost;
     821        codedParams[ctu] = modeParam;
     822        m_pcRDGoOnSbacCoder->store(m_pppcRDSbacCoder[ SAO_CABACSTATE_BLK_NEXT ]);
     823
     824      }
     825    } //mode
     826    m_pcRDGoOnSbacCoder->load(m_pppcRDSbacCoder[ SAO_CABACSTATE_BLK_NEXT ]);
     827
     828    //apply reconstructed offsets
     829    reconParams[ctu] = codedParams[ctu];
     830    reconstructBlkSAOParam(reconParams[ctu], mergeList);
     831    offsetCTU(ctu, srcYuv, resYuv, reconParams[ctu], pic);
     832  } //ctu
     833
     834#if SAO_ENCODING_CHOICE
     835  Int picTempLayer = pic->getSlice(0)->getDepth();
     836  Int numLcusForSAOOff[NUM_SAO_COMPONENTS];
     837  numLcusForSAOOff[SAO_Y ] = numLcusForSAOOff[SAO_Cb]= numLcusForSAOOff[SAO_Cr]= 0;
     838
     839  for (Int compIdx=0; compIdx<NUM_SAO_COMPONENTS; compIdx++)
     840  {
     841    for(Int ctu=0; ctu< m_numCTUsPic; ctu++)
     842    {
     843      if( reconParams[ctu][compIdx].modeIdc == SAO_MODE_OFF)
     844      {
     845        numLcusForSAOOff[compIdx]++;
     846      }
     847    }
     848  }
     849#if SAO_ENCODING_CHOICE_CHROMA
     850  for (Int compIdx=0; compIdx<NUM_SAO_COMPONENTS; compIdx++)
     851  {
     852    m_saoDisabledRate[compIdx][picTempLayer] = (Double)numLcusForSAOOff[compIdx]/(Double)m_numCTUsPic;
     853  }
     854#else
     855  if (picTempLayer == 0)
     856  {
     857    m_saoDisabledRate[SAO_Y][0] = (Double)(numLcusForSAOOff[SAO_Y]+numLcusForSAOOff[SAO_Cb]+numLcusForSAOOff[SAO_Cr])/(Double)(m_numCTUsPic*3);
     858  }
     859#endif                                             
     860#endif
     861}
     862
     863
     864Void TEncSampleAdaptiveOffset::getBlkStats(Int compIdx, SAOStatData* statsDataTypes 
     865                        , Pel* srcBlk, Pel* orgBlk, Int srcStride, Int orgStride, Int width, Int height
     866                        , Bool isLeftAvail,  Bool isRightAvail, Bool isAboveAvail, Bool isBelowAvail, Bool isAboveLeftAvail, Bool isAboveRightAvail, Bool isBelowLeftAvail, Bool isBelowRightAvail
     867#if SAO_ENCODE_ALLOW_USE_PREDEBLOCK
     868                        , Bool isCalculatePreDeblockSamples
     869#endif
     870                        )
     871{
     872  if(m_lineBufWidth != m_maxCUWidth)
     873  {
     874    m_lineBufWidth = m_maxCUWidth;
     875
     876    if (m_signLineBuf1) delete[] m_signLineBuf1; m_signLineBuf1 = NULL;
     877    m_signLineBuf1 = new Char[m_lineBufWidth+1];
     878
     879    if (m_signLineBuf2) delete[] m_signLineBuf2; m_signLineBuf2 = NULL;
     880    m_signLineBuf2 = new Char[m_lineBufWidth+1];
     881  }
     882
     883  Int x,y, startX, startY, endX, endY, edgeType, firstLineStartX, firstLineEndX;
     884  Char signLeft, signRight, signDown;
     885  Int64 *diff, *count;
     886  Pel *srcLine, *orgLine;
     887  Int* skipLinesR = m_skipLinesR[compIdx];
     888  Int* skipLinesB = m_skipLinesB[compIdx];
     889
     890  for(Int typeIdx=0; typeIdx< NUM_SAO_NEW_TYPES; typeIdx++)
     891  {
     892    SAOStatData& statsData= statsDataTypes[typeIdx];
     893    statsData.reset();
     894
     895    srcLine = srcBlk;
     896    orgLine = orgBlk;
     897    diff    = statsData.diff;
     898    count   = statsData.count;
     899    switch(typeIdx)
     900    {
     901    case SAO_TYPE_EO_0:
     902      {
     903        diff +=2;
     904        count+=2;
     905        endY   = (isBelowAvail) ? (height - skipLinesB[typeIdx]) : height;
     906#if SAO_ENCODE_ALLOW_USE_PREDEBLOCK
     907        startX = (!isCalculatePreDeblockSamples) ? (isLeftAvail  ? 0 : 1)
     908                                                 : (isRightAvail ? (width - skipLinesR[typeIdx]) : (width - 1))
     909                                                 ;
     910#else
     911        startX = isLeftAvail ? 0 : 1;
     912#endif
     913#if SAO_ENCODE_ALLOW_USE_PREDEBLOCK
     914        endX   = (!isCalculatePreDeblockSamples) ? (isRightAvail ? (width - skipLinesR[typeIdx]) : (width - 1))
     915                                                 : (isRightAvail ? width : (width - 1))
     916                                                 ;
     917#else
     918        endX   = isRightAvail ? (width - skipLinesR[typeIdx]): (width - 1);
     919#endif
     920        for (y=0; y<endY; y++)
     921        {
     922          signLeft = (Char)m_sign[srcLine[startX] - srcLine[startX-1]];
     923          for (x=startX; x<endX; x++)
    2394924          {
    2395             currentRDCost += currentRdCostTableBo[uj];
     925            signRight =  (Char)m_sign[srcLine[x] - srcLine[x+1]];
     926            edgeType  =  signRight + signLeft;
     927            signLeft  = -signRight;
     928
     929            diff [edgeType] += (orgLine[x] - srcLine[x]);
     930            count[edgeType] ++;
    2396931          }
    2397 
    2398           if( currentRDCost < bestRDCostTableBo)
     932          srcLine  += srcStride;
     933          orgLine  += orgStride;
     934        }
     935#if SAO_ENCODE_ALLOW_USE_PREDEBLOCK
     936        if(isCalculatePreDeblockSamples)
     937        {
     938          if(isBelowAvail)
    2399939          {
    2400             bestRDCostTableBo = currentRDCost;
    2401             bestClassTableBo[compIdx]  = i;
     940            startX = isLeftAvail  ? 0 : 1;
     941            endX   = isRightAvail ? width : (width -1);
     942
     943            for(y=0; y<skipLinesB[typeIdx]; y++)
     944            {
     945              signLeft = (Char)m_sign[srcLine[startX] - srcLine[startX-1]];
     946              for (x=startX; x<endX; x++)
     947              {
     948                signRight =  (Char)m_sign[srcLine[x] - srcLine[x+1]];
     949                edgeType  =  signRight + signLeft;
     950                signLeft  = -signRight;
     951
     952                diff [edgeType] += (orgLine[x] - srcLine[x]);
     953                count[edgeType] ++;
     954              }
     955              srcLine  += srcStride;
     956              orgLine  += orgStride;
     957            }
    2402958          }
    2403959        }
    2404 
    2405         // Re code all Offsets
    2406         // Code Center
    2407         estDist[compIdx] = 0;
    2408         for(classIdx = bestClassTableBo[compIdx]; classIdx < bestClassTableBo[compIdx]+SAO_BO_LEN; classIdx++)
    2409         {
    2410           estDist[compIdx] += currentDistortionTableBo[classIdx];
    2411         }
    2412       }
    2413     }
    2414     else
    2415     {
    2416       estDist[0] = estSaoTypeDist(1, typeIdx, shift, lambda, currentDistortionTableBo, currentRdCostTableBo);
    2417       estDist[1] = estSaoTypeDist(2, typeIdx, shift, lambda, currentDistortionTableBo, currentRdCostTableBo);
    2418     }
    2419 
    2420     m_pcRDGoOnSbacCoder->load(m_pppcRDSbacCoder[0][CI_TEMP_BEST]);
    2421     m_pcRDGoOnSbacCoder->resetBits();
    2422 
    2423     for(Int compIdx = 0; compIdx < 2; compIdx++)
    2424     {
    2425       resetSaoUnit(&saoLcuParamRdo[compIdx]);
    2426       saoLcuParamRdo[compIdx].length = m_iNumClass[typeIdx];
    2427       saoLcuParamRdo[compIdx].typeIdx = typeIdx;
    2428       saoLcuParamRdo[compIdx].mergeLeftFlag = 0;
    2429       saoLcuParamRdo[compIdx].mergeUpFlag   = 0;
    2430       saoLcuParamRdo[compIdx].subTypeIdx = (typeIdx == SAO_BO) ? bestClassTableBo[compIdx] : 0;
    2431       for (classIdx = 0; classIdx < saoLcuParamRdo[compIdx].length; classIdx++)
    2432       {
    2433         saoLcuParamRdo[compIdx].offset[classIdx] = (Int)m_iOffset[compIdx+1][typeIdx][classIdx+saoLcuParamRdo[compIdx].subTypeIdx+1];
    2434       }
    2435 
    2436       m_pcEntropyCoder->encodeSaoOffset(&saoLcuParamRdo[compIdx], compIdx+1);
    2437     }
    2438     estRate = m_pcEntropyCoder->getNumberOfWrittenBits();
    2439     m_dCost[1][typeIdx] = (Double)((Double)(estDist[0] + estDist[1])  + lambda * (Double) estRate);
    2440    
    2441     if(m_dCost[1][typeIdx] < costPartBest)
    2442     {
    2443       costPartBest = m_dCost[1][typeIdx];
    2444       copySaoUnit(saoLcuParam[0], &saoLcuParamRdo[0] );
    2445       copySaoUnit(saoLcuParam[1], &saoLcuParamRdo[1] );
    2446       bestDist = (estDist[0]+estDist[1]);       
    2447     }
    2448   }
    2449 
    2450   distortion[0] += ((Double)bestDist/lambda);
    2451   m_pcRDGoOnSbacCoder->load(m_pppcRDSbacCoder[0][CI_TEMP_BEST]);
    2452   m_pcEntropyCoder->encodeSaoOffset(saoLcuParam[0], 1);
    2453   m_pcEntropyCoder->encodeSaoOffset(saoLcuParam[1], 2);
    2454   m_pcRDGoOnSbacCoder->store( m_pppcRDSbacCoder[0][CI_TEMP_BEST] );
    2455 
    2456   // merge left or merge up
    2457 
    2458   for (Int idxNeighbor=0;idxNeighbor<2;idxNeighbor++)
    2459   {
    2460     for(Int compIdx = 0; compIdx < 2; compIdx++)
    2461     {
    2462       saoLcuParamNeighbor[compIdx] = NULL;
    2463       if (allowMergeLeft && addrLeft>=0 && idxNeighbor ==0)
    2464       {
    2465         saoLcuParamNeighbor[compIdx] = &(saoParam->saoLcuParam[compIdx+1][addrLeft]);
    2466       }
    2467       else if (allowMergeUp && addrUp>=0 && idxNeighbor ==1)
    2468       {
    2469         saoLcuParamNeighbor[compIdx] = &(saoParam->saoLcuParam[compIdx+1][addrUp]);
    2470       }
    2471       if (saoLcuParamNeighbor[compIdx]!=NULL)
    2472       {
    2473         estDist[compIdx] = 0;
    2474         typeIdx = saoLcuParamNeighbor[compIdx]->typeIdx;
    2475         if (typeIdx>=0)
    2476         {
    2477           Int mergeBandPosition = (typeIdx == SAO_BO)?saoLcuParamNeighbor[compIdx]->subTypeIdx:0;
    2478           Int   merge_iOffset;
    2479           for(classIdx = 0; classIdx < m_iNumClass[typeIdx]; classIdx++)
     960#endif
     961      }
     962      break;
     963    case SAO_TYPE_EO_90:
     964      {
     965        diff +=2;
     966        count+=2;
     967        Char *signUpLine = m_signLineBuf1;
     968
     969#if SAO_ENCODE_ALLOW_USE_PREDEBLOCK
     970        startX = (!isCalculatePreDeblockSamples) ? 0
     971                                                 : (isRightAvail ? (width - skipLinesR[typeIdx]) : width)
     972                                                 ;
     973#endif
     974        startY = isAboveAvail ? 0 : 1;
     975#if SAO_ENCODE_ALLOW_USE_PREDEBLOCK
     976        endX   = (!isCalculatePreDeblockSamples) ? (isRightAvail ? (width - skipLinesR[typeIdx]) : width)
     977                                                 : width
     978                                                 ;
     979#else
     980        endX   = isRightAvail ? (width - skipLinesR[typeIdx]) : width ;
     981#endif
     982        endY   = isBelowAvail ? (height - skipLinesB[typeIdx]) : (height - 1);
     983        if (!isAboveAvail)
     984        {
     985          srcLine += srcStride;
     986          orgLine += orgStride;
     987        }
     988
     989        Pel* srcLineAbove = srcLine - srcStride;
     990#if SAO_ENCODE_ALLOW_USE_PREDEBLOCK
     991        for (x=startX; x<endX; x++)
     992#else
     993        for (x=0; x< endX; x++)
     994#endif
     995        {
     996          signUpLine[x] = (Char)m_sign[srcLine[x] - srcLineAbove[x]];
     997        }
     998
     999        Pel* srcLineBelow;
     1000        for (y=startY; y<endY; y++)
     1001        {
     1002          srcLineBelow = srcLine + srcStride;
     1003
     1004#if SAO_ENCODE_ALLOW_USE_PREDEBLOCK
     1005          for (x=startX; x<endX; x++)
     1006#else
     1007          for (x=0; x<endX; x++)
     1008#endif
    24801009          {
    2481             merge_iOffset = saoLcuParamNeighbor[compIdx]->offset[classIdx];
    2482             estDist[compIdx]   += estSaoDist(m_iCount [compIdx+1][typeIdx][classIdx+mergeBandPosition+1], merge_iOffset, m_iOffsetOrg[compIdx+1][typeIdx][classIdx+mergeBandPosition+1],  shift);
     1010            signDown  = (Char)m_sign[srcLine[x] - srcLineBelow[x]];
     1011            edgeType  = signDown + signUpLine[x];
     1012            signUpLine[x]= -signDown;
     1013
     1014            diff [edgeType] += (orgLine[x] - srcLine[x]);
     1015            count[edgeType] ++;
    24831016          }
    2484         }
    2485         else
    2486         {
    2487           estDist[compIdx] = 0;
    2488         }
    2489 
    2490         copySaoUnit(saoMergeParam[compIdx][idxNeighbor], saoLcuParamNeighbor[compIdx] );
    2491         saoMergeParam[compIdx][idxNeighbor]->mergeUpFlag   = idxNeighbor;
    2492         saoMergeParam[compIdx][idxNeighbor]->mergeLeftFlag = !idxNeighbor;
    2493         distortion[idxNeighbor+1] += ((Double)estDist[compIdx]/lambda);
    2494       }
    2495     }
    2496   }
     1017          srcLine += srcStride;
     1018          orgLine += orgStride;
     1019        }
     1020#if SAO_ENCODE_ALLOW_USE_PREDEBLOCK
     1021        if(isCalculatePreDeblockSamples)
     1022        {
     1023          if(isBelowAvail)
     1024          {
     1025            startX = 0;
     1026            endX   = width;
     1027
     1028            for(y=0; y<skipLinesB[typeIdx]; y++)
     1029            {
     1030              srcLineBelow = srcLine + srcStride;
     1031              srcLineAbove = srcLine - srcStride;
     1032
     1033              for (x=startX; x<endX; x++)
     1034              {
     1035                edgeType = m_sign[srcLine[x] - srcLineBelow[x]] + m_sign[srcLine[x] - srcLineAbove[x]];
     1036                diff [edgeType] += (orgLine[x] - srcLine[x]);
     1037                count[edgeType] ++;
     1038              }
     1039              srcLine  += srcStride;
     1040              orgLine  += orgStride;
     1041            }
     1042          }
     1043        }
     1044#endif
     1045
     1046      }
     1047      break;
     1048    case SAO_TYPE_EO_135:
     1049      {
     1050        diff +=2;
     1051        count+=2;
     1052        Char *signUpLine, *signDownLine, *signTmpLine;
     1053
     1054        signUpLine  = m_signLineBuf1;
     1055        signDownLine= m_signLineBuf2;
     1056
     1057#if SAO_ENCODE_ALLOW_USE_PREDEBLOCK
     1058        startX = (!isCalculatePreDeblockSamples) ? (isLeftAvail  ? 0 : 1)
     1059                                                 : (isRightAvail ? (width - skipLinesR[typeIdx]) : (width - 1))
     1060                                                 ;
     1061#else
     1062        startX = isLeftAvail ? 0 : 1 ;
     1063#endif
     1064
     1065#if SAO_ENCODE_ALLOW_USE_PREDEBLOCK
     1066        endX   = (!isCalculatePreDeblockSamples) ? (isRightAvail ? (width - skipLinesR[typeIdx]): (width - 1))
     1067                                                 : (isRightAvail ? width : (width - 1))
     1068                                                 ;
     1069#else
     1070        endX   = isRightAvail ? (width - skipLinesR[typeIdx]): (width - 1);
     1071#endif
     1072        endY   = isBelowAvail ? (height - skipLinesB[typeIdx]) : (height - 1);
     1073
     1074        //prepare 2nd line's upper sign
     1075        Pel* srcLineBelow = srcLine + srcStride;
     1076        for (x=startX; x<endX+1; x++)
     1077        {
     1078          signUpLine[x] = (Char)m_sign[srcLineBelow[x] - srcLine[x-1]];
     1079        }
     1080
     1081        //1st line
     1082        Pel* srcLineAbove = srcLine - srcStride;
     1083#if SAO_ENCODE_ALLOW_USE_PREDEBLOCK
     1084        firstLineStartX = (!isCalculatePreDeblockSamples) ? (isAboveLeftAvail ? 0    : 1) : startX;
     1085        firstLineEndX   = (!isCalculatePreDeblockSamples) ? (isAboveAvail     ? endX : 1) : endX;
     1086#else
     1087        firstLineStartX = isAboveLeftAvail ? 0    : 1;
     1088        firstLineEndX   = isAboveAvail     ? endX : 1;
     1089#endif
     1090        for(x=firstLineStartX; x<firstLineEndX; x++)
     1091        {
     1092          edgeType = m_sign[srcLine[x] - srcLineAbove[x-1]] - signUpLine[x+1];
     1093          diff [edgeType] += (orgLine[x] - srcLine[x]);
     1094          count[edgeType] ++;
     1095        }
     1096        srcLine  += srcStride;
     1097        orgLine  += orgStride;
     1098
     1099
     1100        //middle lines
     1101        for (y=1; y<endY; y++)
     1102        {
     1103          srcLineBelow = srcLine + srcStride;
     1104
     1105          for (x=startX; x<endX; x++)
     1106          {
     1107            signDown = (Char)m_sign[srcLine[x] - srcLineBelow[x+1]] ;
     1108            edgeType = signDown + signUpLine[x];
     1109            diff [edgeType] += (orgLine[x] - srcLine[x]);
     1110            count[edgeType] ++;
     1111
     1112            signDownLine[x+1] = -signDown;
     1113          }
     1114          signDownLine[startX] = (Char)m_sign[srcLineBelow[startX] - srcLine[startX-1]];
     1115
     1116          signTmpLine  = signUpLine;
     1117          signUpLine   = signDownLine;
     1118          signDownLine = signTmpLine;
     1119
     1120          srcLine += srcStride;
     1121          orgLine += orgStride;
     1122        }
     1123#if SAO_ENCODE_ALLOW_USE_PREDEBLOCK
     1124        if(isCalculatePreDeblockSamples)
     1125        {
     1126          if(isBelowAvail)
     1127          {
     1128            startX = isLeftAvail  ? 0     : 1 ;
     1129            endX   = isRightAvail ? width : (width -1);
     1130
     1131            for(y=0; y<skipLinesB[typeIdx]; y++)
     1132            {
     1133              srcLineBelow = srcLine + srcStride;
     1134              srcLineAbove = srcLine - srcStride;
     1135
     1136              for (x=startX; x< endX; x++)
     1137              {
     1138                edgeType = m_sign[srcLine[x] - srcLineBelow[x+1]] + m_sign[srcLine[x] - srcLineAbove[x-1]];
     1139                diff [edgeType] += (orgLine[x] - srcLine[x]);
     1140                count[edgeType] ++;
     1141              }
     1142              srcLine  += srcStride;
     1143              orgLine  += orgStride;
     1144            }
     1145          }
     1146        }
     1147#endif
     1148      }
     1149      break;
     1150    case SAO_TYPE_EO_45:
     1151      {
     1152        diff +=2;
     1153        count+=2;
     1154        Char *signUpLine = m_signLineBuf1+1;
     1155
     1156#if SAO_ENCODE_ALLOW_USE_PREDEBLOCK
     1157        startX = (!isCalculatePreDeblockSamples) ? (isLeftAvail  ? 0 : 1)
     1158                                                 : (isRightAvail ? (width - skipLinesR[typeIdx]) : (width - 1))
     1159                                                 ;
     1160#else
     1161        startX = isLeftAvail ? 0 : 1;
     1162#endif
     1163#if SAO_ENCODE_ALLOW_USE_PREDEBLOCK
     1164        endX   = (!isCalculatePreDeblockSamples) ? (isRightAvail ? (width - skipLinesR[typeIdx]) : (width - 1))
     1165                                                 : (isRightAvail ? width : (width - 1))
     1166                                                 ;
     1167#else
     1168        endX   = isRightAvail ? (width - skipLinesR[typeIdx]) : (width - 1);
     1169#endif
     1170        endY   = isBelowAvail ? (height - skipLinesB[typeIdx]) : (height - 1);
     1171
     1172        //prepare 2nd line upper sign
     1173        Pel* srcLineBelow = srcLine + srcStride;
     1174        for (x=startX-1; x<endX; x++)
     1175        {
     1176          signUpLine[x] = (Char)m_sign[srcLineBelow[x] - srcLine[x+1]];
     1177        }
     1178
     1179
     1180        //first line
     1181        Pel* srcLineAbove = srcLine - srcStride;
     1182#if SAO_ENCODE_ALLOW_USE_PREDEBLOCK
     1183        firstLineStartX = (!isCalculatePreDeblockSamples) ? (isAboveAvail ? startX : endX)
     1184                                                          : startX
     1185                                                          ;
     1186        firstLineEndX   = (!isCalculatePreDeblockSamples) ? ((!isRightAvail && isAboveRightAvail) ? width : endX)
     1187                                                          : endX
     1188                                                          ;
     1189#else
     1190        firstLineStartX = isAboveAvail ? startX : endX;
     1191        firstLineEndX   = (!isRightAvail && isAboveRightAvail) ? width : endX;
     1192#endif
     1193        for(x=firstLineStartX; x<firstLineEndX; x++)
     1194        {
     1195          edgeType = m_sign[srcLine[x] - srcLineAbove[x+1]] - signUpLine[x-1];
     1196          diff [edgeType] += (orgLine[x] - srcLine[x]);
     1197          count[edgeType] ++;
     1198        }
     1199
     1200        srcLine += srcStride;
     1201        orgLine += orgStride;
     1202
     1203        //middle lines
     1204        for (y=1; y<endY; y++)
     1205        {
     1206          srcLineBelow = srcLine + srcStride;
     1207
     1208          for(x=startX; x<endX; x++)
     1209          {
     1210            signDown = (Char)m_sign[srcLine[x] - srcLineBelow[x-1]] ;
     1211            edgeType = signDown + signUpLine[x];
     1212
     1213            diff [edgeType] += (orgLine[x] - srcLine[x]);
     1214            count[edgeType] ++;
     1215
     1216            signUpLine[x-1] = -signDown;
     1217          }
     1218          signUpLine[endX-1] = (Char)m_sign[srcLineBelow[endX-1] - srcLine[endX]];
     1219          srcLine  += srcStride;
     1220          orgLine  += orgStride;
     1221        }
     1222#if SAO_ENCODE_ALLOW_USE_PREDEBLOCK
     1223        if(isCalculatePreDeblockSamples)
     1224        {
     1225          if(isBelowAvail)
     1226          {
     1227            startX = isLeftAvail  ? 0     : 1 ;
     1228            endX   = isRightAvail ? width : (width -1);
     1229
     1230            for(y=0; y<skipLinesB[typeIdx]; y++)
     1231            {
     1232              srcLineBelow = srcLine + srcStride;
     1233              srcLineAbove = srcLine - srcStride;
     1234
     1235              for (x=startX; x<endX; x++)
     1236              {
     1237                edgeType = m_sign[srcLine[x] - srcLineBelow[x-1]] + m_sign[srcLine[x] - srcLineAbove[x+1]];
     1238                diff [edgeType] += (orgLine[x] - srcLine[x]);
     1239                count[edgeType] ++;
     1240              }
     1241              srcLine  += srcStride;
     1242              orgLine  += orgStride;
     1243            }
     1244          }
     1245        }
     1246#endif
     1247      }
     1248      break;
     1249    case SAO_TYPE_BO:
     1250      {
     1251#if SAO_ENCODE_ALLOW_USE_PREDEBLOCK
     1252        startX = (!isCalculatePreDeblockSamples)?0
     1253                                                :( isRightAvail?(width- skipLinesR[typeIdx]):width)
     1254                                                ;
     1255        endX   = (!isCalculatePreDeblockSamples)?(isRightAvail ? (width - skipLinesR[typeIdx]) : width )
     1256                                                :width
     1257                                                ;
     1258#else
     1259        endX = isRightAvail ? (width- skipLinesR[typeIdx]) : width;
     1260#endif
     1261        endY = isBelowAvail ? (height- skipLinesB[typeIdx]) : height;
     1262        Int shiftBits = ((compIdx == SAO_Y)?g_bitDepthY:g_bitDepthC)- NUM_SAO_BO_CLASSES_LOG2;
     1263        for (y=0; y< endY; y++)
     1264        {
     1265#if SAO_ENCODE_ALLOW_USE_PREDEBLOCK
     1266          for (x=startX; x< endX; x++)
     1267#else
     1268          for (x=0; x< endX; x++)
     1269#endif
     1270          {
     1271
     1272            Int bandIdx= srcLine[x] >> shiftBits;
     1273            diff [bandIdx] += (orgLine[x] - srcLine[x]);
     1274            count[bandIdx] ++;
     1275          }
     1276          srcLine += srcStride;
     1277          orgLine += orgStride;
     1278        }
     1279#if SAO_ENCODE_ALLOW_USE_PREDEBLOCK
     1280        if(isCalculatePreDeblockSamples)
     1281        {
     1282          if(isBelowAvail)
     1283          {
     1284            startX = 0;
     1285            endX   = width;
     1286
     1287            for(y= 0; y< skipLinesB[typeIdx]; y++)
     1288            {
     1289              for (x=startX; x< endX; x++)
     1290              {
     1291                Int bandIdx= srcLine[x] >> shiftBits;
     1292                diff [bandIdx] += (orgLine[x] - srcLine[x]);
     1293                count[bandIdx] ++;
     1294              }
     1295              srcLine  += srcStride;
     1296              orgLine  += orgStride;
     1297
     1298            }
     1299
     1300          }
     1301        }
     1302#endif
     1303      }
     1304      break;
     1305    default:
     1306      {
     1307        printf("Not a supported SAO types\n");
     1308        assert(0);
     1309        exit(-1);
     1310      }
     1311    }
     1312  }
    24971313}
    24981314
  • branches/HTM-10.0rc1-dev0/source/Lib/TLibEncoder/TEncSampleAdaptiveOffset.h

    r608 r837  
    44 * granted under this license. 
    55 *
    6  * Copyright (c) 2010-2013, ITU/ISO/IEC
     6 * Copyright (c) 2010-2014, ITU/ISO/IEC
    77 * All rights reserved.
    88 *
     
    5454// ====================================================================================================================
    5555
     56enum SAOCabacStateLablesRDO //CABAC state labels
     57{
     58  SAO_CABACSTATE_PIC_INIT =0,
     59  SAO_CABACSTATE_BLK_CUR,
     60  SAO_CABACSTATE_BLK_NEXT,
     61  SAO_CABACSTATE_BLK_MID,
     62  SAO_CABACSTATE_BLK_TEMP,
     63  NUM_SAO_CABACSTATE_LABELS
     64};
     65
     66struct SAOStatData //data structure for SAO statistics
     67{
     68  Int64 diff[MAX_NUM_SAO_CLASSES];
     69  Int64 count[MAX_NUM_SAO_CLASSES];
     70
     71  SAOStatData(){}
     72  ~SAOStatData(){}
     73  Void reset()
     74  {
     75    ::memset(diff, 0, sizeof(Int64)*MAX_NUM_SAO_CLASSES);
     76    ::memset(count, 0, sizeof(Int64)*MAX_NUM_SAO_CLASSES);
     77  }
     78  const SAOStatData& operator=(const SAOStatData& src)
     79  {
     80    ::memcpy(diff, src.diff, sizeof(Int64)*MAX_NUM_SAO_CLASSES);
     81    ::memcpy(count, src.count, sizeof(Int64)*MAX_NUM_SAO_CLASSES);
     82    return *this;
     83  }
     84#if SAO_ENCODE_ALLOW_USE_PREDEBLOCK
     85  const SAOStatData& operator+= (const SAOStatData& src)
     86  {
     87    for(Int i=0; i< MAX_NUM_SAO_CLASSES; i++)
     88    {
     89      diff[i] += src.diff[i];
     90      count[i] += src.count[i];
     91    }
     92    return *this;
     93  }
     94#endif
     95};
     96
    5697class TEncSampleAdaptiveOffset : public TComSampleAdaptiveOffset
    5798{
    58 private:
    59   TEncEntropy*      m_pcEntropyCoder;
    60   TEncSbac***       m_pppcRDSbacCoder;              ///< for CABAC
    61   TEncSbac*         m_pcRDGoOnSbacCoder;
    62 #if FAST_BIT_EST
    63   TEncBinCABACCounter*** m_pppcBinCoderCABAC;            ///< temporal CABAC state storage for RD computation
    64 #else
    65   TEncBinCABAC***   m_pppcBinCoderCABAC;            ///< temporal CABAC state storage for RD computation
    66 #endif
    67  
    68   Int64  ***m_iCount;      //[MAX_NUM_SAO_PART][MAX_NUM_SAO_TYPE][MAX_NUM_SAO_CLASS];
    69   Int64  ***m_iOffset;     //[MAX_NUM_SAO_PART][MAX_NUM_SAO_TYPE][MAX_NUM_SAO_CLASS];
    70   Int64  ***m_iOffsetOrg;  //[MAX_NUM_SAO_PART][MAX_NUM_SAO_TYPE];
    71   Int64  ****m_count_PreDblk;      //[LCU][YCbCr][MAX_NUM_SAO_TYPE][MAX_NUM_SAO_CLASS];
    72   Int64  ****m_offsetOrg_PreDblk;  //[LCU][YCbCr][MAX_NUM_SAO_TYPE][MAX_NUM_SAO_CLASS];
    73   Int64  **m_iRate;        //[MAX_NUM_SAO_PART][MAX_NUM_SAO_TYPE];
    74   Int64  **m_iDist;        //[MAX_NUM_SAO_PART][MAX_NUM_SAO_TYPE];
    75   Double **m_dCost;        //[MAX_NUM_SAO_PART][MAX_NUM_SAO_TYPE];
    76   Double *m_dCostPartBest; //[MAX_NUM_SAO_PART];
    77   Int64  *m_iDistOrg;      //[MAX_NUM_SAO_PART];
    78   Int    *m_iTypePartBest; //[MAX_NUM_SAO_PART];
    79   Int     m_iOffsetThY;
    80   Int     m_iOffsetThC;
    81   Bool    m_bUseSBACRD;
    82 #if SAO_ENCODING_CHOICE
    83 #if SAO_ENCODING_CHOICE_CHROMA
    84   Double  m_depthSaoRate[2][4];
    85 #else
    86   Double  m_depth0SaoRate;
    87 #endif
    88 #endif
    89 
    9099public:
    91   TEncSampleAdaptiveOffset         ();
     100  TEncSampleAdaptiveOffset();
    92101  virtual ~TEncSampleAdaptiveOffset();
    93102
    94   Void startSaoEnc( TComPic* pcPic, TEncEntropy* pcEntropyCoder, TEncSbac*** pppcRDSbacCoder, TEncSbac* pcRDGoOnSbacCoder);
    95   Void endSaoEnc();
    96   Void resetStats();
    97 #if SAO_CHROMA_LAMBDA
     103  //interface
     104#if SAO_ENCODE_ALLOW_USE_PREDEBLOCK
     105  Void createEncData(Bool isPreDBFSamplesUsed);
     106#else
     107  Void createEncData();
     108#endif
     109  Void destroyEncData();
     110  Void initRDOCabacCoder(TEncSbac* pcRDGoOnSbacCoder, TComSlice* pcSlice) ;
     111  Void SAOProcess(TComPic* pPic, Bool* sliceEnabled, const Double *lambdas
     112#if SAO_ENCODE_ALLOW_USE_PREDEBLOCK
     113                , Bool isPreDBFSamplesUsed
     114#endif
     115                );
     116public: //methods
     117#if SAO_ENCODE_ALLOW_USE_PREDEBLOCK
     118  Void getPreDBFStatistics(TComPic* pPic);
     119#endif
     120private: //methods
     121  Void getStatistics(SAOStatData*** blkStats, TComPicYuv* orgYuv, TComPicYuv* srcYuv,TComPic* pPic
     122#if SAO_ENCODE_ALLOW_USE_PREDEBLOCK
     123                   , Bool isCalculatePreDeblockSamples = false
     124#endif
     125                   );
     126  Void decidePicParams(Bool* sliceEnabled, Int picTempLayer);
     127  Void decideBlkParams(TComPic* pic, Bool* sliceEnabled, SAOStatData*** blkStats, TComPicYuv* srcYuv, TComPicYuv* resYuv, SAOBlkParam* reconParams, SAOBlkParam* codedParams);
     128  Void getBlkStats(Int compIdx, SAOStatData* statsDataTypes, Pel* srcBlk, Pel* orgBlk, Int srcStride, Int orgStride, Int width, Int height, Bool isLeftAvail,  Bool isRightAvail, Bool isAboveAvail, Bool isBelowAvail, Bool isAboveLeftAvail, Bool isAboveRightAvail, Bool isBelowLeftAvail, Bool isBelowRightAvail
     129#if SAO_ENCODE_ALLOW_USE_PREDEBLOCK
     130                  , Bool isCalculatePreDeblockSamples
     131#endif
     132                  );
     133  Void deriveModeNewRDO(Int ctu, std::vector<SAOBlkParam*>& mergeList, Bool* sliceEnabled, SAOStatData*** blkStats, SAOBlkParam& modeParam, Double& modeNormCost, TEncSbac** cabacCoderRDO, Int inCabacLabel);
     134  Void deriveModeMergeRDO(Int ctu, std::vector<SAOBlkParam*>& mergeList, Bool* sliceEnabled, SAOStatData*** blkStats, SAOBlkParam& modeParam, Double& modeNormCost, TEncSbac** cabacCoderRDO, Int inCabacLabel);
     135  Int64 getDistortion(Int ctu, Int compIdx, Int typeIdc, Int typeAuxInfo, Int* offsetVal, SAOStatData& statData);
     136  Void deriveOffsets(Int ctu, Int compIdx, Int typeIdc, SAOStatData& statData, Int* quantOffsets, Int& typeAuxInfo);
     137  inline Int64 estSaoDist(Int64 count, Int64 offset, Int64 diffSum, Int shift);
     138  inline Int estIterOffset(Int typeIdx, Int classIdx, Double lambda, Int offsetInput, Int64 count, Int64 diffSum, Int shift, Int bitIncrease, Int64& bestDist, Double& bestCost, Int offsetTh );
     139#if SAO_ENCODE_ALLOW_USE_PREDEBLOCK
     140  Void addPreDBFStatistics(SAOStatData*** blkStats);
     141#endif
     142private: //members
     143  //for RDO
     144  TEncSbac**             m_pppcRDSbacCoder;           
     145  TEncSbac*              m_pcRDGoOnSbacCoder;
     146  TEncBinCABACCounter**  m_pppcBinCoderCABAC;   
     147  Double                 m_lambda[NUM_SAO_COMPONENTS];
     148
     149  //statistics
     150  SAOStatData***         m_statData; //[ctu][comp][classes]
     151#if SAO_ENCODE_ALLOW_USE_PREDEBLOCK
     152  SAOStatData***         m_preDBFstatData;
     153#endif
    98154#if SAO_ENCODING_CHOICE
    99   Void SAOProcess(SAOParam *pcSaoParam, Double dLambda, Double dLambdaChroma, Int depth);
    100 #else
    101   Void SAOProcess(SAOParam *pcSaoParam, Double dLambda, Double dLambdaChroma);
     155  Double                 m_saoDisabledRate[NUM_SAO_COMPONENTS][MAX_TLAYER];
    102156#endif
    103 #else
    104   Void SAOProcess(SAOParam *pcSaoParam, Double dLambda);
    105 #endif
    106 
    107   Void runQuadTreeDecision(SAOQTPart *psQTPart, Int iPartIdx, Double &dCostFinal, Int iMaxLevel, Double dLambda, Int yCbCr);
    108   Void rdoSaoOnePart(SAOQTPart *psQTPart, Int iPartIdx, Double dLambda, Int yCbCr);
    109  
    110   Void disablePartTree(SAOQTPart *psQTPart, Int iPartIdx);
    111   Void getSaoStats(SAOQTPart *psQTPart, Int iYCbCr);
    112   Void calcSaoStatsCu(Int iAddr, Int iPartIdx, Int iYCbCr);
    113   Void calcSaoStatsBlock( Pel* pRecStart, Pel* pOrgStart, Int stride, Int64** ppStats, Int64** ppCount, UInt width, UInt height, Bool* pbBorderAvail, Int iYCbCr);
    114   Void calcSaoStatsCuOrg(Int iAddr, Int iPartIdx, Int iYCbCr);
    115   Void calcSaoStatsCu_BeforeDblk( TComPic* pcPic );
    116   Void destroyEncBuffer();
    117   Void createEncBuffer();
    118   Void assignSaoUnitSyntax(SaoLcuParam* saoLcuParam,  SAOQTPart* saoPart, Bool &oneUnitFlag, Int yCbCr);
    119   Void checkMerge(SaoLcuParam * lcuParamCurr,SaoLcuParam * lcuParamCheck, Int dir);
    120 #if SAO_ENCODING_CHOICE
    121   Void rdoSaoUnitAll(SAOParam *saoParam, Double lambda, Double lambdaChroma, Int depth);
    122 #else
    123   Void rdoSaoUnitAll(SAOParam *saoParam, Double lambda, Double lambdaChroma);
    124 #endif
    125   Void saoComponentParamDist(Int allowMergeLeft, Int allowMergeUp, SAOParam *saoParam, Int addr, Int addrUp, Int addrLeft, Int yCbCr, Double lambda, SaoLcuParam *compSaoParam, Double *distortion);
    126   Void sao2ChromaParamDist(Int allowMergeLeft, Int allowMergeUp, SAOParam *saoParam, Int addr, Int addrUp, Int addrLeft, Double lambda, SaoLcuParam *crSaoParam, SaoLcuParam *cbSaoParam, Double *distortion);
    127   inline Int64 estSaoDist(Int64 count, Int64 offset, Int64 offsetOrg, Int shift);
    128   inline Int64 estIterOffset(Int typeIdx, Int classIdx, Double lambda, Int64 offsetInput, Int64 count, Int64 offsetOrg, Int shift, Int bitIncrease, Int *currentDistortionTableBo, Double *currentRdCostTableBo, Int offsetTh );
    129   inline Int64 estSaoTypeDist(Int compIdx, Int typeIdx, Int shift, Double lambda, Int *currentDistortionTableBo, Double *currentRdCostTableBo);
    130   Void setMaxNumOffsetsPerPic(Int iVal) {m_maxNumOffsetsPerPic = iVal; }
    131   Int  getMaxNumOffsetsPerPic() {return m_maxNumOffsetsPerPic; }
     157  Int                    m_skipLinesR[NUM_SAO_COMPONENTS][NUM_SAO_NEW_TYPES];
     158  Int                    m_skipLinesB[NUM_SAO_COMPONENTS][NUM_SAO_NEW_TYPES];
    132159};
    133 
    134160//! \}
    135161
  • branches/HTM-10.0rc1-dev0/source/Lib/TLibEncoder/TEncSbac.cpp

    r833 r837  
    44 * granted under this license. 
    55 *
    6  * Copyright (c) 2010-2013, ITU/ISO/IEC
     6* Copyright (c) 2010-2014, ITU/ISO/IEC
    77 * All rights reserved.
    88 *
     
    8484, m_cCUAbsSCModel             ( 1,             1,               NUM_ABS_FLAG_CTX              , m_contextModels + m_numContextModels, m_numContextModels)
    8585, m_cMVPIdxSCModel            ( 1,             1,               NUM_MVP_IDX_CTX               , m_contextModels + m_numContextModels, m_numContextModels)
    86 , m_cCUAMPSCModel             ( 1,             1,               NUM_CU_AMP_CTX                , m_contextModels + m_numContextModels, m_numContextModels)
    8786, m_cSaoMergeSCModel          ( 1,             1,               NUM_SAO_MERGE_FLAG_CTX   , m_contextModels + m_numContextModels, m_numContextModels)
    8887, m_cSaoTypeIdxSCModel        ( 1,             1,               NUM_SAO_TYPE_IDX_CTX          , m_contextModels + m_numContextModels, m_numContextModels)
     
    153152#endif
    154153  m_cCUPartSizeSCModel.initBuffer        ( eSliceType, iQp, (UChar*)INIT_PART_SIZE );
    155   m_cCUAMPSCModel.initBuffer             ( eSliceType, iQp, (UChar*)INIT_CU_AMP_POS );
    156154  m_cCUPredModeSCModel.initBuffer        ( eSliceType, iQp, (UChar*)INIT_PRED_MODE );
    157155  m_cCUIntraPredSCModel.initBuffer       ( eSliceType, iQp, (UChar*)INIT_INTRA_PRED_MODE );
     
    254252#endif
    255253      curCost += m_cCUPartSizeSCModel.calcCost        ( curSliceType, qp, (UChar*)INIT_PART_SIZE );
    256       curCost += m_cCUAMPSCModel.calcCost             ( curSliceType, qp, (UChar*)INIT_CU_AMP_POS );
    257254      curCost += m_cCUPredModeSCModel.calcCost        ( curSliceType, qp, (UChar*)INIT_PRED_MODE );
    258255      curCost += m_cCUIntraPredSCModel.calcCost       ( curSliceType, qp, (UChar*)INIT_INTRA_PRED_MODE );
     
    326323#endif
    327324  m_cCUPartSizeSCModel.initBuffer        ( eSliceType, iQp, (UChar*)INIT_PART_SIZE );
    328   m_cCUAMPSCModel.initBuffer             ( eSliceType, iQp, (UChar*)INIT_CU_AMP_POS );
    329325  m_cCUPredModeSCModel.initBuffer        ( eSliceType, iQp, (UChar*)INIT_PRED_MODE );
    330326  m_cCUIntraPredSCModel.initBuffer       ( eSliceType, iQp, (UChar*)INIT_INTRA_PRED_MODE );
     
    348344  m_cTransformSkipSCModel.initBuffer     ( eSliceType, iQp, (UChar*)INIT_TRANSFORMSKIP_FLAG );
    349345  m_CUTransquantBypassFlagSCModel.initBuffer( eSliceType, iQp, (UChar*)INIT_CU_TRANSQUANT_BYPASS_FLAG );
    350 
    351346#if H_3D_DIM
    352347  m_cDepthIntraModeSCModel.initBuffer    ( eSliceType, iQp, (UChar*)INIT_DEPTH_INTRA_MODE );
     
    794789        if (eSize == SIZE_2NxN)
    795790        {
    796           m_pcBinIf->encodeBin(1, m_cCUAMPSCModel.get( 0, 0, 0 ));
     791          m_pcBinIf->encodeBin(1, m_cCUPartSizeSCModel.get( 0, 0, 3 ));
    797792        }
    798793        else
    799794        {
    800           m_pcBinIf->encodeBin(0, m_cCUAMPSCModel.get( 0, 0, 0 ));         
     795          m_pcBinIf->encodeBin(0, m_cCUPartSizeSCModel.get( 0, 0, 3 ));
    801796          m_pcBinIf->encodeBinEP((eSize == SIZE_2NxnU? 0: 1));
    802797        }
     
    818813        if (eSize == SIZE_Nx2N)
    819814        {
    820           m_pcBinIf->encodeBin(1, m_cCUAMPSCModel.get( 0, 0, 0 ));
     815          m_pcBinIf->encodeBin(1, m_cCUPartSizeSCModel.get( 0, 0, 3 ));
    821816        }
    822817        else
    823818        {
    824           m_pcBinIf->encodeBin(0, m_cCUAMPSCModel.get( 0, 0, 0 ));
     819          m_pcBinIf->encodeBin(0, m_cCUPartSizeSCModel.get( 0, 0, 3 ));
    825820          m_pcBinIf->encodeBinEP((eSize == SIZE_nLx2N? 0: 1));
    826821        }
  • branches/HTM-10.0rc1-dev0/source/Lib/TLibEncoder/TEncSbac.h

    r833 r837  
    44 * granted under this license. 
    55 *
    6  * Copyright (c) 2010-2013, ITU/ISO/IEC
     6* Copyright (c) 2010-2014, ITU/ISO/IEC
    77 * All rights reserved.
    88 *
     
    111111  Void  codeScalingList      ( TComScalingList* /*scalingList*/     ){ assert (0);  return;};
    112112
     113  Void codeSAOOffsetParam(Int compIdx, SAOOffset& ctbParam, Bool sliceEnabled);
     114  Void codeSAOBlkParam(SAOBlkParam& saoBlkParam
     115                    , Bool* sliceEnabled
     116                    , Bool leftMergeAvail
     117                    , Bool aboveMergeAvail
     118                    , Bool onlyEstMergeInfo = false
     119                    );
     120
    113121private:
    114122  Void  xWriteUnarySymbol    ( UInt uiSymbol, ContextModel* pcSCModel, Int iOffset );
     
    245253  ContextModel3DBuffer m_cMVPIdxSCModel;
    246254 
    247   ContextModel3DBuffer m_cCUAMPSCModel;
    248255  ContextModel3DBuffer m_cSaoMergeSCModel;
    249256  ContextModel3DBuffer m_cSaoTypeIdxSCModel;
    250257  ContextModel3DBuffer m_cTransformSkipSCModel;
    251258  ContextModel3DBuffer m_CUTransquantBypassFlagSCModel;
    252 
    253 #if H_3D_DIM
    254   ContextModel3DBuffer m_cDepthIntraModeSCModel;
    255   ContextModel3DBuffer m_cDdcFlagSCModel;
    256   ContextModel3DBuffer m_cDdcDataSCModel;
    257 #if QC_GENERIC_SDC_G0122
    258   ContextModel3DBuffer m_cAngleFlagSCModel;
    259 #if !QC_SDC_UNIFY_G0130
    260   ContextModel3DBuffer m_cIntraSdcFlagSCModel;
    261 #endif
    262 #endif
    263 #if H_3D_DIM_DMM
    264   ContextModel3DBuffer m_cDmm1DataSCModel;
    265 #endif
    266 #if H_3D_DIM_SDC 
    267   ContextModel3DBuffer m_cSDCResidualFlagSCModel;
    268   ContextModel3DBuffer m_cSDCResidualSCModel;
    269 #endif
    270 #endif
    271 #if H_3D_INTER_SDC && !QC_SDC_UNIFY_G0130
    272   ContextModel3DBuffer m_cInterSDCFlagSCModel;
    273   ContextModel3DBuffer m_cInterSDCResidualSCModel;
    274   ContextModel3DBuffer m_cInterSDCResidualSignFlagSCModel;
    275 #endif
    276 #if QC_SDC_UNIFY_G0130
    277   ContextModel3DBuffer m_cSDCFlagSCModel;
    278 #endif
    279 #if H_3D_DBBP
    280   ContextModel3DBuffer m_cDBBPFlagSCModel;
    281 #endif
    282259};
    283260
  • branches/HTM-10.0rc1-dev0/source/Lib/TLibEncoder/TEncSearch.cpp

    r833 r837  
    44 * granted under this license. 
    55 *
    6  * Copyright (c) 2010-2013, ITU/ISO/IEC
     6* Copyright (c) 2010-2014, ITU/ISO/IEC
    77 * All rights reserved.
    88 *
     
    202202  m_pppcRDSbacCoder     = pppcRDSbacCoder;
    203203  m_pcRDGoOnSbacCoder   = pcRDGoOnSbacCoder;
    204  
    205   m_bUseSBACRD          = pppcRDSbacCoder ? true : false;
    206204 
    207205  for (Int iDir = 0; iDir < 2; iDir++)
     
    745743    piRefPos = m_filteredBlock[ verVal & 3 ][ horVal & 3 ].getLumaAddr();
    746744    if ( horVal == 2 && ( verVal & 1 ) == 0 )
     745    {
    747746      piRefPos += 1;
     747    }
    748748    if ( ( horVal & 1 ) == 0 && verVal == 2 )
     749    {
    749750      piRefPos += iRefStride;
     751    }
    750752    cMvTest = pcMvRefine[i];
    751753    cMvTest += rcMvFrac;
     
    787789  UInt  uiLog2TrafoSize = g_aucConvertToBit[pcCU->getSlice()->getSPS()->getMaxCUWidth()] + 2 - uiFullDepth;
    788790
    789   {
    790791    if( pcCU->getPredictionMode(0) == MODE_INTRA && pcCU->getPartitionSize(0) == SIZE_NxN && uiTrDepth == 0 )
    791792    {
     
    812813      }
    813814    }
    814   }
    815815 
    816816  if ( bChroma )
     
    819819    {
    820820      if( uiTrDepth==0 || pcCU->getCbf( uiAbsPartIdx, TEXT_CHROMA_U, uiTrDepth-1 ) )
     821      {
    821822        m_pcEntropyCoder->encodeQtCbf( pcCU, uiAbsPartIdx, TEXT_CHROMA_U, uiTrDepth );
     823      }
    822824      if( uiTrDepth==0 || pcCU->getCbf( uiAbsPartIdx, TEXT_CHROMA_V, uiTrDepth-1 ) )
     825      {
    823826        m_pcEntropyCoder->encodeQtCbf( pcCU, uiAbsPartIdx, TEXT_CHROMA_V, uiTrDepth );
    824827    }
     828  }
    825829  }
    826830
     
    835839  }
    836840 
    837   {
    838841    //===== Cbfs =====
    839842    if( bLuma )
     
    842845    }
    843846  }
    844 }
    845847
    846848Void
     
    12121214  {
    12131215    Int scalingListType = 0 + g_eTTable[(Int)TEXT_LUMA];
    1214     assert(scalingListType < 6);
     1216    assert(scalingListType < SCALING_LIST_NUM);
    12151217    m_pcTrQuant->invtransformNxN( pcCU->getCUTransquantBypass(uiAbsPartIdx), TEXT_LUMA,pcCU->getLumaIntraDir( uiAbsPartIdx ), piResi, uiStride, pcCoeff, uiWidth, uiHeight, scalingListType, useTransformSkip );
    12161218  }
     
    14121414
    14131415#if RDOQ_CHROMA_LAMBDA
    1414     m_pcTrQuant->selectLambda      (TEXT_CHROMA); 
     1416    m_pcTrQuant->selectLambda(eText);
    14151417#endif
    14161418    m_pcTrQuant->transformNxN      ( pcCU, piResi, uiStride, pcCoeff,
     
    14251427    {
    14261428      Int scalingListType = 0 + g_eTTable[(Int)eText];
    1427       assert(scalingListType < 6);
     1429      assert(scalingListType < SCALING_LIST_NUM);
    14281430      m_pcTrQuant->invtransformNxN( pcCU->getCUTransquantBypass(uiAbsPartIdx), TEXT_CHROMA, REG_DCT, piResi, uiStride, pcCoeff, uiWidth, uiHeight, scalingListType, useTransformSkipChroma );
    14291431    }
     
    14641466 
    14651467  //===== update distortion =====
    1466 #if WEIGHTED_CHROMA_DISTORTION
    14671468  ruiDist += m_pcRdCost->getDistPart(g_bitDepthC, piReco, uiStride, piOrg, uiStride, uiWidth, uiHeight, eText );
    1468 #else
    1469   ruiDist += m_pcRdCost->getDistPart(g_bitDepthC, piReco, uiStride, piOrg, uiStride, uiWidth, uiHeight );
    1470 #endif
    14711469}
    14721470
     
    15531551  checkTransformSkip         &= (widthTransformSkip == 4 && heightTransformSkip == 4);
    15541552  checkTransformSkip         &= (!pcCU->getCUTransquantBypass(0));
    1555   checkTransformSkip         &= (!((pcCU->getQP( 0 ) == 0) && (pcCU->getSlice()->getSPS()->getUseLossless())));
    15561553  if ( m_pcEncCfg->getUseTransformSkipFast() )
    15571554  {
     
    15631560    {
    15641561      //----- store original entropy coding status -----
    1565       if( m_bUseSBACRD)
    1566       {
    15671562        m_pcRDGoOnSbacCoder->store( m_pppcRDSbacCoder[ uiFullDepth ][ CI_QT_TRAFO_ROOT ] );
    1568       }
    15691563#if H_3D_VSO
    15701564      Dist   singleDistYTmp     = 0;
     
    16411635          {
    16421636            xStoreIntraResultQT(pcCU, uiTrDepth, uiAbsPartIdx,bLumaOnly );
    1643             if( m_bUseSBACRD)
    1644             {
    16451637              m_pcRDGoOnSbacCoder->store( m_pppcRDSbacCoder[ uiFullDepth ][ CI_TEMP_BEST ] );
    16461638            }
    16471639          }
    1648         }
    16491640        if(modeId == firstCheckId)
    16501641        {
     
    16671658          }
    16681659        }
    1669         if(m_bUseSBACRD)
    1670         {
    16711660          m_pcRDGoOnSbacCoder->load( m_pppcRDSbacCoder[ uiFullDepth ][ CI_TEMP_BEST ] );
    16721661        }
    1673       }
    16741662
    16751663      if( !bLumaOnly )
     
    16961684      pcCU ->setTransformSkipSubParts ( 0, TEXT_LUMA, uiAbsPartIdx, uiFullDepth );
    16971685      //----- store original entropy coding status -----
    1698       if( m_bUseSBACRD && bCheckSplit )
     1686      if( bCheckSplit )
    16991687      {
    17001688        m_pcRDGoOnSbacCoder->store( m_pppcRDSbacCoder[ uiFullDepth ][ CI_QT_TRAFO_ROOT ] );
     
    17421730  {
    17431731    //----- store full entropy coding status, load original entropy coding status -----
    1744     if( m_bUseSBACRD )
    1745     {
    17461732      if( bCheckFull )
    17471733      {
     
    17531739        m_pcRDGoOnSbacCoder->store( m_pppcRDSbacCoder[ uiFullDepth ][ CI_QT_TRAFO_ROOT ] );
    17541740      }
    1755     }
     1741
    17561742    //----- code splitted block -----
    17571743    Double  dSplitCost      = 0.0;
     
    17981784    }
    17991785    //----- restore context states -----
    1800     if( m_bUseSBACRD )
    1801     {
    18021786      m_pcRDGoOnSbacCoder->load ( m_pppcRDSbacCoder[ uiFullDepth ][ CI_QT_TRAFO_ROOT ] );
    1803     }
     1787
    18041788    //----- determine rate and r-d cost -----
    18051789    UInt uiSplitBits = xGetIntraBitsQT( pcCU, uiTrDepth, uiAbsPartIdx, true, !bLumaOnly, false );
     
    18211805    }
    18221806    //----- set entropy coding status -----
    1823     if( m_bUseSBACRD )
    1824     {
    18251807      m_pcRDGoOnSbacCoder->load ( m_pppcRDSbacCoder[ uiFullDepth ][ CI_QT_TRAFO_TEST ] );
    1826     }
    18271808   
    18281809    //--- set transform index and Cbf values ---
     
    27182699    {
    27192700        //use RDO to decide whether Cr/Cb takes TS
    2720         if( m_bUseSBACRD )
    2721         {
    27222701          m_pcRDGoOnSbacCoder->store( m_pppcRDSbacCoder[uiFullDepth][CI_QT_TRAFO_ROOT] );
    2723         }
    27242702
    27252703        for(Int chromaId = 0; chromaId < 2; chromaId ++)
     
    27722750              {
    27732751                xStoreIntraResultChromaQT(pcCU, uiTrDepth, uiAbsPartIdx,chromaId);
    2774                 if( m_bUseSBACRD)
    2775                 {
    27762752                  m_pcRDGoOnSbacCoder->store( m_pppcRDSbacCoder[ uiFullDepth ][ CI_TEMP_BEST ] );
    27772753                }
    27782754              }
    2779             }
    27802755            if(chromaModeId == firstCheckId)
    27812756            {
     
    27882763            xLoadIntraResultChromaQT(pcCU, uiTrDepth, uiAbsPartIdx,chromaId);
    27892764            pcCU->setCbfSubParts ( singleCbfC << uiTrDepth, (TextType)(chromaId + 2), uiAbsPartIdx, pcCU->getDepth(0) + actualTrDepth );
    2790             if(m_bUseSBACRD)
    2791             {
    27922765              m_pcRDGoOnSbacCoder->load( m_pppcRDSbacCoder[ uiFullDepth ][ CI_TEMP_BEST ] );
    27932766            }
    2794           }
    27952767          pcCU ->setTransformSkipSubParts( bestModeId, (TextType)(chromaId + 2), uiAbsPartIdx, pcCU->getDepth( 0 ) +  actualTrDepth );
    27962768          ruiDist += singleDistC;
     
    27982770          if(chromaId == 0)
    27992771          {
    2800             if( m_bUseSBACRD )
    2801             {
    28022772              m_pcRDGoOnSbacCoder->store( m_pppcRDSbacCoder[uiFullDepth][CI_QT_TRAFO_ROOT] );
    28032773            }
    28042774          }
    28052775        }
    2806     }
    28072776    else
    28082777    {
     
    32173186#endif
    32183187      // set context models
    3219       if( m_bUseSBACRD )
    3220       {
    32213188        m_pcRDGoOnSbacCoder->load( m_pppcRDSbacCoder[uiDepth][CI_CURR_BEST] );
    3222       }
    32233189     
    32243190      // determine residual for partition
     
    33503316     
    33513317      // set context models
    3352       if( m_bUseSBACRD )
    3353       {
    33543318        m_pcRDGoOnSbacCoder->load( m_pppcRDSbacCoder[uiDepth][CI_CURR_BEST] );
    3355       }
    33563319     
    33573320      // determine residual for partition
     
    35213484 
    35223485  //===== reset context models =====
    3523   if(m_bUseSBACRD)
    3524   {
    35253486    m_pcRDGoOnSbacCoder->load(m_pppcRDSbacCoder[uiDepth][CI_CURR_BEST]);
    3526   }
    35273487 
    35283488  //===== set distortion (rate and r-d costs are determined later) =====
     
    35563516  {
    35573517    //----- restore context models -----
    3558     if( m_bUseSBACRD )
    3559     {
    35603518      m_pcRDGoOnSbacCoder->load( m_pppcRDSbacCoder[uiDepth][CI_CURR_BEST] );
    3561     }
    35623519   
    35633520    //----- chroma coding -----
     
    35653522    pcCU->setChromIntraDirSubParts  ( uiModeList[uiMode], 0, uiDepth );
    35663523    xRecurIntraChromaCodingQT       ( pcCU,   0, 0, pcOrgYuv, pcPredYuv, pcResiYuv, uiDist );
    3567     if( m_bUseSBACRD && pcCU->getSlice()->getPPS()->getUseTransformSkip() )
     3524    if( pcCU->getSlice()->getPPS()->getUseTransformSkip() )
    35683525    {
    35693526      m_pcRDGoOnSbacCoder->load( m_pppcRDSbacCoder[uiDepth][CI_CURR_BEST] );
     
    35973554 
    35983555  //----- restore context models -----
    3599   if( m_bUseSBACRD )
    3600   {
    36013556    m_pcRDGoOnSbacCoder->load( m_pppcRDSbacCoder[uiDepth][CI_CURR_BEST] );
    36023557  }
    3603 }
    36043558
    36053559/** Function for encoding and reconstructing luma/chroma samples of a PCM mode CU.
     
    37613715  dCost = m_pcRdCost->calcRdCost( uiBits, uiDistortion );
    37623716
    3763   if(m_bUseSBACRD)
    3764   {
    37653717    m_pcRDGoOnSbacCoder->load(m_pppcRDSbacCoder[uiDepth][CI_CURR_BEST]);
    3766   }
    37673718
    37683719  pcCU->getTotalBits()       = uiBits;
     
    37893740                            pcYuvOrg->getLumaAddr( uiAbsPartIdx ), pcYuvOrg->getStride(),
    37903741                            m_tmpYuvPred .getLumaAddr( uiAbsPartIdx ), m_tmpYuvPred .getStride(),
    3791 #if NS_HAD
    3792                             iWidth, iHeight, m_pcEncCfg->getUseHADME(), m_pcEncCfg->getUseNSQT() );
    3793 #else
    37943742                            iWidth, iHeight, m_pcEncCfg->getUseHADME() );
    3795 #endif
    37963743#if H_3D_IC
    37973744  cDistParam.bUseIC = false;
     
    39423889  for( UInt uiMergeCand = 0; uiMergeCand < numValidMergeCand; ++uiMergeCand )
    39433890  {
    3944     {
    39453891      UInt uiCostCand = MAX_UINT;
    39463892      UInt uiBitsCand = 0;
     
    40443990    }
    40453991  }
    4046 }
    40473992
    40483993/** convert bi-pred merge candidates to uni-pred
     
    41814126
    41824127    UInt          uiCostTempL0[MAX_NUM_REF];
    4183     for (Int iNumRef=0; iNumRef < MAX_NUM_REF; iNumRef++) uiCostTempL0[iNumRef] = MAX_UINT;
     4128    for (Int iNumRef=0; iNumRef < MAX_NUM_REF; iNumRef++)
     4129    {
     4130      uiCostTempL0[iNumRef] = MAX_UINT;
     4131    }
    41844132    UInt          uiBitsTempL0[MAX_NUM_REF];
    41854133
     
    45944542    {
    45954543      uiLastMode = 2;
    4596       {
    45974544            pcCU->getCUMvField(REF_PIC_LIST_0)->setAllMv( cMvBi[0], ePartSize, uiPartAddr, 0, iPartIdx );
    45984545            pcCU->getCUMvField(REF_PIC_LIST_0)->setAllRefIdx( iRefIdxBi[0], ePartSize, uiPartAddr, 0, iPartIdx );
    45994546            pcCU->getCUMvField(REF_PIC_LIST_1)->setAllMv( cMvBi[1], ePartSize, uiPartAddr, 0, iPartIdx );
    46004547            pcCU->getCUMvField(REF_PIC_LIST_1)->setAllRefIdx( iRefIdxBi[1], ePartSize, uiPartAddr, 0, iPartIdx );
    4601       }
    4602       {
     4548     
    46034549        TempMv = cMvBi[0] - cMvPredBi[0][iRefIdxBi[0]];
    46044550            pcCU->getCUMvField(REF_PIC_LIST_0)->setAllMvd    ( TempMv,                 ePartSize, uiPartAddr, 0, iPartIdx );
    4605       }
    4606       {
     4551     
    46074552        TempMv = cMvBi[1] - cMvPredBi[1][iRefIdxBi[1]];
    46084553            pcCU->getCUMvField(REF_PIC_LIST_1)->setAllMvd    ( TempMv,                 ePartSize, uiPartAddr, 0, iPartIdx );
    4609       }
    46104554     
    46114555      pcCU->setInterDirSubParts( 3, uiPartAddr, iPartIdx, pcCU->getDepth(0) );
     
    46234567          pcCU->getCUMvField(REF_PIC_LIST_0)->setAllMv( cMv[0], ePartSize, uiPartAddr, 0, iPartIdx );
    46244568          pcCU->getCUMvField(REF_PIC_LIST_0)->setAllRefIdx( iRefIdx[0], ePartSize, uiPartAddr, 0, iPartIdx );
    4625       {
    46264569        TempMv = cMv[0] - cMvPred[0][iRefIdx[0]];
    46274570            pcCU->getCUMvField(REF_PIC_LIST_0)->setAllMvd    ( TempMv,                 ePartSize, uiPartAddr, 0, iPartIdx );
    4628       }
    46294571      pcCU->setInterDirSubParts( 1, uiPartAddr, iPartIdx, pcCU->getDepth(0) );
    46304572     
     
    46394581          pcCU->getCUMvField(REF_PIC_LIST_1)->setAllMv( cMv[1], ePartSize, uiPartAddr, 0, iPartIdx );
    46404582          pcCU->getCUMvField(REF_PIC_LIST_1)->setAllRefIdx( iRefIdx[1], ePartSize, uiPartAddr, 0, iPartIdx );
    4641       {
    46424583        TempMv = cMv[1] - cMvPred[1][iRefIdx[1]];
    46434584            pcCU->getCUMvField(REF_PIC_LIST_1)->setAllMvd    ( TempMv,                 ePartSize, uiPartAddr, 0, iPartIdx );
    4644       }
    46454585      pcCU->setInterDirSubParts( 2, uiPartAddr, iPartIdx, pcCU->getDepth(0) );
    46464586     
     
    47294669        pcCU->setDvInfoSubParts(inheritedVSPDisInfo[uiMRGIndex].m_acDvInfo, uiPartAddr, iPartIdx, pcCU->getDepth( uiPartAddr ) );
    47304670#endif
    4731 
    47324671#if MTK_DDD_G0063
    47334672        if( uiMRGIndex == pcCU->getUseDDDCandIdx() )
     
    47434682        }
    47444683#endif
    4745 
    47464684#if H_3D_SPIVMP
    47474685        pcCU->setSPIVMPFlagSubParts(bSPIVMPFlag[uiMRGIndex], uiPartAddr, iPartIdx, pcCU->getDepth( uiPartAddr ) ); 
     
    47494687        {
    47504688          UInt uiSPAddr;
    4751 
    47524689          Int iNumSPInOneLine, iNumSP, iSPWidth, iSPHeight;
    4753 
    47544690          pcCU->getSPPara(iRoiWidth, iRoiHeight, iNumSP, iNumSPInOneLine, iSPWidth, iSPHeight);
    4755 
    47564691          for (Int iPartitionIdx = 0; iPartitionIdx < iNumSP; iPartitionIdx++)
    47574692          {
     
    47614696            pcCU->getCUMvField( REF_PIC_LIST_1 )->setMvFieldSP(pcCU, uiSPAddr, pcMvFieldSP[2*iPartitionIdx + 1], iSPWidth, iSPHeight);
    47624697          }
    4763 
    47644698          if ( pcCU->getInterDir(uiPartAddr) == 3 && pcCU->isBipredRestriction(iPartIdx) )
    47654699          {
     
    47684702            pcCU->setInterDirSubParts( 1, uiPartAddr, iPartIdx, pcCU->getDepth( uiPartAddr ));
    47694703          }
    4770 
    47714704        }
    47724705        else
     
    47834716          Int width, height;
    47844717          pcCU->getPartIndexAndSize( iPartIdx, partAddrTemp, width, height ); // true or pcCU->getTotalNumPart()==256
    4785 
    47864718          if( uiMRGInterDir & 0x01 )
    47874719          {
     
    48064738        else
    48074739#endif
    4808         {
    48094740          pcCU->setInterDirSubParts  ( uiMRGInterDir, uiPartAddr, iPartIdx, pcCU->getDepth( uiPartAddr ) );
    4810           {
    48114741            pcCU->getCUMvField( REF_PIC_LIST_0 )->setAllMvField( cMRGMvField[0], ePartSize, uiPartAddr, 0, iPartIdx );
    48124742            pcCU->getCUMvField( REF_PIC_LIST_1 )->setAllMvField( cMRGMvField[1], ePartSize, uiPartAddr, 0, iPartIdx );
    4813           }
    4814         }
    48154743
    48164744        pcCU->getCUMvField(REF_PIC_LIST_0)->setAllMvd    ( cMvZero,            ePartSize, uiPartAddr, 0, iPartIdx );
     
    48274755        pcCU->setSPIVMPFlagSubParts(0, uiPartAddr, iPartIdx, pcCU->getDepth( uiPartAddr ) );
    48284756#endif
    4829 
    48304757#if MTK_DDD_G0063
    48314758        pcCU->setUseDDD( false, uiPartAddr, iPartIdx, pcCU->getDepth( uiPartAddr ) );
     
    48384765        pcCU->setDvInfoSubParts(OriginalDvInfo, uiPartAddr, iPartIdx, pcCU->getDepth( uiPartAddr ) );
    48394766#endif
    4840         {
    48414767          pcCU->getCUMvField( REF_PIC_LIST_0 )->setAllMvField( cMEMvField[0], ePartSize, uiPartAddr, 0, iPartIdx );
    48424768          pcCU->getCUMvField( REF_PIC_LIST_1 )->setAllMvField( cMEMvField[1], ePartSize, uiPartAddr, 0, iPartIdx );
    48434769        }
    4844       }
    48454770#if H_3D_SPIVMP
    48464771      delete[] pcMvFieldSP;
     
    49974922 
    49984923  if (iNum == 1)
     4924  {
    49994925    return 0;
     4926  }
    50004927 
    50014928  UInt uiLength = 1;
     
    51775104                            pcOrgYuv->getLumaAddr(uiPartAddr), pcOrgYuv->getStride(),
    51785105                            pcTemplateCand->getLumaAddr(uiPartAddr), pcTemplateCand->getStride(),
    5179 #if NS_HAD
    5180                             iSizeX, iSizeY, m_pcEncCfg->getUseHADME(), m_pcEncCfg->getUseNSQT() );
    5181 #else
    51825106                            iSizeX, iSizeY, m_pcEncCfg->getUseHADME() );
    5183 #endif
    51845107  ruiDist = cDistParam.DistFunc( &cDistParam );
    51855108  uiCost = ruiDist + m_pcRdCost->getCost( m_auiMVPIdxCost[iMVPIdx][iMVPNum] );
    51865109#else
    5187 #if WEIGHTED_CHROMA_DISTORTION
    51885110  uiCost = m_pcRdCost->getDistPart(g_bitDepthY, pcTemplateCand->getLumaAddr(uiPartAddr), pcTemplateCand->getStride(), pcOrgYuv->getLumaAddr(uiPartAddr), pcOrgYuv->getStride(), iSizeX, iSizeY, TEXT_LUMA, DF_SAD );
    5189 #else
    5190   uiCost = m_pcRdCost->getDistPart(g_bitDepthY, pcTemplateCand->getLumaAddr(uiPartAddr), pcTemplateCand->getStride(), pcOrgYuv->getLumaAddr(uiPartAddr), pcOrgYuv->getStride(), iSizeX, iSizeY, DF_SAD );
    5191 #endif
    51925111  uiCost = (UInt) m_pcRdCost->calcRdCost( m_auiMVPIdxCost[iMVPIdx][iMVPNum], uiCost, false, DF_SAD );
    51935112#endif
     
    52885207  m_pcRdCost->setCostScale ( 1 );
    52895208 
    5290   {
    5291     xPatternSearchFracDIF( pcCU, pcPatternKey, piRefY, iRefStride, &rcMv, cMvHalf, cMvQter, ruiCost
    5292                           ,bBi
    5293                           );
    5294   }
     5209    xPatternSearchFracDIF( pcCU, pcPatternKey, piRefY, iRefStride, &rcMv, cMvHalf, cMvQter, ruiCost,bBi );
    52955210 
    52965211 
     
    56965611#endif
    56975612
    5698     if( m_bUseSBACRD )
    56995613      m_pcRDGoOnSbacCoder->load(m_pppcRDSbacCoder[pcCU->getDepth(0)][CI_CURR_BEST]);
    57005614   
     
    57295643    pcCU->getTotalCost() = m_pcRdCost->calcRdCost( uiBits, uiDistortion );
    57305644
    5731     if( m_bUseSBACRD )
    57325645      m_pcRDGoOnSbacCoder->store(m_pppcRDSbacCoder[pcCU->getDepth(0)][CI_TEMP_BEST]);
    57335646   
     
    57715684    uiBits = 0;
    57725685    uiDistortion = 0;
    5773     if( m_bUseSBACRD )
    5774     {
    57755686      m_pcRDGoOnSbacCoder->load( m_pppcRDSbacCoder[ pcCU->getDepth( 0 ) ][ CI_CURR_BEST ] );
    5776     }   
    57775687
    57785688#if H_3D_VSO // M16 // M18
     
    58365746    }
    58375747   
    5838     if( m_bUseSBACRD )
    5839     {
    58405748      m_pcRDGoOnSbacCoder->load( m_pppcRDSbacCoder[pcCU->getDepth(0)][CI_CURR_BEST] );
    5841     }
    58425749#if 0 // check
    58435750    {
     
    58455752      m_pcEntropyCoder->encodeCoeff( pcCU, 0, pcCU->getDepth(0), pcCU->getWidth(0), pcCU->getHeight(0) );
    58465753      const UInt uiBitsForCoeff = m_pcEntropyCoder->getNumberOfWrittenBits();
    5847       if( m_bUseSBACRD )
    5848       {
    58495754        m_pcRDGoOnSbacCoder->load( m_pppcRDSbacCoder[pcCU->getDepth(0)][CI_CURR_BEST] );
    5850       }
    58515755      if( uiBitsForCoeff != uiBits )
    58525756        assert( 0 );
     
    59045808      dCostBest        = dCost;
    59055809      qpBest           = qp;
    5906       if( m_bUseSBACRD )
    5907       {
    59085810        m_pcRDGoOnSbacCoder->store( m_pppcRDSbacCoder[ pcCU->getDepth( 0 ) ][ CI_TEMP_BEST ] );
    59095811      }
     
    59175819    }
    59185820#endif
    5919   }
    59205821 
    59215822  assert ( dCostBest != MAX_DOUBLE );
     
    59235824  if( qpMin != qpMax && qpBest != qpMax )
    59245825  {
    5925     if( m_bUseSBACRD )
    5926     {
    59275826      assert( 0 ); // check
    59285827      m_pcRDGoOnSbacCoder->load( m_pppcRDSbacCoder[ pcCU->getDepth( 0 ) ][ CI_TEMP_BEST ] );
    5929     }
    59305828    // copy best cbf and trIdx to pcCU
    59315829    const UInt uiQPartNum = pcCU->getPic()->getNumPartInCU() >> (pcCU->getDepth(0) << 1);
     
    59575855#endif
    59585856  // update with clipped distortion and cost (qp estimation loop uses unclipped values)
    5959 #if WEIGHTED_CHROMA_DISTORTION
    59605857    uiDistortionBest = m_pcRdCost->getDistPart(g_bitDepthY, rpcYuvRec->getLumaAddr(), rpcYuvRec->getStride(),  pcYuvOrg->getLumaAddr(), pcYuvOrg->getStride(),  uiWidth,      uiHeight      )
    59615858    + m_pcRdCost->getDistPart(g_bitDepthC, rpcYuvRec->getCbAddr(),   rpcYuvRec->getCStride(), pcYuvOrg->getCbAddr(),   pcYuvOrg->getCStride(), uiWidth >> 1, uiHeight >> 1, TEXT_CHROMA_U )
    59625859    + m_pcRdCost->getDistPart(g_bitDepthC, rpcYuvRec->getCrAddr(),   rpcYuvRec->getCStride(), pcYuvOrg->getCrAddr(),   pcYuvOrg->getCStride(), uiWidth >> 1, uiHeight >> 1, TEXT_CHROMA_V );
    5963 #else
    5964   uiDistortionBest = m_pcRdCost->getDistPart(g_bitDepthY, rpcYuvRec->getLumaAddr(), rpcYuvRec->getStride(),  pcYuvOrg->getLumaAddr(), pcYuvOrg->getStride(),  uiWidth,      uiHeight      )
    5965   + m_pcRdCost->getDistPart(g_bitDepthC, rpcYuvRec->getCbAddr(),   rpcYuvRec->getCStride(), pcYuvOrg->getCbAddr(),   pcYuvOrg->getCStride(), uiWidth >> 1, uiHeight >> 1 )
    5966   + m_pcRdCost->getDistPart(g_bitDepthC, rpcYuvRec->getCrAddr(),   rpcYuvRec->getCStride(), pcYuvOrg->getCrAddr(),   pcYuvOrg->getCStride(), uiWidth >> 1, uiHeight >> 1 );
    5967 #endif
    59685860#if H_3D_VSO // M23
    59695861  }
     
    59845876 
    59855877  pcCU->setQPSubParts( qpBest, 0, pcCU->getDepth(0) );
    5986 
    59875878#if H_3D_VSO // M24 // necessary??
    59885879  if( m_pcRdCost->getUseRenModel() && !m_pcRdCost->getUseEstimatedVSD() )
     
    62166107  Bool bCheckFull;
    62176108  if ( SplitFlag && uiDepth == pcCU->getDepth(uiAbsPartIdx) && ( uiLog2TrSize >  pcCU->getQuadtreeTULog2MinSizeInCU(uiAbsPartIdx) ) )
     6109  {
    62186110     bCheckFull = false;
     6111  }
    62196112  else
     6113  {
    62206114     bCheckFull =  ( uiLog2TrSize <= pcCU->getSlice()->getSPS()->getQuadtreeTULog2MaxSize() );
     6115  }
    62216116
    62226117  const Bool bCheckSplit  = ( uiLog2TrSize >  pcCU->getQuadtreeTULog2MinSizeInCU(uiAbsPartIdx) );
     
    62476142  UInt uiBestTransformMode[3] = {0};
    62486143
    6249   if( m_bUseSBACRD )
    6250   {
    62516144    m_pcRDGoOnSbacCoder->store( m_pppcRDSbacCoder[ uiDepth ][ CI_QT_TRAFO_ROOT ] );
    6252   }
    62536145 
    62546146  if( bCheckFull )
     
    63166208
    63176209#if RDOQ_CHROMA_LAMBDA
    6318       m_pcTrQuant->selectLambda(TEXT_CHROMA);
     6210      m_pcTrQuant->selectLambda(TEXT_CHROMA_U);
    63196211#endif
    63206212
     
    63276219      curChromaQpOffset = pcCU->getSlice()->getPPS()->getChromaCrQpOffset() + pcCU->getSlice()->getSliceQpDeltaCr();
    63286220      m_pcTrQuant->setQPforQuant( pcCU->getQP( 0 ), TEXT_CHROMA, pcCU->getSlice()->getSPS()->getQpBDOffsetC(), curChromaQpOffset );
     6221     
     6222#if RDOQ_CHROMA_LAMBDA
     6223      m_pcTrQuant->selectLambda(TEXT_CHROMA_V);
     6224#endif
     6225
    63296226      m_pcTrQuant->transformNxN( pcCU, pcResi->getCrAddr(absTUPartIdxC), pcResi->getCStride(), pcCoeffCurrV,
    63306227#if ADAPTIVE_QP_SELECTION
     
    63396236    m_pcEntropyCoder->resetBits();
    63406237   
    6341     {
    63426238      m_pcEntropyCoder->encodeQtCbf( pcCU, uiAbsPartIdx, TEXT_LUMA,     uiTrMode );
    6343     }
    63446239   
    63456240    m_pcEntropyCoder->encodeCoeffNxN( pcCU, pcCoeffCurrY, uiAbsPartIdx,  trWidth,  trHeight,    uiDepth, TEXT_LUMA );
     
    63506245    if( bCodeChroma )
    63516246    {
    6352       {
    63536247        m_pcEntropyCoder->encodeQtCbf   ( pcCU, uiAbsPartIdx, TEXT_CHROMA_U, uiTrMode );
    6354       }
    63556248      m_pcEntropyCoder->encodeCoeffNxN( pcCU, pcCoeffCurrU, uiAbsPartIdx, trWidthC, trHeightC, uiDepth, TEXT_CHROMA_U );
    63566249      uiSingleBitsU = m_pcEntropyCoder->getNumberOfWrittenBits() - uiSingleBitsY;
    63576250     
    6358       {
    63596251        m_pcEntropyCoder->encodeQtCbf   ( pcCU, uiAbsPartIdx, TEXT_CHROMA_V, uiTrMode );
    6360       }
    63616252      m_pcEntropyCoder->encodeCoeffNxN( pcCU, pcCoeffCurrV, uiAbsPartIdx, trWidthC, trHeightC, uiDepth, TEXT_CHROMA_V );
    63626253      uiSingleBitsV = m_pcEntropyCoder->getNumberOfWrittenBits() - ( uiSingleBitsY + uiSingleBitsU );
     
    64006291
    64016292      Int scalingListType = 3 + g_eTTable[(Int)TEXT_LUMA];
    6402       assert(scalingListType < 6);     
     6293      assert(scalingListType < SCALING_LIST_NUM);
    64036294      m_pcTrQuant->invtransformNxN( pcCU->getCUTransquantBypass(uiAbsPartIdx), TEXT_LUMA,REG_DCT, pcResiCurrY, m_pcQTTempTComYuv[uiQTTempAccessLayer].getStride(),  pcCoeffCurrY, trWidth, trHeight, scalingListType );//this is for inter mode only
    64046295
     
    64236314      }
    64246315#else     
    6425       const UInt uiNonzeroDistY = m_pcRdCost->getDistPart(g_bitDepthY, m_pcQTTempTComYuv[uiQTTempAccessLayer].getLumaAddr( absTUPartIdx ), m_pcQTTempTComYuv[uiQTTempAccessLayer].getStride(),      pcResi->getLumaAddr( absTUPartIdx ), pcResi->getStride(), trWidth,trHeight );
     6316      const UInt uiNonzeroDistY = m_pcRdCost->getDistPart(g_bitDepthY, m_pcQTTempTComYuv[uiQTTempAccessLayer].getLumaAddr( absTUPartIdx ), m_pcQTTempTComYuv[uiQTTempAccessLayer].getStride(),
     6317      pcResi->getLumaAddr( absTUPartIdx ), pcResi->getStride(), trWidth,trHeight );
    64266318#endif
    64276319      if (pcCU->isLosslessCoded(0))
     
    65006392    {
    65016393      uiDistU = m_pcRdCost->getDistPart(g_bitDepthC, m_pTempPel, trWidthC, pcResi->getCbAddr( absTUPartIdxC ), pcResi->getCStride(), trWidthC, trHeightC
    6502 #if WEIGHTED_CHROMA_DISTORTION
    65036394                                        , TEXT_CHROMA_U
    6504 #endif
    65056395                                        ); // initialized with zero residual destortion
    65066396      if ( puiZeroDist )
     
    65166406
    65176407        Int scalingListType = 3 + g_eTTable[(Int)TEXT_CHROMA_U];
    6518         assert(scalingListType < 6);
     6408        assert(scalingListType < SCALING_LIST_NUM);
    65196409        m_pcTrQuant->invtransformNxN( pcCU->getCUTransquantBypass(uiAbsPartIdx), TEXT_CHROMA,REG_DCT, pcResiCurrU, m_pcQTTempTComYuv[uiQTTempAccessLayer].getCStride(), pcCoeffCurrU, trWidthC, trHeightC, scalingListType  );
    65206410       
    65216411        const UInt uiNonzeroDistU = m_pcRdCost->getDistPart(g_bitDepthC, m_pcQTTempTComYuv[uiQTTempAccessLayer].getCbAddr( absTUPartIdxC), m_pcQTTempTComYuv[uiQTTempAccessLayer].getCStride(),
    65226412                                                            pcResi->getCbAddr( absTUPartIdxC), pcResi->getCStride(), trWidthC, trHeightC
    6523 #if WEIGHTED_CHROMA_DISTORTION
    65246413                                                            , TEXT_CHROMA_U
    6525 #endif
    65266414                                                            );
    65276415
     
    65596447      {
    65606448        m_pcEntropyCoder->resetBits();
    6561         m_pcEntropyCoder->encodeQtCbfZero( pcCU, TEXT_CHROMA_U, uiTrModeC );
     6449        m_pcEntropyCoder->encodeQtCbfZero( pcCU, TEXT_CHROMA_U, uiTrMode );
    65626450        const UInt uiNullBitsU = m_pcEntropyCoder->getNumberOfWrittenBits();
    65636451        minCostU = m_pcRdCost->calcRdCost( uiNullBitsU, uiDistU );
     
    65756463     
    65766464      uiDistV = m_pcRdCost->getDistPart(g_bitDepthC, m_pTempPel, trWidthC, pcResi->getCrAddr( absTUPartIdxC), pcResi->getCStride(), trWidthC, trHeightC
    6577 #if WEIGHTED_CHROMA_DISTORTION
    65786465                                        , TEXT_CHROMA_V
    6579 #endif
    65806466                                        ); // initialized with zero residual destortion
    65816467      if ( puiZeroDist )
     
    65906476
    65916477        Int scalingListType = 3 + g_eTTable[(Int)TEXT_CHROMA_V];
    6592         assert(scalingListType < 6);
     6478        assert(scalingListType < SCALING_LIST_NUM);
    65936479        m_pcTrQuant->invtransformNxN( pcCU->getCUTransquantBypass(uiAbsPartIdx), TEXT_CHROMA,REG_DCT, pcResiCurrV, m_pcQTTempTComYuv[uiQTTempAccessLayer].getCStride(), pcCoeffCurrV, trWidthC, trHeightC, scalingListType );
    65946480       
    65956481        const UInt uiNonzeroDistV = m_pcRdCost->getDistPart(g_bitDepthC, m_pcQTTempTComYuv[uiQTTempAccessLayer].getCrAddr( absTUPartIdxC ), m_pcQTTempTComYuv[uiQTTempAccessLayer].getCStride(),
    65966482                                                            pcResi->getCrAddr( absTUPartIdxC ), pcResi->getCStride(), trWidthC, trHeightC
    6597 #if WEIGHTED_CHROMA_DISTORTION
    65986483                                                            , TEXT_CHROMA_V
    6599 #endif
    66006484                                                            );
    66016485        if (pcCU->isLosslessCoded(0))
     
    66326516      {
    66336517        m_pcEntropyCoder->resetBits();
    6634         m_pcEntropyCoder->encodeQtCbfZero( pcCU, TEXT_CHROMA_V, uiTrModeC );
     6518        m_pcEntropyCoder->encodeQtCbfZero( pcCU, TEXT_CHROMA_V, uiTrMode );
    66356519        const UInt uiNullBitsV = m_pcEntropyCoder->getNumberOfWrittenBits();
    66366520        minCostV = m_pcRdCost->calcRdCost( uiNullBitsV, uiDistV );
     
    66816565      }
    66826566
    6683       if( m_bUseSBACRD )
    6684       {
    66856567        m_pcRDGoOnSbacCoder->load( m_pppcRDSbacCoder[ uiDepth ][ CI_QT_TRAFO_ROOT ] );
    6686       }
    66876568
    66886569      pcCU->setTransformSkipSubParts ( 1, TEXT_LUMA, uiAbsPartIdx, uiDepth );
     
    67156596
    67166597        Int scalingListType = 3 + g_eTTable[(Int)TEXT_LUMA];
    6717         assert(scalingListType < 6);     
     6598        assert(scalingListType < SCALING_LIST_NUM);
    67186599
    67196600        m_pcTrQuant->invtransformNxN( pcCU->getCUTransquantBypass(uiAbsPartIdx), TEXT_LUMA,REG_DCT, pcResiCurrY, m_pcQTTempTComYuv[uiQTTempAccessLayer].getStride(),  pcCoeffCurrY, trWidth, trHeight, scalingListType, true );
     
    67946675      }
    67956676
    6796       if( m_bUseSBACRD )
    6797       {
    67986677        m_pcRDGoOnSbacCoder->load( m_pppcRDSbacCoder[ uiDepth ][ CI_QT_TRAFO_ROOT ] );
    6799       }
    68006678
    68016679      pcCU->setTransformSkipSubParts ( 1, TEXT_CHROMA_U, uiAbsPartIdx, pcCU->getDepth(0)+uiTrModeC );
     
    68116689
    68126690#if RDOQ_CHROMA_LAMBDA
    6813       m_pcTrQuant->selectLambda(TEXT_CHROMA);
     6691      m_pcTrQuant->selectLambda(TEXT_CHROMA_U);
    68146692#endif
    68156693
     
    68216699      curChromaQpOffset = pcCU->getSlice()->getPPS()->getChromaCrQpOffset() + pcCU->getSlice()->getSliceQpDeltaCr();
    68226700      m_pcTrQuant->setQPforQuant( pcCU->getQP( 0 ), TEXT_CHROMA, pcCU->getSlice()->getSPS()->getQpBDOffsetC(), curChromaQpOffset );
     6701#if RDOQ_CHROMA_LAMBDA
     6702      m_pcTrQuant->selectLambda(TEXT_CHROMA_V);
     6703#endif
    68236704      m_pcTrQuant->transformNxN( pcCU, pcResi->getCrAddr(absTUPartIdxC), pcResi->getCStride(), pcCoeffCurrV,
    68246705#if ADAPTIVE_QP_SELECTION
     
    68446725
    68456726        Int scalingListType = 3 + g_eTTable[(Int)TEXT_CHROMA_U];
    6846         assert(scalingListType < 6);
     6727        assert(scalingListType < SCALING_LIST_NUM);
    68476728
    68486729        m_pcTrQuant->invtransformNxN( pcCU->getCUTransquantBypass(uiAbsPartIdx), TEXT_CHROMA,REG_DCT, pcResiCurrU, m_pcQTTempTComYuv[uiQTTempAccessLayer].getCStride(), pcCoeffCurrU, trWidthC, trHeightC, scalingListType, true  );
     
    68506731        uiNonzeroDistU = m_pcRdCost->getDistPart(g_bitDepthC, m_pcQTTempTComYuv[uiQTTempAccessLayer].getCbAddr( absTUPartIdxC), m_pcQTTempTComYuv[uiQTTempAccessLayer].getCStride(),
    68516732                                                 pcResi->getCbAddr( absTUPartIdxC), pcResi->getCStride(), trWidthC, trHeightC
    6852 #if WEIGHTED_CHROMA_DISTORTION
    68536733                                                 , TEXT_CHROMA_U
    6854 #endif
    68556734                                                 );
    68566735
     
    68886767
    68896768        Int scalingListType = 3 + g_eTTable[(Int)TEXT_CHROMA_V];
    6890         assert(scalingListType < 6);
     6769        assert(scalingListType < SCALING_LIST_NUM);
    68916770
    68926771        m_pcTrQuant->invtransformNxN( pcCU->getCUTransquantBypass(uiAbsPartIdx), TEXT_CHROMA,REG_DCT, pcResiCurrV, m_pcQTTempTComYuv[uiQTTempAccessLayer].getCStride(), pcCoeffCurrV, trWidthC, trHeightC, scalingListType, true );
     
    68946773        uiNonzeroDistV = m_pcRdCost->getDistPart(g_bitDepthC, m_pcQTTempTComYuv[uiQTTempAccessLayer].getCrAddr( absTUPartIdxC ), m_pcQTTempTComYuv[uiQTTempAccessLayer].getCStride(),
    68956774                                                 pcResi->getCrAddr( absTUPartIdxC ), pcResi->getCStride(), trWidthC, trHeightC
    6896 #if WEIGHTED_CHROMA_DISTORTION
    68976775                                                 , TEXT_CHROMA_V
    6898 #endif
    68996776                                                 );
    69006777
     
    69266803    }
    69276804
    6928     if( m_bUseSBACRD )
    6929     {
    69306805      m_pcRDGoOnSbacCoder->load( m_pppcRDSbacCoder[ uiDepth ][ CI_QT_TRAFO_ROOT ] );
    6931     }
    6932 
    69336806    m_pcEntropyCoder->resetBits();
    69346807
    6935     {
    69366808      if( uiLog2TrSize > pcCU->getQuadtreeTULog2MinSizeInCU(uiAbsPartIdx) )
    69376809      {
    69386810        m_pcEntropyCoder->encodeTransformSubdivFlag( 0, 5 - uiLog2TrSize );
    69396811      }
    6940     }
    6941 
    6942     {
     6812
    69436813      if( bCodeChroma )
    69446814      {
     
    69486818
    69496819      m_pcEntropyCoder->encodeQtCbf( pcCU, uiAbsPartIdx, TEXT_LUMA,     uiTrMode );
    6950     }
    69516820
    69526821    m_pcEntropyCoder->encodeCoeffNxN( pcCU, pcCoeffCurrY, uiAbsPartIdx, trWidth, trHeight,    uiDepth, TEXT_LUMA );
     
    69726841  if( bCheckSplit )
    69736842  {
    6974     if( m_bUseSBACRD && bCheckFull )
     6843    if( bCheckFull )
    69756844    {
    69766845      m_pcRDGoOnSbacCoder->store( m_pppcRDSbacCoder[ uiDepth ][ CI_QT_TRAFO_TEST ] );
     
    70126881    }
    70136882   
    7014     if( m_bUseSBACRD )
    7015     {
    70166883      m_pcRDGoOnSbacCoder->load( m_pppcRDSbacCoder[ uiDepth ][ CI_QT_TRAFO_ROOT ] );
    7017     }
    70186884    m_pcEntropyCoder->resetBits();
    70196885   
    7020     {
    70216886      xEncodeResidualQT( pcCU, uiAbsPartIdx, uiDepth, true,  TEXT_LUMA );
    70226887      xEncodeResidualQT( pcCU, uiAbsPartIdx, uiDepth, false, TEXT_LUMA );
    70236888      xEncodeResidualQT( pcCU, uiAbsPartIdx, uiDepth, false, TEXT_CHROMA_U );
    70246889      xEncodeResidualQT( pcCU, uiAbsPartIdx, uiDepth, false, TEXT_CHROMA_V );
    7025     }
    70266890   
    70276891    uiSubdivBits = m_pcEntropyCoder->getNumberOfWrittenBits();
     
    70506914    }
    70516915    assert( bCheckFull );
    7052     if( m_bUseSBACRD )
    7053     {
    7054       m_pcRDGoOnSbacCoder->load( m_pppcRDSbacCoder[ uiDepth ][ CI_QT_TRAFO_TEST ] );
    7055     }
    7056   }
    7057 
     6916
     6917    m_pcRDGoOnSbacCoder->load( m_pppcRDSbacCoder[ uiDepth ][ CI_QT_TRAFO_TEST ] );
     6918  }
    70586919#if H_3D_VSO // M33
    70596920  if( m_pcRdCost->getUseRenModel() && !m_pcRdCost->getUseEstimatedVSD() )
     
    70616922    UInt  uiWidth     = 1<< uiLog2TrSize;
    70626923    UInt  uiHeight    = 1<< uiLog2TrSize;
    7063 
    70646924    Pel*  piSrc;
    70656925    UInt  uiSrcStride;
    7066 
    70676926    if ( uiAbsSumY )
    70686927    {
     
    70776936      uiSrcStride = pcPred->getStride  ();
    70786937    }
    7079 
    70806938    m_pcRdCost->setRenModelData( pcCU, uiAbsPartIdx, piSrc, (Int) uiSrcStride, (Int) uiWidth, (Int) uiHeight );
    70816939  }
    70826940#endif
    7083 
    70846941  rdCost += dSingleCost;
    70856942  ruiBits += uiSingleBits;
     
    71066963  const UInt uiLog2TrSize = g_aucConvertToBit[pcCU->getSlice()->getSPS()->getMaxCUWidth() >> uiDepth]+2;
    71076964
    7108   {
    71096965    if( bSubdivAndCbf && uiLog2TrSize <= pcCU->getSlice()->getSPS()->getQuadtreeTULog2MaxSize() && uiLog2TrSize > pcCU->getQuadtreeTULog2MinSizeInCU(uiAbsPartIdx) )
    71106966    {
    71116967      m_pcEntropyCoder->encodeTransformSubdivFlag( bSubdiv, 5 - uiLog2TrSize );
    71126968    }
    7113   }
    7114 
    7115   {
     6969
    71166970    assert( pcCU->getPredictionMode(uiAbsPartIdx) != MODE_INTRA );
    71176971    if( bSubdivAndCbf )
     
    71356989      }
    71366990    }
    7137   }
    71386991 
    71396992  if( !bSubdiv )
     
    71597012    if( bSubdivAndCbf )
    71607013    {
    7161       {
    71627014        m_pcEntropyCoder->encodeQtCbf( pcCU, uiAbsPartIdx, TEXT_LUMA,     uiTrMode );
    71637015      }
    7164     }
    71657016    else
    71667017    {
     
    72297080      if( bCodeChroma )
    72307081      {
    7231         {
    72327082          m_pcQTTempTComYuv[uiQTTempAccessLayer].copyPartToPartChroma( pcResi, uiAbsPartIdx, 1 << uiLog2TrSizeC, 1 << uiLog2TrSizeC );
    72337083        }
    72347084      }
    7235     }
    72367085    else
    72377086    {
     
    72797128UInt TEncSearch::xModeBitsIntra( TComDataCU* pcCU, UInt uiMode, UInt uiPU, UInt uiPartOffset, UInt uiDepth, UInt uiInitTrDepth )
    72807129{
    7281   if( m_bUseSBACRD )
    7282   {
    72837130    // Reload only contexts required for coding intra mode information
    72847131    m_pcRDGoOnSbacCoder->loadIntraDirModeLuma( m_pppcRDSbacCoder[uiDepth][CI_CURR_BEST] );
     
    72867133    m_pcRDGoOnSbacCoder->loadIntraDepthMode( m_pppcRDSbacCoder[uiDepth][CI_CURR_BEST] );
    72877134#endif
    7288   }
    72897135 
    72907136  pcCU->setLumaIntraDirSubParts ( uiMode, uiPartOffset, uiDepth + uiInitTrDepth );
  • branches/HTM-10.0rc1-dev0/source/Lib/TLibEncoder/TEncSearch.h

    r833 r837  
    44 * granted under this license. 
    55 *
    6  * Copyright (c) 2010-2013, ITU/ISO/IEC
     6* Copyright (c) 2010-2014, ITU/ISO/IEC
    77 * All rights reserved.
    88 *
     
    114114  TEncSbac***     m_pppcRDSbacCoder;
    115115  TEncSbac*       m_pcRDGoOnSbacCoder;
    116   Bool            m_bUseSBACRD;
    117116  DistParam       m_cDistParam;
    118117 
  • branches/HTM-10.0rc1-dev0/source/Lib/TLibEncoder/TEncSlice.cpp

    r773 r837  
    44 * granted under this license. 
    55 *
    6  * Copyright (c) 2010-2013, ITU/ISO/IEC
     6* Copyright (c) 2010-2014, ITU/ISO/IEC
    77 * All rights reserved.
    88 *
     
    266266 
    267267  eSliceType=B_SLICE;
    268   eSliceType = (pocLast == 0 || pocCurr % m_pcCfg->getIntraPeriod() == 0 || m_pcGOPEncoder->getGOPSize() == 0) ? I_SLICE : eSliceType;
     268  eSliceType = (pocLast == 0 || (pocCurr - isField) % m_pcCfg->getIntraPeriod() == 0 || m_pcGOPEncoder->getGOPSize() == 0) ? I_SLICE : eSliceType;
    269269 
    270270  rpcSlice->setSliceType    ( eSliceType );
     
    296296  if(eSliceType!=I_SLICE)
    297297  {
    298     if (!(( m_pcCfg->getMaxDeltaQP() == 0 ) && (dQP == -rpcSlice->getSPS()->getQpBDOffsetY() ) && (rpcSlice->getSPS()->getUseLossless())))
     298    if (!(( m_pcCfg->getMaxDeltaQP() == 0 ) && (dQP == -rpcSlice->getSPS()->getQpBDOffsetY() ) && (rpcSlice->getPPS()->getTransquantBypassEnableFlag())))
    299299    {
    300300#if H_MV
     
    312312    dQP += pdQPs[ rpcSlice->getPOC() ];
    313313  }
    314 #if !RATE_CONTROL_LAMBDA_DOMAIN
    315   if ( m_pcCfg->getUseRateCtrl())
    316   {
    317     dQP = m_pcRateCtrl->getFrameQP(rpcSlice->isReferenced(), rpcSlice->getPOC());
    318   }
    319 #endif
    320314  // ------------------------------------------------------------------------------------------------------------------
    321315  // Lambda computation
     
    399393  // store lambda
    400394  m_pcRdCost ->setLambda( dLambda );
    401 
    402 #if H_3D_VSO
    403   m_pcRdCost->setUseLambdaScaleVSO  ( (m_pcCfg->getUseVSO() ||  m_pcCfg->getForceLambdaScaleVSO()) && m_pcCfg->getIsDepth() );
    404   m_pcRdCost->setLambdaVSO          ( dLambda * m_pcCfg->getLambdaScaleVSO() );
    405 
    406   // Should be moved to TEncTop
    407  
    408   // SAIT_VSO_EST_A0033
    409   m_pcRdCost->setDisparityCoeff( m_pcCfg->getDispCoeff() );
    410 
    411   // LGE_WVSO_A0119
    412   if( m_pcCfg->getUseWVSO() && m_pcCfg->getIsDepth() )
    413   {
    414     m_pcRdCost->setDWeight  ( m_pcCfg->getDWeight()   );
    415     m_pcRdCost->setVSOWeight( m_pcCfg->getVSOWeight() );
    416     m_pcRdCost->setVSDWeight( m_pcCfg->getVSDWeight() );
    417   }
    418 
    419 #endif
    420 
    421 #if WEIGHTED_CHROMA_DISTORTION
    422395// for RDO
    423396  // in RdCost there is only one lambda because the luma and chroma bits are not separated, instead we weight the distortion of chroma.
    424   Double weight = 1.0;
     397  Double weight[2] = { 1.0, 1.0 };
    425398  Int qpc;
    426399  Int chromaQPOffset;
     
    428401  chromaQPOffset = rpcSlice->getPPS()->getChromaCbQpOffset() + rpcSlice->getSliceQpDeltaCb();
    429402  qpc = Clip3( 0, 57, iQP + chromaQPOffset);
    430   weight = pow( 2.0, (iQP-g_aucChromaScale[qpc])/3.0 );  // takes into account of the chroma qp mapping and chroma qp Offset
    431   m_pcRdCost->setCbDistortionWeight(weight);
     403  weight[0] = pow( 2.0, (iQP-g_aucChromaScale[qpc])/3.0 );  // takes into account of the chroma qp mapping and chroma qp Offset
     404  m_pcRdCost->setCbDistortionWeight(weight[0]);
    432405
    433406  chromaQPOffset = rpcSlice->getPPS()->getChromaCrQpOffset() + rpcSlice->getSliceQpDeltaCr();
    434407  qpc = Clip3( 0, 57, iQP + chromaQPOffset);
    435   weight = pow( 2.0, (iQP-g_aucChromaScale[qpc])/3.0 );  // takes into account of the chroma qp mapping and chroma qp Offset
    436   m_pcRdCost->setCrDistortionWeight(weight);
    437 #endif
     408  weight[1] = pow( 2.0, (iQP-g_aucChromaScale[qpc])/3.0 );  // takes into account of the chroma qp mapping and chroma qp Offset
     409  m_pcRdCost->setCrDistortionWeight(weight[1]);
     410
     411  const Double lambdaArray[3] = {dLambda, (dLambda / weight[0]), (dLambda / weight[1])};
    438412
    439413#if RDOQ_CHROMA_LAMBDA
    440414// for RDOQ
    441   m_pcTrQuant->setLambda( dLambda, dLambda / weight );   
     415  m_pcTrQuant->setLambdas( lambdaArray );
    442416#else
    443417  m_pcTrQuant->setLambda( dLambda );
    444418#endif
    445419
    446 #if SAO_CHROMA_LAMBDA
    447420// For SAO
    448   rpcSlice   ->setLambda( dLambda, dLambda / weight ); 
    449 #else
    450   rpcSlice   ->setLambda( dLambda );
    451 #endif
     421  rpcSlice->setLambdas( lambdaArray );
    452422 
    453423#if HB_LAMBDA_FOR_LDC
     
    460430  }
    461431#else
    462   eSliceType = (pocLast == 0 || pocCurr % m_pcCfg->getIntraPeriod() == 0 || m_pcGOPEncoder->getGOPSize() == 0) ? I_SLICE : eSliceType;
     432eSliceType = (pocLast == 0 || (pocCurr - isField) % m_pcCfg->getIntraPeriod() == 0 || m_pcGOPEncoder->getGOPSize() == 0) ? I_SLICE : eSliceType;
    463433#endif
    464434
     
    570540}
    571541
    572 #if RATE_CONTROL_LAMBDA_DOMAIN
    573542Void TEncSlice::resetQP( TComPic* pic, Int sliceQP, Double lambda )
    574543{
     
    579548  slice->setSliceQpBase ( sliceQP );
    580549  m_pcRdCost ->setLambda( lambda );
    581 #if WEIGHTED_CHROMA_DISTORTION
    582550  // for RDO
    583551  // in RdCost there is only one lambda because the luma and chroma bits are not separated, instead we weight the distortion of chroma.
    584   Double weight;
     552  Double weight[2] = { 1.0, 1.0 };
    585553  Int qpc;
    586554  Int chromaQPOffset;
     
    588556  chromaQPOffset = slice->getPPS()->getChromaCbQpOffset() + slice->getSliceQpDeltaCb();
    589557  qpc = Clip3( 0, 57, sliceQP + chromaQPOffset);
    590   weight = pow( 2.0, (sliceQP-g_aucChromaScale[qpc])/3.0 );  // takes into account of the chroma qp mapping and chroma qp Offset
    591   m_pcRdCost->setCbDistortionWeight(weight);
     558  weight[0] = pow( 2.0, (sliceQP-g_aucChromaScale[qpc])/3.0 );  // takes into account of the chroma qp mapping and chroma qp Offset
     559  m_pcRdCost->setCbDistortionWeight(weight[0]);
    592560
    593561  chromaQPOffset = slice->getPPS()->getChromaCrQpOffset() + slice->getSliceQpDeltaCr();
    594562  qpc = Clip3( 0, 57, sliceQP + chromaQPOffset);
    595   weight = pow( 2.0, (sliceQP-g_aucChromaScale[qpc])/3.0 );  // takes into account of the chroma qp mapping and chroma qp Offset
    596   m_pcRdCost->setCrDistortionWeight(weight);
    597 #endif
     563  weight[1] = pow( 2.0, (sliceQP-g_aucChromaScale[qpc])/3.0 );  // takes into account of the chroma qp mapping and chroma qp Offset
     564  m_pcRdCost->setCrDistortionWeight(weight[1]);
     565
    598566
    599567#if RDOQ_CHROMA_LAMBDA
    600568  // for RDOQ
    601   m_pcTrQuant->setLambda( lambda, lambda / weight );
     569  m_pcTrQuant->setLambdas( lambdaArray );
    602570#else
    603571  m_pcTrQuant->setLambda( lambda );
    604572#endif
    605573
    606 #if SAO_CHROMA_LAMBDA
    607574  // For SAO
    608   slice   ->setLambda( lambda, lambda / weight );
    609 #else
    610   slice   ->setLambda( lambda );
    611 #endif
     575  slice->setLambdas( lambdaArray );
    612576}
    613 #else
    614 /**
    615  - lambda re-computation based on rate control QP
    616  */
    617 Void TEncSlice::xLamdaRecalculation(Int changeQP, Int idGOP, Int depth, SliceType eSliceType, TComSPS* pcSPS, TComSlice* pcSlice)
    618 {
    619   Int qp;
    620   Double recalQP= (Double)changeQP;
    621   Double origQP = (Double)recalQP;
    622   Double lambda;
    623 
    624   // pre-compute lambda and QP values for all possible QP candidates
    625   for ( Int deltqQpIdx = 0; deltqQpIdx < 2 * m_pcCfg->getDeltaQpRD() + 1; deltqQpIdx++ )
    626   {
    627     // compute QP value
    628     recalQP = origQP + ((deltqQpIdx+1)>>1)*(deltqQpIdx%2 ? -1 : 1);
    629 
    630     // compute lambda value
    631     Int    NumberBFrames = ( m_pcCfg->getGOPSize() - 1 );
    632     Int    SHIFT_QP = 12;
    633     Double dLambda_scale = 1.0 - Clip3( 0.0, 0.5, 0.05*(Double)NumberBFrames );
    634 #if FULL_NBIT
    635     Int    bitdepth_luma_qp_scale = 6 * (g_bitDepth - 8);
    636 #else
    637     Int    bitdepth_luma_qp_scale = 0;
    638 #endif
    639     Double qp_temp = (Double) recalQP + bitdepth_luma_qp_scale - SHIFT_QP;
    640 #if FULL_NBIT
    641     Double qp_temp_orig = (Double) recalQP - SHIFT_QP;
    642 #endif
    643     // Case #1: I or P-slices (key-frame)
    644     Double dQPFactor = m_pcCfg->getGOPEntry(idGOP).m_QPFactor;
    645     if ( eSliceType==I_SLICE )
    646     {
    647       dQPFactor=0.57*dLambda_scale;
    648     }
    649     lambda = dQPFactor*pow( 2.0, qp_temp/3.0 );
    650 
    651     if ( depth>0 )
    652     {
    653 #if FULL_NBIT
    654       lambda *= Clip3( 2.00, 4.00, (qp_temp_orig / 6.0) ); // (j == B_SLICE && p_cur_frm->layer != 0 )
    655 #else
    656       lambda *= Clip3( 2.00, 4.00, (qp_temp / 6.0) ); // (j == B_SLICE && p_cur_frm->layer != 0 )
    657 #endif
    658     }
    659 
    660     // if hadamard is used in ME process
    661     if ( !m_pcCfg->getUseHADME() )
    662     {
    663       lambda *= 0.95;
    664     }
    665 
    666     qp = max( -pcSPS->getQpBDOffsetY(), min( MAX_QP, (Int) floor( recalQP + 0.5 ) ) );
    667 
    668     m_pdRdPicLambda[deltqQpIdx] = lambda;
    669     m_pdRdPicQp    [deltqQpIdx] = recalQP;
    670     m_piRdPicQp    [deltqQpIdx] = qp;
    671   }
    672 
    673   // obtain dQP = 0 case
    674   lambda  = m_pdRdPicLambda[0];
    675   recalQP = m_pdRdPicQp    [0];
    676   qp      = m_piRdPicQp    [0];
    677 
    678   if( pcSlice->getSliceType( ) != I_SLICE )
    679   {
    680     lambda *= m_pcCfg->getLambdaModifier( depth );
    681   }
    682 
    683   // store lambda
    684   m_pcRdCost ->setLambda( lambda );
    685 #if WEIGHTED_CHROMA_DISTORTION
    686   // for RDO
    687   // in RdCost there is only one lambda because the luma and chroma bits are not separated, instead we weight the distortion of chroma.
    688   Double weight = 1.0;
    689   Int qpc;
    690   Int chromaQPOffset;
    691 
    692   chromaQPOffset = pcSlice->getPPS()->getChromaCbQpOffset() + pcSlice->getSliceQpDeltaCb();
    693   qpc = Clip3( 0, 57, qp + chromaQPOffset);
    694   weight = pow( 2.0, (qp-g_aucChromaScale[qpc])/3.0 );  // takes into account of the chroma qp mapping and chroma qp Offset
    695   m_pcRdCost->setCbDistortionWeight(weight);
    696 
    697   chromaQPOffset = pcSlice->getPPS()->getChromaCrQpOffset() + pcSlice->getSliceQpDeltaCr();
    698   qpc = Clip3( 0, 57, qp + chromaQPOffset);
    699   weight = pow( 2.0, (qp-g_aucChromaScale[qpc])/3.0 );  // takes into account of the chroma qp mapping and chroma qp Offset
    700   m_pcRdCost->setCrDistortionWeight(weight);
    701 #endif
    702 
    703 #if RDOQ_CHROMA_LAMBDA
    704   // for RDOQ
    705   m_pcTrQuant->setLambda( lambda, lambda / weight );   
    706 #else
    707   m_pcTrQuant->setLambda( lambda );
    708 #endif
    709 
    710 #if SAO_CHROMA_LAMBDA
    711   // For SAO
    712   pcSlice   ->setLambda( lambda, lambda / weight ); 
    713 #else
    714   pcSlice   ->setLambda( lambda );
    715 #endif
    716 }
    717 #endif
    718577// ====================================================================================================================
    719578// Public member functions
     
    755614  }
    756615
    757 #if RATE_CONTROL_LAMBDA_DOMAIN
    758616  if ( m_pcCfg->getUseRateCtrl() )
    759617  {
     
    761619    assert(0);
    762620  }
    763 #endif
    764621 
    765622  TComSlice* pcSlice        = rpcPic->getSlice(getSliceIdx());
     
    793650#endif
    794651    m_pcRdCost    ->setLambda              ( m_pdRdPicLambda[uiQpIdx] );
    795 #if WEIGHTED_CHROMA_DISTORTION
    796652    // for RDO
    797653    // in RdCost there is only one lambda because the luma and chroma bits are not separated, instead we weight the distortion of chroma.
    798654    Int iQP = m_piRdPicQp    [uiQpIdx];
    799     Double weight = 1.0;
     655    Double weight[2] = { 1.0, 1.0 };
    800656    Int qpc;
    801657    Int chromaQPOffset;
     
    803659    chromaQPOffset = pcSlice->getPPS()->getChromaCbQpOffset() + pcSlice->getSliceQpDeltaCb();
    804660    qpc = Clip3( 0, 57, iQP + chromaQPOffset);
    805     weight = pow( 2.0, (iQP-g_aucChromaScale[qpc])/3.0 );  // takes into account of the chroma qp mapping and chroma qp Offset
    806     m_pcRdCost->setCbDistortionWeight(weight);
     661    weight[0] = pow( 2.0, (iQP-g_aucChromaScale[qpc])/3.0 );  // takes into account of the chroma qp mapping and chroma qp Offset
     662    m_pcRdCost->setCbDistortionWeight(weight[0]);
    807663
    808664    chromaQPOffset = pcSlice->getPPS()->getChromaCrQpOffset() + pcSlice->getSliceQpDeltaCr();
    809665    qpc = Clip3( 0, 57, iQP + chromaQPOffset);
    810     weight = pow( 2.0, (iQP-g_aucChromaScale[qpc])/3.0 );  // takes into account of the chroma qp mapping and chroma qp Offset
    811     m_pcRdCost->setCrDistortionWeight(weight);
    812 #endif
    813 
     666    weight[1] = pow( 2.0, (iQP-g_aucChromaScale[qpc])/3.0 );  // takes into account of the chroma qp mapping and chroma qp Offset
     667    m_pcRdCost->setCrDistortionWeight(weight[1]);
     668
     669    const Double lambdaArray[3] = {m_pdRdPicLambda[uiQpIdx], (m_pdRdPicLambda[uiQpIdx] / weight[0]), (m_pdRdPicLambda[uiQpIdx] / weight[1])};
    814670#if RDOQ_CHROMA_LAMBDA
    815671    // for RDOQ
    816     m_pcTrQuant   ->setLambda( m_pdRdPicLambda[uiQpIdx], m_pdRdPicLambda[uiQpIdx] / weight );
     672    m_pcTrQuant->setLambdas( lambdaArray );
    817673#else
    818674    m_pcTrQuant   ->setLambda              ( m_pdRdPicLambda[uiQpIdx] );
    819675#endif
    820 #if SAO_CHROMA_LAMBDA
    821676    // For SAO
    822     pcSlice       ->setLambda              ( m_pdRdPicLambda[uiQpIdx], m_pdRdPicLambda[uiQpIdx] / weight );
    823 #else
    824     pcSlice       ->setLambda              ( m_pdRdPicLambda[uiQpIdx] );
    825 #endif
     677    pcSlice->setLambdas( lambdaArray );
    826678   
    827679    // try compress
     
    857709#endif
    858710  m_pcRdCost    ->setLambda              ( m_pdRdPicLambda[uiQpIdxBest] );
    859 #if WEIGHTED_CHROMA_DISTORTION
    860711  // in RdCost there is only one lambda because the luma and chroma bits are not separated, instead we weight the distortion of chroma.
    861712  Int iQP = m_piRdPicQp    [uiQpIdxBest];
    862   Double weight = 1.0;
     713  Double weight[2] = { 1.0, 1.0 };
    863714  Int qpc;
    864715  Int chromaQPOffset;
     
    866717  chromaQPOffset = pcSlice->getPPS()->getChromaCbQpOffset() + pcSlice->getSliceQpDeltaCb();
    867718  qpc = Clip3( 0, 57, iQP + chromaQPOffset);
    868   weight = pow( 2.0, (iQP-g_aucChromaScale[qpc])/3.0 );  // takes into account of the chroma qp mapping and chroma qp Offset
    869   m_pcRdCost->setCbDistortionWeight(weight);
     719  weight[0] = pow( 2.0, (iQP-g_aucChromaScale[qpc])/3.0 );  // takes into account of the chroma qp mapping and chroma qp Offset
     720  m_pcRdCost->setCbDistortionWeight(weight[0]);
    870721
    871722  chromaQPOffset = pcSlice->getPPS()->getChromaCrQpOffset() + pcSlice->getSliceQpDeltaCr();
    872723  qpc = Clip3( 0, 57, iQP + chromaQPOffset);
    873   weight = pow( 2.0, (iQP-g_aucChromaScale[qpc])/3.0 );  // takes into account of the chroma qp mapping and chroma qp Offset
    874   m_pcRdCost->setCrDistortionWeight(weight);
    875 #endif
    876 
     724  weight[1] = pow( 2.0, (iQP-g_aucChromaScale[qpc])/3.0 );  // takes into account of the chroma qp mapping and chroma qp Offset
     725  m_pcRdCost->setCrDistortionWeight(weight[1]);
     726
     727  const Double lambdaArray[3] = {m_pdRdPicLambda[uiQpIdxBest], (m_pdRdPicLambda[uiQpIdxBest] / weight[0]), (m_pdRdPicLambda[uiQpIdxBest] / weight[1])};
    877728#if RDOQ_CHROMA_LAMBDA
    878729  // for RDOQ
    879   m_pcTrQuant   ->setLambda( m_pdRdPicLambda[uiQpIdxBest], m_pdRdPicLambda[uiQpIdxBest] / weight );
     730  m_pcTrQuant->setLambdas( lambdaArray );
    880731#else
    881732  m_pcTrQuant   ->setLambda              ( m_pdRdPicLambda[uiQpIdxBest] );
    882733#endif
    883 #if SAO_CHROMA_LAMBDA
    884734  // For SAO
    885   pcSlice       ->setLambda              ( m_pdRdPicLambda[uiQpIdxBest], m_pdRdPicLambda[uiQpIdxBest] / weight );
    886 #else
    887   pcSlice       ->setLambda              ( m_pdRdPicLambda[uiQpIdxBest] );
    888 #endif
     735  pcSlice->setLambdas( lambdaArray );
    889736}
    890737
    891738/** \param rpcPic   picture class
    892739 */
    893 #if RATE_CONTROL_INTRA
    894740Void TEncSlice::calCostSliceI(TComPic*& rpcPic)
    895741{
     
    925771  m_pcRateCtrl->getRCPic()->setTotalIntraCost(iSumHadSlice);
    926772}
    927 #endif
    928773
    929774Void TEncSlice::compressSlice( TComPic*& rpcPic )
     
    943788 
    944789  // set entropy coder
    945   if( m_pcCfg->getUseSBACRD() )
    946   {
    947790    m_pcSbacCoder->init( m_pcBinCABAC );
    948791    m_pcEntropyCoder->setEntropyCoder   ( m_pcSbacCoder, pcSlice );
     
    952795    pppcRDSbacCoder->setBinCountingEnableFlag( false );
    953796    pppcRDSbacCoder->setBinsCoded( 0 );
    954   }
    955   else
    956   {
    957     m_pcEntropyCoder->setEntropyCoder ( m_pcCavlcCoder, pcSlice );
    958     m_pcEntropyCoder->resetEntropy      ();
    959     m_pcEntropyCoder->setBitstream    ( m_pcBitCounter );
    960   }
    961797 
    962798  //------------------------------------------------------------------------------
     
    1016852  }
    1017853#endif
    1018   if( m_pcCfg->getUseSBACRD() )
    1019   {
    1020854    iNumSubstreams = pcSlice->getPPS()->getNumSubstreams();
    1021855    uiTilesAcross = rpcPic->getPicSym()->getNumColumnsMinus1()+1;
     
    1037871      ppppcRDSbacCoders[ui][0][CI_CURR_BEST]->load(m_pppcRDSbacCoder[0][CI_CURR_BEST]);
    1038872    }
    1039   }
    1040   //if( m_pcCfg->getUseSBACRD() )
    1041   {
    1042873    delete[] m_pcBufferLowLatSbacCoders;
    1043874    delete[] m_pcBufferLowLatBinCoderCABACs;
     
    1050881    for (UInt ui = 0; ui < uiTilesAcross; ui++)
    1051882      m_pcBufferLowLatSbacCoders[ui].load(m_pppcRDSbacCoder[0][CI_CURR_BEST]);  //init. state
    1052   }
     883
    1053884  UInt uiWidthInLCUs  = rpcPic->getPicSym()->getFrameWidthInCU();
    1054885  //UInt uiHeightInLCUs = rpcPic->getPicSym()->getFrameHeightInCU();
     
    1121952    }
    1122953#endif
    1123 #if !RATE_CONTROL_LAMBDA_DOMAIN
    1124     if(m_pcCfg->getUseRateCtrl())
    1125     {
    1126 #if KWU_RC_MADPRED_E0227
    1127       if(pcSlice->getLayerId() != 0 && m_pcCfg->getUseDepthMADPred() && !pcSlice->getIsDepth())
    1128       {
    1129         Double zn, zf, focallength, position, camshift;
    1130         Double basepos;
    1131         Bool bInterpolated;
    1132         Int direction = pcSlice->getViewId() - pcCU->getSlice()->getIvPic(false, 0)->getViewId();
    1133 
    1134         pcEncTop->getCamParam()->xGetZNearZFar(pcEncTop->getCamParam()->getBaseViewNumbers()[pcSlice->getViewIndex()], pcSlice->getPOC(), zn, zf);
    1135         pcEncTop->getCamParam()->xGetGeometryData(pcEncTop->getCamParam()->getBaseViewNumbers()[0], pcSlice->getPOC(), focallength, basepos, camshift, bInterpolated);
    1136         pcEncTop->getCamParam()->xGetGeometryData(pcEncTop->getCamParam()->getBaseViewNumbers()[pcSlice->getViewIndex()], pcSlice->getPOC(), focallength, position, camshift, bInterpolated);
    1137 
    1138         m_pcRateCtrl->updateLCUDataEnhancedView(pcCU, pcCU->getTotalBits(), pcCU->getQP(0), basepos, position, focallength, zn, zf, (direction > 0 ? 1 : -1));
    1139       }
    1140 #endif
    1141       if(m_pcRateCtrl->calculateUnitQP())
    1142       {
    1143         xLamdaRecalculation(m_pcRateCtrl->getUnitQP(), m_pcRateCtrl->getGOPId(), pcSlice->getDepth(), pcSlice->getSliceType(), pcSlice->getSPS(), pcSlice );
    1144       }
    1145     }
    1146 #endif
    1147954    // inherit from TR if necessary, select substream to use.
    1148     if( m_pcCfg->getUseSBACRD() )
    1149     {
    1150955      uiTileCol = rpcPic->getPicSym()->getTileIdxMap(uiCUAddr) % (rpcPic->getPicSym()->getNumColumnsMinus1()+1); // what column of tiles are we in?
    1151956      uiTileStartLCU = rpcPic->getPicSym()->getTComTile(rpcPic->getPicSym()->getTileIdxMap(uiCUAddr))->getFirstCUAddr();
     
    1192997      }
    1193998      m_pppcRDSbacCoder[0][CI_CURR_BEST]->load( ppppcRDSbacCoders[uiSubStrm][0][CI_CURR_BEST] ); //this load is used to simplify the code
    1194     }
    1195999
    11961000    // reset the entropy coder
     
    12101014      m_pcEntropyCoder->setEntropyCoder     ( m_pcSbacCoder, pcSlice );
    12111015    }
    1212     // if RD based on SBAC is used
    1213     if( m_pcCfg->getUseSBACRD() )
    1214     {
     1016
    12151017      // set go-on entropy coder
    12161018      m_pcEntropyCoder->setEntropyCoder ( m_pcRDGoOnSbacCoder, pcSlice );
     
    12191021      ((TEncBinCABAC*)m_pcRDGoOnSbacCoder->getEncBinIf())->setBinCountingEnableFlag(true);
    12201022
    1221 #if RATE_CONTROL_LAMBDA_DOMAIN
    12221023      Double oldLambda = m_pcRdCost->getLambda();
    12231024      if ( m_pcCfg->getUseRateCtrl() )
     
    12271028        Double bpp       = -1.0;
    12281029
    1229 #if M0036_RC_IMPROVEMENT
    12301030        if ( ( rpcPic->getSlice( 0 )->getSliceType() == I_SLICE && m_pcCfg->getForceIntraQP() ) || !m_pcCfg->getLCULevelRC() )
    1231 #else
    1232         if ( rpcPic->getSlice( 0 )->getSliceType() == I_SLICE || !m_pcCfg->getLCULevelRC() )
    1233 #endif
    12341031        {
    12351032          estQP = pcSlice->getSliceQp();
     
    12551052          {
    12561053#endif
    1257 #if RATE_CONTROL_INTRA
    12581054          bpp = m_pcRateCtrl->getRCPic()->getLCUTargetBpp(pcSlice->getSliceType());
    12591055          if ( rpcPic->getSlice( 0 )->getSliceType() == I_SLICE)
     
    12661062            estQP     = m_pcRateCtrl->getRCPic()->getLCUEstQP    ( estLambda, pcSlice->getSliceQp() );
    12671063          }
    1268 #else
    1269           bpp       = m_pcRateCtrl->getRCPic()->getLCUTargetBpp();
    1270           estLambda = m_pcRateCtrl->getRCPic()->getLCUEstLambda( bpp );
    1271           estQP     = m_pcRateCtrl->getRCPic()->getLCUEstQP    ( estLambda, pcSlice->getSliceQp() );
    1272 #endif
    1273 #if KWU_RC_MADPRED_E0227
    1274           }
    1275 #endif
    12761064#if KWU_RC_MADPRED_E0227
    12771065          estLambda = m_pcRateCtrl->getRCPic()->getLCUEstLambda( bpp );
     
    12811069
    12821070          m_pcRdCost->setLambda(estLambda);
    1283 #if M0036_RC_IMPROVEMENT
    12841071#if RDOQ_CHROMA_LAMBDA
    12851072          // set lambda for RDOQ
    12861073          Double weight=m_pcRdCost->getChromaWeight();
    1287           m_pcTrQuant->setLambda( estLambda, estLambda / weight );
     1074        const Double lambdaArray[3] = { estLambda, (estLambda / weight), (estLambda / weight) };
     1075        m_pcTrQuant->setLambdas( lambdaArray );
    12881076#else
    12891077          m_pcTrQuant->setLambda( estLambda );
    1290 #endif
    12911078#endif
    12921079        }
     
    12951082        pcCU->getSlice()->setSliceQpBase( estQP );
    12961083      }
    1297 #endif
    12981084
    12991085      // run CU encoder
    13001086      m_pcCuEncoder->compressCU( pcCU );
    13011087
    1302 #if !TICKET_1090_FIX
    1303 #if RATE_CONTROL_LAMBDA_DOMAIN
    1304       if ( m_pcCfg->getUseRateCtrl() )
    1305       {
    1306 #if !M0036_RC_IMPROVEMENT
    1307         UInt SAD    = m_pcCuEncoder->getLCUPredictionSAD();
    1308         Int height  = min( pcSlice->getSPS()->getMaxCUHeight(),pcSlice->getSPS()->getPicHeightInLumaSamples() - uiCUAddr / rpcPic->getFrameWidthInCU() * pcSlice->getSPS()->getMaxCUHeight() );
    1309         Int width   = min( pcSlice->getSPS()->getMaxCUWidth(),pcSlice->getSPS()->getPicWidthInLumaSamples() - uiCUAddr % rpcPic->getFrameWidthInCU() * pcSlice->getSPS()->getMaxCUWidth() );
    1310         Double MAD = (Double)SAD / (Double)(height * width);
    1311         MAD = MAD * MAD;
    1312         ( m_pcRateCtrl->getRCPic()->getLCU(uiCUAddr) ).m_MAD = MAD;
    1313 #endif
    1314 
    1315         Int actualQP        = g_RCInvalidQPValue;
    1316         Double actualLambda = m_pcRdCost->getLambda();
    1317         Int actualBits      = pcCU->getTotalBits();
    1318         Int numberOfEffectivePixels    = 0;
    1319         for ( Int idx = 0; idx < rpcPic->getNumPartInCU(); idx++ )
    1320         {
    1321           if ( pcCU->getPredictionMode( idx ) != MODE_NONE && ( !pcCU->isSkipped( idx ) ) )
    1322           {
    1323             numberOfEffectivePixels = numberOfEffectivePixels + 16;
    1324             break;
    1325           }
    1326         }
    1327 
    1328         if ( numberOfEffectivePixels == 0 )
    1329         {
    1330           actualQP = g_RCInvalidQPValue;
    1331         }
    1332         else
    1333         {
    1334           actualQP = pcCU->getQP( 0 );
    1335         }
    1336         m_pcRdCost->setLambda(oldLambda);
    1337 #if RATE_CONTROL_INTRA
    1338         m_pcRateCtrl->getRCPic()->updateAfterLCU( m_pcRateCtrl->getRCPic()->getLCUCoded(), actualBits, actualQP, actualLambda,
    1339           pcCU->getSlice()->getSliceType() == I_SLICE ? 0 : m_pcCfg->getLCULevelRC() );
    1340 #else
    1341         m_pcRateCtrl->getRCPic()->updateAfterLCU( m_pcRateCtrl->getRCPic()->getLCUCoded(), actualBits, actualQP, actualLambda, m_pcCfg->getLCULevelRC() );
    1342 #endif
    1343       }
    1344 #endif
    1345 #endif
    1346      
    13471088      // restore entropy coder to an initial stage
    13481089      m_pcEntropyCoder->setEntropyCoder ( m_pppcRDSbacCoder[0][CI_CURR_BEST], pcSlice );
     
    13661107        break;
    13671108      }
    1368       if( m_pcCfg->getUseSBACRD() )
    1369       {
    1370          ppppcRDSbacCoders[uiSubStrm][0][CI_CURR_BEST]->load( m_pppcRDSbacCoder[0][CI_CURR_BEST] );
    13711109       
     1110    ppppcRDSbacCoders[uiSubStrm][0][CI_CURR_BEST]->load( m_pppcRDSbacCoder[0][CI_CURR_BEST] );
    13721111         //Store probabilties of second LCU in line into buffer
    13731112         if ( ( uiCol == uiTileLCUX+1) && (depSliceSegmentsEnabled || (pcSlice->getPPS()->getNumSubstreams() > 1)) && m_pcCfg->getWaveFrontsynchro())
     
    13751114          m_pcBufferSbacCoders[uiTileCol].loadContexts(ppppcRDSbacCoders[uiSubStrm][0][CI_CURR_BEST]);
    13761115        }
    1377       }
    1378 
    1379 #if TICKET_1090_FIX
    1380 #if RATE_CONTROL_LAMBDA_DOMAIN
     1116
    13811117      if ( m_pcCfg->getUseRateCtrl() )
    13821118      {
    1383 #if !M0036_RC_IMPROVEMENT || KWU_RC_MADPRED_E0227
     1119#if KWU_RC_MADPRED_E0227
    13841120        UInt SAD    = m_pcCuEncoder->getLCUPredictionSAD();
    13851121        Int height  = min( pcSlice->getSPS()->getMaxCUHeight(),pcSlice->getSPS()->getPicHeightInLumaSamples() - uiCUAddr / rpcPic->getFrameWidthInCU() * pcSlice->getSPS()->getMaxCUHeight() );
     
    14131149        m_pcRdCost->setLambda(oldLambda);
    14141150
    1415 #if RATE_CONTROL_INTRA
    14161151        m_pcRateCtrl->getRCPic()->updateAfterLCU( m_pcRateCtrl->getRCPic()->getLCUCoded(), actualBits, actualQP, actualLambda,
    14171152          pcCU->getSlice()->getSliceType() == I_SLICE ? 0 : m_pcCfg->getLCULevelRC() );
    1418 #else
    1419         m_pcRateCtrl->getRCPic()->updateAfterLCU( m_pcRateCtrl->getRCPic()->getLCUCoded(), actualBits, actualQP, actualLambda, m_pcCfg->getLCULevelRC() );
    1420 #endif
    1421       }
    1422 #endif
    1423 #endif
    1424     }
    1425     // other case: encodeCU is not called
    1426     else
    1427     {
    1428       m_pcCuEncoder->compressCU( pcCU );
    1429       m_pcCuEncoder->encodeCU( pcCU );
    1430       if (m_pcCfg->getSliceMode()==FIXED_NUMBER_OF_BYTES && ( ( pcSlice->getSliceBits()+ m_pcEntropyCoder->getNumberOfWrittenBits() ) ) > m_pcCfg->getSliceArgument()<<3)
    1431       {
    1432         pcSlice->setNextSlice( true );
    1433         break;
    1434       }
    1435       if (m_pcCfg->getSliceSegmentMode()==FIXED_NUMBER_OF_BYTES && pcSlice->getSliceSegmentBits()+ m_pcEntropyCoder->getNumberOfWrittenBits()> m_pcCfg->getSliceSegmentArgument()<<3 &&pcSlice->getSliceCurEndCUAddr()!=pcSlice->getSliceSegmentCurEndCUAddr())
    1436       {
    1437         pcSlice->setNextSliceSegment( true );
    1438         break;
    1439       }
    14401153    }
    14411154   
     
    14431156    m_dPicRdCost     += pcCU->getTotalCost();
    14441157    m_uiPicDist      += pcCU->getTotalDistortion();
    1445 #if !RATE_CONTROL_LAMBDA_DOMAIN
    1446     if(m_pcCfg->getUseRateCtrl())
    1447     {
    1448       m_pcRateCtrl->updateLCUData(pcCU, pcCU->getTotalBits(), pcCU->getQP(0));
    1449       m_pcRateCtrl->updataRCUnitStatus();
    1450     }
    1451 #endif
    14521158  }
    14531159  if ((pcSlice->getPPS()->getNumSubstreams() > 1) && !depSliceSegmentsEnabled)
     
    14551161    pcSlice->setNextSlice( true );
    14561162  }
     1163  if(m_pcCfg->getSliceMode()==FIXED_NUMBER_OF_BYTES || m_pcCfg->getSliceSegmentMode()==FIXED_NUMBER_OF_BYTES)
     1164  {
     1165    if(pcSlice->getSliceCurEndCUAddr()<=pcSlice->getSliceSegmentCurEndCUAddr())
     1166    {
     1167       pcSlice->setNextSlice( true );
     1168    }
     1169    else
     1170    {
     1171       pcSlice->setNextSliceSegment( true );
     1172    }
     1173  }
    14571174  if( depSliceSegmentsEnabled )
    14581175  {
     
    14641181  }
    14651182  xRestoreWPparam( pcSlice );
    1466 #if !RATE_CONTROL_LAMBDA_DOMAIN
    1467   if(m_pcCfg->getUseRateCtrl())
    1468   {
    1469     m_pcRateCtrl->updateFrameData(m_uiPicTotalBits);
    1470   }
    1471 #endif
    14721183}
    14731184
     
    15821293       uiCUAddr = rpcPic->getPicSym()->getCUOrderMap(++uiEncCUOrder) )
    15831294  {
    1584     if( m_pcCfg->getUseSBACRD() )
    1585     {
    15861295      uiTileCol = rpcPic->getPicSym()->getTileIdxMap(uiCUAddr) % (rpcPic->getPicSym()->getNumColumnsMinus1()+1); // what column of tiles are we in?
    15871296      uiTileStartLCU = rpcPic->getPicSym()->getTComTile(rpcPic->getPicSym()->getTileIdxMap(uiCUAddr))->getFirstCUAddr();
     
    16321341      }
    16331342      m_pcSbacCoder->load(&pcSbacCoders[uiSubStrm]);  //this load is used to simplify the code (avoid to change all the call to m_pcSbacCoder)
    1634     }
     1343
    16351344    // reset the entropy coder
    16361345    if( uiCUAddr == rpcPic->getPicSym()->getTComTile(rpcPic->getPicSym()->getTileIdxMap(uiCUAddr))->getFirstCUAddr() &&                                   // must be first CU of tile
     
    16761385#endif
    16771386    TComDataCU*& pcCU = rpcPic->getCU( uiCUAddr );   
    1678     if ( pcSlice->getSPS()->getUseSAO() && (pcSlice->getSaoEnabledFlag()||pcSlice->getSaoEnabledFlagChroma()) )
    1679     {
    1680       SAOParam *saoParam = pcSlice->getPic()->getPicSym()->getSaoParam();
    1681       Int iNumCuInWidth     = saoParam->numCuInWidth;
    1682       Int iCUAddrInSlice    = uiCUAddr - rpcPic->getPicSym()->getCUOrderMap(pcSlice->getSliceCurStartCUAddr()/rpcPic->getNumPartInCU());
    1683       Int iCUAddrUpInSlice  = iCUAddrInSlice - iNumCuInWidth;
    1684       Int rx = uiCUAddr % iNumCuInWidth;
    1685       Int ry = uiCUAddr / iNumCuInWidth;
    1686       Int allowMergeLeft = 1;
    1687       Int allowMergeUp   = 1;
    1688       if (rx!=0)
    1689       {
    1690         if (rpcPic->getPicSym()->getTileIdxMap(uiCUAddr-1) != rpcPic->getPicSym()->getTileIdxMap(uiCUAddr))
    1691         {
    1692           allowMergeLeft = 0;
    1693         }
    1694       }
    1695       if (ry!=0)
    1696       {
    1697         if (rpcPic->getPicSym()->getTileIdxMap(uiCUAddr-iNumCuInWidth) != rpcPic->getPicSym()->getTileIdxMap(uiCUAddr))
    1698         {
    1699           allowMergeUp = 0;
    1700         }
    1701       }
    1702       Int addr = pcCU->getAddr();
    1703       allowMergeLeft = allowMergeLeft && (rx>0) && (iCUAddrInSlice!=0);
    1704       allowMergeUp = allowMergeUp && (ry>0) && (iCUAddrUpInSlice>=0);
    1705       if( saoParam->bSaoFlag[0] || saoParam->bSaoFlag[1] )
    1706       {
    1707         Int mergeLeft = saoParam->saoLcuParam[0][addr].mergeLeftFlag;
    1708         Int mergeUp = saoParam->saoLcuParam[0][addr].mergeUpFlag;
    1709         if (allowMergeLeft)
    1710         {
    1711           m_pcEntropyCoder->m_pcEntropyCoderIf->codeSaoMerge(mergeLeft);
    1712         }
    1713         else
    1714         {
    1715           mergeLeft = 0;
    1716         }
    1717         if(mergeLeft == 0)
    1718         {
    1719           if (allowMergeUp)
    1720           {
    1721             m_pcEntropyCoder->m_pcEntropyCoderIf->codeSaoMerge(mergeUp);
    1722           }
    1723           else
    1724           {
    1725             mergeUp = 0;
    1726           }
    1727           if(mergeUp == 0)
    1728           {
    1729             for (Int compIdx=0;compIdx<3;compIdx++)
    1730             {
    1731             if( (compIdx == 0 && saoParam->bSaoFlag[0]) || (compIdx > 0 && saoParam->bSaoFlag[1]))
    1732               {
    1733                 m_pcEntropyCoder->encodeSaoOffset(&saoParam->saoLcuParam[compIdx][addr], compIdx);
    1734               }
    1735             }
    1736           }
    1737         }
    1738       }
    1739     }
    1740     else if (pcSlice->getSPS()->getUseSAO())
    1741     {
    1742       Int addr = pcCU->getAddr();
    1743       SAOParam *saoParam = pcSlice->getPic()->getPicSym()->getSaoParam();
    1744       for (Int cIdx=0; cIdx<3; cIdx++)
    1745       {
    1746         SaoLcuParam *saoLcuParam = &(saoParam->saoLcuParam[cIdx][addr]);
    1747         if ( ((cIdx == 0) && !pcSlice->getSaoEnabledFlag()) || ((cIdx == 1 || cIdx == 2) && !pcSlice->getSaoEnabledFlagChroma()))
    1748         {
    1749           saoLcuParam->mergeUpFlag   = 0;
    1750           saoLcuParam->mergeLeftFlag = 0;
    1751           saoLcuParam->subTypeIdx    = 0;
    1752           saoLcuParam->typeIdx       = -1;
    1753           saoLcuParam->offset[0]     = 0;
    1754           saoLcuParam->offset[1]     = 0;
    1755           saoLcuParam->offset[2]     = 0;
    1756           saoLcuParam->offset[3]     = 0;
    1757         }
     1387    if ( pcSlice->getSPS()->getUseSAO() )
     1388    {
     1389      if (pcSlice->getSaoEnabledFlag()||pcSlice->getSaoEnabledFlagChroma())
     1390      {
     1391        SAOBlkParam& saoblkParam = (rpcPic->getPicSym()->getSAOBlkParam())[uiCUAddr];
     1392        Bool sliceEnabled[NUM_SAO_COMPONENTS];
     1393        sliceEnabled[SAO_Y] = pcSlice->getSaoEnabledFlag();
     1394        sliceEnabled[SAO_Cb]= sliceEnabled[SAO_Cr]= pcSlice->getSaoEnabledFlagChroma();
     1395
     1396        Bool leftMergeAvail = false;
     1397        Bool aboveMergeAvail= false;
     1398        //merge left condition
     1399        Int rx = (uiCUAddr % uiWidthInLCUs);
     1400        if(rx > 0)
     1401        {
     1402          leftMergeAvail = rpcPic->getSAOMergeAvailability(uiCUAddr, uiCUAddr-1);
     1403        }
     1404
     1405        //merge up condition
     1406        Int ry = (uiCUAddr / uiWidthInLCUs);
     1407        if(ry > 0)
     1408      {
     1409          aboveMergeAvail = rpcPic->getSAOMergeAvailability(uiCUAddr, uiCUAddr-uiWidthInLCUs);
     1410        }
     1411
     1412        m_pcEntropyCoder->encodeSAOBlkParam(saoblkParam,sliceEnabled, leftMergeAvail, aboveMergeAvail);
    17581413      }
    17591414    }
     
    17731428    g_bJustDoIt = g_bEncDecTraceDisable;
    17741429#endif   
    1775     if( m_pcCfg->getUseSBACRD() )
    1776     {
    17771430       pcSbacCoders[uiSubStrm].load(m_pcSbacCoder);   //load back status of the entropy coder after encoding the LCU into relevant bitstream entropy coder
    17781431       
     
    17841437      }
    17851438    }
    1786 #if H_3D_QTLPC
    1787     rpcPic->setReduceBitsFlag(false);
    1788 #endif
    1789   }
    17901439  if( depSliceSegmentsEnabled )
    17911440  {
  • branches/HTM-10.0rc1-dev0/source/Lib/TLibEncoder/TEncSlice.h

    r833 r837  
    44 * granted under this license. 
    55 *
    6  * Copyright (c) 2010-2013, ITU/ISO/IEC
     6* Copyright (c) 2010-2014, ITU/ISO/IEC
    77 * All rights reserved.
    88 *
     
    107107  UInt                    m_uiSliceIdx;
    108108  std::vector<TEncSbac*> CTXMem;
    109 
    110109#if MTK_DDD_G0063
    111110  Int          m_iDDDScale;
     
    129128                                Int iGOPid,   TComSlice*& rpcSlice, TComSPS* pSPS, TComPPS *pPPS, bool isField  );
    130129#endif
    131 #if RATE_CONTROL_LAMBDA_DOMAIN
    132130  Void    resetQP             ( TComPic* pic, Int sliceQP, Double lambda );
    133 #else
    134   Void    xLamdaRecalculation ( Int changeQP, Int idGOP, Int depth, SliceType eSliceType, TComSPS* pcSPS, TComSlice* pcSlice);
    135 #endif
    136131  // compress and encode slice
    137132  Void    precompressSlice    ( TComPic*& rpcPic                                );      ///< precompress slice for multi-loop opt.
    138133  Void    compressSlice       ( TComPic*& rpcPic                                );      ///< analysis stage of slice
    139 #if RATE_CONTROL_INTRA
    140134  Void    calCostSliceI       ( TComPic*& rpcPic );
    141 #endif
    142135  Void    encodeSlice         ( TComPic*& rpcPic, TComOutputBitstream* pcSubstreams  );
    143136 
  • branches/HTM-10.0rc1-dev0/source/Lib/TLibEncoder/TEncTop.cpp

    r773 r837  
    44 * granted under this license. 
    55 *
    6  * Copyright (c) 2010-2013, ITU/ISO/IEC
     6* Copyright (c) 2010-2014, ITU/ISO/IEC
    77 * All rights reserved.
    88 *
     
    106106  if (m_bUseSAO)
    107107  {
    108     m_cEncSAO.setSaoLcuBoundary(getSaoLcuBoundary());
    109     m_cEncSAO.setSaoLcuBasedOptimization(getSaoLcuBasedOptimization());
    110     m_cEncSAO.setMaxNumOffsetsPerPic(getMaxNumOffsetsPerPic());
    111     m_cEncSAO.create( getSourceWidth(), getSourceHeight(), g_uiMaxCUWidth, g_uiMaxCUHeight );
    112     m_cEncSAO.createEncBuffer();
     108    m_cEncSAO.create( getSourceWidth(), getSourceHeight(), g_uiMaxCUWidth, g_uiMaxCUHeight, g_uiMaxCUDepth );
     109#if SAO_ENCODE_ALLOW_USE_PREDEBLOCK
     110    m_cEncSAO.createEncData(getSaoLcuBoundary());
     111#else
     112    m_cEncSAO.createEncData();
     113#endif
    113114  }
    114115#if ADAPTIVE_QP_SELECTION
     
    120121  m_cLoopFilter.        create( g_uiMaxCUDepth );
    121122
    122 #if RATE_CONTROL_LAMBDA_DOMAIN
    123123  if ( m_RCEnableRateControl )
    124124  {
     
    131131#endif
    132132  }
    133 #else
    134 #if KWU_FIX_URQ
    135   if(m_enableRateCtrl)
    136 #endif
    137     m_cRateCtrl.create(getIntraPeriod(), getGOPSize(), getFrameRate(), getTargetBitrate(), getQP(), getNumLCUInUnit(), getSourceWidth(), getSourceHeight(), g_uiMaxCUWidth, g_uiMaxCUHeight);
    138 #endif
    139   // if SBAC-based RD optimization is used
    140   if( m_bUseSBACRD )
    141   {
    142133    m_pppcRDSbacCoder = new TEncSbac** [g_uiMaxCUDepth+1];
    143134#if FAST_BIT_EST
     
    168159    }
    169160  }
    170 }
    171161
    172162/**
     
    195185    m_pcSbacCoders[ui].init( &m_pcBinCoderCABACs[ui] );
    196186  }
    197   if( m_bUseSBACRD )
    198   {
     187
    199188    m_ppppcRDSbacCoders      = new TEncSbac***    [iNumSubstreams];
    200189    m_ppppcBinCodersCABAC    = new TEncBinCABAC***[iNumSubstreams];
     
    218207    }
    219208  }
    220 }
    221209
    222210Void TEncTop::destroy ()
     
    228216  if (m_cSPS.getUseSAO())
    229217  {
     218    m_cEncSAO.destroyEncData();
    230219    m_cEncSAO.destroy();
    231     m_cEncSAO.destroyEncBuffer();
    232220  }
    233221  m_cLoopFilter.        destroy();
    234222  m_cRateCtrl.          destroy();
    235   // SBAC RD
    236   if( m_bUseSBACRD )
    237   {
     223
    238224    Int iDepth;
    239225    for ( iDepth = 0; iDepth < g_uiMaxCUDepth+1; iDepth++ )
     
    276262    delete[] m_ppppcRDSbacCoders;
    277263    delete[] m_ppppcBinCodersCABAC;
    278   }
    279264  delete[] m_pcSbacCoders;
    280265  delete[] m_pcBinCoderCABACs;
     
    439424#endif
    440425 
    441 #if RATE_CONTROL_LAMBDA_DOMAIN
    442426  if ( m_RCEnableRateControl )
    443427  {
    444428    m_cRateCtrl.initRCGOP( m_iNumPicRcvd );
    445429  }
    446 #endif
    447 
    448430#if H_MV
    449431  }
     
    457439#endif
    458440
    459 #if RATE_CONTROL_LAMBDA_DOMAIN
    460441  if ( m_RCEnableRateControl )
    461442  {
    462443    m_cRateCtrl.destroyRCGOP();
    463444  }
    464 #endif
    465445 
    466446  iNumEncoded         = m_iNumPicRcvd;
     
    510490    TComPic *pcTopField;
    511491    xGetNewPicBuffer( pcTopField );
    512     pcTopField->getPicSym()->allocSaoParam(&m_cEncSAO);
    513492    pcTopField->setReconMark (false);
    514493   
     
    532511    Pel * pcTopFieldV =  pcTopField->getPicYuvOrg()->getCrAddr();
    533512   
    534     // compute image characteristics
    535     if ( getUseAdaptiveQP() )
    536     {
    537       m_cPreanalyzer.xPreanalyze( dynamic_cast<TEncPic*>( pcTopField ) );
    538     }
    539    
    540513    /* -- Defield -- */
    541514   
     
    546519    separateFields(PicBufV + nPadChroma + (nStride >> 1)*nPadChroma, pcTopFieldV, nStride >> 1, nWidth >> 1, nHeight >> 1, isTop);
    547520   
     521    // compute image characteristics
     522    if ( getUseAdaptiveQP() )
     523    {
     524      m_cPreanalyzer.xPreanalyze( dynamic_cast<TEncPic*>( pcTopField ) );
     525    }   
    548526  }
    549527 
     
    562540    TComPic* pcBottomField;
    563541    xGetNewPicBuffer( pcBottomField );
    564     pcBottomField->getPicSym()->allocSaoParam(&m_cEncSAO);
    565542    pcBottomField->setReconMark (false);
    566543   
    567     TComPicYuv* rpcPicYuvRec = new TComPicYuv;
     544    TComPicYuv* rpcPicYuvRec;
    568545    if ( rcListPicYuvRecOut.size() == (UInt)m_iGOPSize )
    569546    {
     
    572549    else
    573550    {
     551      rpcPicYuvRec = new TComPicYuv;
    574552      rpcPicYuvRec->create( m_iSourceWidth, m_iSourceHeight, g_uiMaxCUWidth, g_uiMaxCUHeight, g_uiMaxCUDepth );
    575553    }
     
    595573    Pel * pcBottomFieldV =  pcBottomField->getPicYuvOrg()->getCrAddr();
    596574   
    597     // Compute image characteristics
    598     if ( getUseAdaptiveQP() )
    599     {
    600       m_cPreanalyzer.xPreanalyze( dynamic_cast<TEncPic*>( pcBottomField ) );
    601     }
    602    
    603575    /* -- Defield -- */
    604576   
     
    609581    separateFields(PicBufV + nPadChroma + (nStride >> 1)*nPadChroma, pcBottomFieldV, nStride >> 1, nWidth >> 1, nHeight >> 1, isTop);
    610582   
     583    // Compute image characteristics
     584    if ( getUseAdaptiveQP() )
     585    {
     586      m_cPreanalyzer.xPreanalyze( dynamic_cast<TEncPic*>( pcBottomField ) );
     587    }   
    611588  }
    612589 
     
    624601  m_uiNumAllPicCoded += iNumEncoded;
    625602}
    626 #endif
    627 
    628 
    629603
    630604// ====================================================================================================================
     
    671645      rpcPic->create( m_iSourceWidth, m_iSourceHeight, g_uiMaxCUWidth, g_uiMaxCUHeight, g_uiMaxCUDepth,
    672646                      m_conformanceWindow, m_defaultDisplayWindow, m_numReorderPics);
    673     }
    674     if (getUseSAO())
    675     {
    676       rpcPic->getPicSym()->allocSaoParam(&m_cEncSAO);
    677647    }
    678648    m_cListPic.pushBack( rpcPic );
     
    760730 
    761731  m_cSPS.setTMVPFlagsPresent(false);
    762   m_cSPS.setUseLossless   ( m_useLossless  );
    763732
    764733  m_cSPS.setMaxTrSize   ( 1 << m_uiQuadtreeTULog2MaxSize );
     
    794763  m_cSPS.setMaxTLayers( m_maxTempLayer );
    795764  m_cSPS.setTemporalIdNestingFlag( ( m_maxTempLayer == 1 ) ? true : false );
    796   for ( i = 0; i < m_cSPS.getMaxTLayers(); i++ )
     765  for ( i = 0; i < min(m_cSPS.getMaxTLayers(),(UInt) MAX_TLAYER); i++ )
    797766  {
    798767    m_cSPS.setMaxDecPicBuffering(m_maxDecPicBuffering[i], i);
     
    860829  m_cPPS.setSPSId( getLayerIdInVps() );
    861830#endif
    862 
    863831#if H_3D
    864832  m_cPPS.setDLT( getDLT() );
    865833#endif
    866 
    867834  m_cPPS.setConstrainedIntraPred( m_bUseConstrainedIntraPred );
    868835  Bool bUseDQP = (getMaxCuDQPDepth() > 0)? true : false;
    869836
    870   Int lowestQP = - m_cSPS.getQpBDOffsetY();
    871 
    872   if(getUseLossless())
    873   {
    874     if ((getMaxCuDQPDepth() == 0) && (getMaxDeltaQP() == 0 ) && (getQP() == lowestQP) )
    875     {
    876       bUseDQP = false;
    877     }
    878     else
    879     {
    880       bUseDQP = true;
    881     }
    882   }
    883   else
    884   {
    885     if(bUseDQP == false)
    886     {
    887837      if((getMaxDeltaQP() != 0 )|| getUseAdaptiveQP())
    888838      {
    889839        bUseDQP = true;
    890840      }
    891     }
    892   }
    893841
    894842  if(bUseDQP)
     
    905853  }
    906854
    907 #if RATE_CONTROL_LAMBDA_DOMAIN
    908855  if ( m_RCEnableRateControl )
    909856  {
     
    912859    m_cPPS.setMinCuDQPSize( m_cPPS.getSPS()->getMaxCUWidth() >> ( m_cPPS.getMaxCuDQPDepth()) );
    913860  }
    914 #endif
    915 #if !RATE_CONTROL_LAMBDA_DOMAIN && KWU_FIX_URQ
    916   if ( m_enableRateCtrl )
    917   {
    918     m_cPPS.setUseDQP(true);
    919     m_cPPS.setMaxCuDQPDepth( 0 );
    920     m_cPPS.setMinCuDQPSize( m_cPPS.getSPS()->getMaxCUWidth() >> ( m_cPPS.getMaxCuDQPDepth()) );
    921   }
    922 #endif
    923861
    924862  m_cPPS.setChromaCbQpOffset( m_chromaCbQpOffset );
  • branches/HTM-10.0rc1-dev0/source/Lib/TLibEncoder/TEncTop.h

    r655 r837  
    44 * granted under this license. 
    55 *
    6  * Copyright (c) 2010-2013, ITU/ISO/IEC
     6* Copyright (c) 2010-2014, ITU/ISO/IEC
    77 * All rights reserved.
    88 *
     
    8282  // encoder search
    8383  TEncSearch              m_cSearch;                      ///< encoder search class
    84   TEncEntropy*            m_pcEntropyCoder;                     ///< entropy encoder
     84  //TEncEntropy*            m_pcEntropyCoder;                     ///< entropy encoder
    8585  TEncCavlc*              m_pcCavlcCoder;                       ///< CAVLC encoder 
    8686  // coding tool
  • branches/HTM-10.0rc1-dev0/source/Lib/TLibEncoder/WeightPredAnalysis.cpp

    r608 r837  
    44 * granted under this license. 
    55 *
    6  * Copyright (c) 2010-2013, ITU/ISO/IEC
     6* Copyright (c) 2010-2014, ITU/ISO/IEC
    77 * All rights reserved.
    88 *
  • branches/HTM-10.0rc1-dev0/source/Lib/TLibEncoder/WeightPredAnalysis.h

    r608 r837  
    44 * granted under this license. 
    55 *
    6  * Copyright (c) 2010-2013, ITU/ISO/IEC
     6* Copyright (c) 2010-2014, ITU/ISO/IEC
    77 * All rights reserved.
    88 *
  • branches/HTM-10.0rc1-dev0/source/Lib/TLibVideoIO/TVideoIOYuv.cpp

    r655 r837  
    44 * granted under this license. 
    55 *
    6  * Copyright (c) 2010-2013, ITU/ISO/IEC
     6* Copyright (c) 2010-2014, ITU/ISO/IEC
    77 * All rights reserved.
    88 *
  • branches/HTM-10.0rc1-dev0/source/Lib/TLibVideoIO/TVideoIOYuv.h

    r655 r837  
    44 * granted under this license. 
    55 *
    6  * Copyright (c) 2010-2013, ITU/ISO/IEC
     6* Copyright (c) 2010-2014, ITU/ISO/IEC
    77 * All rights reserved.
    88 *
  • branches/HTM-10.0rc1-dev0/source/Lib/libmd5/MD5.h

    r608 r837  
    44 * granted under this license. 
    55 *
    6  * Copyright (c) 2010-2013, ITU/ISO/IEC
     6* Copyright (c) 2010-2014, ITU/ISO/IEC
    77 * All rights reserved.
    88 *
  • branches/HTM-10.0rc1-dev0/source/Lib/libmd5/libmd5.h

    r608 r837  
    44 * granted under this license. 
    55 *
    6  * Copyright (c) 2010-2013, ITU/ISO/IEC
     6* Copyright (c) 2010-2014, ITU/ISO/IEC
    77 * All rights reserved.
    88 *
Note: See TracChangeset for help on using the changeset viewer.