본 명세서에서 사용되는 용어는 본 발명에서의 기능을 고려하면서 가능한 현재 널리 사용되는 일반적인 용어를 선택하였으나, 이는 당 분야에 종사하는 기술자의 의도, 관례 또는 새로운 기술의 출현 등에 따라 달라질 수 있다. 또한 특정 경우는 출원인이 임의로 선정한 용어도 있으며, 이 경우 해당되는 발명의 설명 부분에서 그 의미를 기재할 것이다. 따라서 본 명세서에서 사용되는 용어는, 단순한 용어의 명칭이 아닌 그 용어가 가진 실질적인 의미와 본 명세서의 전반에 걸친 내용을 토대로 해석되어야 함을 밝혀두고자 한다.
본 명세서에서 일부 용어들은 다음과 같이 해석될 수 있다. 코딩은 경우에 따라 인코딩 또는 디코딩으로 해석될 수 있다. 본 명세서에서 비디오 신호의 인코딩(부호화)을 수행하여 비디오 신호 비트스트림을 생성하는 장치는 인코딩 장치 혹은 인코더로 지칭되며, 비디오 신호 비트스트림의 디코딩(복호화)을 수행하여 비디오 신호를 복원하는 장치는 디코딩 장치 혹은 디코더로 지칭된다. 또한, 본 명세서에서 비디오 신호 처리 장치는 인코더 및 디코더를 모두 포함하는 개념의 용어로 사용된다. 정보(information)는 값(values), 파라미터(parameter), 계수(coefficients), 성분(elements) 등을 모두 포함하는 용어로서, 경우에 따라 의미는 달리 해석될 수 있으므로 본 발명은 이에 한정되지 아니한다. '유닛'은 영상 처리의 기본 단위 또는 픽쳐의 특정 위치를 지칭하는 의미로 사용되며, 휘도(luma) 성분 및 색차(chroma) 성분 중 적어도 하나를 포함하는 이미지 영역을 가리킨다. 또한, '블록'은 휘도 성분 및 색차 성분들(즉, Cb 및 Cr) 중 특정 성분을 포함하는 이미지 영역을 가리킨다. 다만, 실시예에 따라서 '유닛', '블록', '파티션' 및 '영역' 등의 용어는 서로 혼용하여 사용될 수 있다. 또한, 본 명세서에서 유닛은 코딩 유닛, 예측 유닛, 변환 유닛을 모두 포함하는 개념으로 사용될 수 있다. 픽쳐는 필드 혹은 프레임을 가리키며, 실시예에 따라 상기 용어들은 서로 혼용하여 사용될 수 있다.
도 1은 본 발명의 일 실시예에 따른 비디오 신호 인코딩 장치(100)의 개략적인 블록도이다. 도 1을 참조하면, 본 발명의 인코딩 장치(100)는 변환부(110), 양자화부(115), 역양자화부(120), 역변환부(125), 필터링부(130), 예측부(150) 및 엔트로피 코딩부(160)를 포함한다.
변환부(110)는 입력 받은 비디오 신호와 예측부(150)에서 생성된 예측 신호의 차이인 레지듀얼 신호를 변환하여 변환 계수 값을 획득한다. 예를 들어, 이산 코사인 변환(Discrete Cosine Transform, DCT), 이산 사인 변환(Discrete Sine Transform, DST) 또는 웨이블릿 변환(Wavelet Transform) 등이 사용될 수 있다. 이산 코사인 변환 및 이산 사인 변환은 입력된 픽쳐 신호를 블록 형태로 나누어 변환을 수행하게 된다. 변환에 있어서 변환 영역 내의 값들의 분포와 특성에 따라서 코딩 효율이 달라질 수 있다. 양자화부(115)는 변환부(110)에서 출력된 변환 계수 값을 양자화한다.
코딩 효율을 높이기 위하여 픽쳐 신호를 그대로 코딩하는 것이 아니라, 예측부(150)를 통해 이미 코딩된 영역을 이용하여 픽쳐를 예측하고, 예측된 픽쳐에 원본 픽쳐와 예측 픽쳐 간의 레지듀얼 값을 더하여 복원 픽쳐를 획득하는 방법이 사용된다. 인코더와 디코더에서 미스매치가 발생되지 않도록 하기 위해, 인코더에서 예측을 수행할 때에는 디코더에서도 사용 가능한 정보를 사용해야 한다. 이를 위해, 인코더에서는 부호화한 현재 블록을 다시 복원하는 과정을 수행한다. 역양자화부(120)에서는 변환 계수 값을 역양자화하고, 역변환부(125)에서는 역양자화된 변환 계수값을 이용하여 레지듀얼 값을 복원한다. 한편, 필터링부(130)는 복원된 픽쳐의 품질 개선 및 부호화 효율 향상을 위한 필터링 연산을 수행한다. 예를 들어, 디블록킹 필터, 샘플 적응적 오프셋(Sample Adaptive Offset, SAO) 및 적응적 루프 필터 등이 포함될 수 있다. 필터링을 거친 픽쳐는 출력되거나 참조 픽쳐로 이용하기 위하여 복호 픽쳐 버퍼(Decoded Picture Buffer, DPB, 156)에 저장된다.
코딩 효율을 높이기 위하여 픽쳐 신호를 그대로 코딩하는 것이 아니라, 예측부(150)를 통해 이미 코딩된 영역을 이용하여 픽쳐를 예측하고, 예측된 픽쳐에 원 픽쳐와 예측 픽쳐 간의 레지듀얼 값을 더하여 복원 픽쳐를 획득하는 방법이 사용된다. 인트라 예측부(152)에서는 현재 픽쳐 내에서 인트라 예측을 수행하며, 인터 예측부(154)에서는 복호 픽쳐 버퍼(156)에 저장된 참조 픽쳐를 이용하여 현재 픽쳐를 예측한다. 인트라 예측부(152)는 현재 픽쳐 내의 복원된 영역들로부터 인트라 예측을 수행하여, 인트라 부호화 정보를 엔트로피 코딩부(160)에 전달한다. 인터 예측부(154)는 다시 모션 추정부(154a) 및 모션 보상부(154b)를 포함하여 구성될 수 있다. 모션 추정부(154a)에서는 복원된 특정 영역을 참조하여 현재 영역의 모션 벡터값을 획득한다. 모션 추정부(154a)에서는 참조 영역의 위치 정보(참조 프레임, 모션 벡터 등) 등을 엔트로피 코딩부(160)로 전달하여 비트스트림에 포함될 수 있도록 한다. 모션 추정부(154a)에서 전달된 모션 벡터값을 이용하여 모션 보상부(154b)에서는 인터 모션 보상을 수행한다.
예측부(150)는 인트라 예측부(152)와 인터 예측부(154)를 포함한다. 인트라 예측부(152)는 현재 픽쳐 내에서 인트라(intra) 예측을 수행하며, 인터 예측부(154)는 복호 픽쳐 버퍼(156)에 저장된 참조 픽쳐를 이용하여 현재 픽쳐를 예측하는 인터(inter) 예측을 수행한다. 인트라 예측부(152)는 현재 픽쳐 내의 복원된 샘플들로부터 인트라 예측을 수행하여, 인트라 부호화 정보를 엔트로피 코딩부(160)에 전달한다. 인트라 부호화 정보는 인트라 예측 모드, MPM(Most Probable Mode) 플래그, MPM 인덱스 중 적어도 하나를 포함할 수 있다. 인트라 부호화 정보는 참조 샘플에 관한 정보를 포함할 수 있다. 인터 예측부(154)는 모션 추정부(154a) 및 모션 보상부(154b)를 포함하여 구성될 수 있다. 모션 추정부(154a)는 복원된 참조 픽쳐의 특정 영역을 참조하여 현재 영역의 모션 벡터값을 획득한다. 모션 추정부(154a)는 참조 영역에 대한 모션 정보 세트(참조 픽쳐 인덱스, 모션 벡터 정보 등)를 엔트로피 코딩부(160)로 전달한다. 모션 보상부(154b)는 모션 추정부(154a)에서 전달된 모션 벡터값을 이용하여 모션 보상을 수행한다. 인터 예측부(154)는 참조 영역에 대한 모션 정보를 포함하는 인터 부호화 정보를 엔트로피 코딩부(160)에 전달한다.
추가적인 실시예에 따라, 예측부(150)는 인트라 블록 카피(block copy, BC) 예측부(미도시)를 포함할 수 있다. 인트라 BC 예측부는 현재 픽쳐 내의 복원된 샘플들로부터 인트라 BC 예측을 수행하여, 인트라 BC 부호화 정보를 엔트로피 코딩부(160)에 전달한다. 인트라 BC 예측부는 현재 픽쳐 내의 특정 영역을 참조하여 현재 영역의 예측에 이용되는 참조 영역을 나타내는 블록 벡터값을 획득한다. 인트라 BC 예측부는 획득된 블록 벡터값을 이용하여 인트라 BC 예측을 수행할 수 있다. 인트라 BC 예측부는 인트라 BC 부호화 정보를 엔트로피 코딩부(160)로 전달한다. 인트라 BC 부호화 정보는 블록 벡터 정보를 포함할 수 있다.
위와 같은 픽쳐 예측이 수행될 경우, 변환부(110)는 원본 픽쳐와 예측 픽쳐 간의 레지듀얼 값을 변환하여 변환 계수 값을 획득한다. 이때, 변환은 픽쳐 내에서 특정 블록 단위로 수행될 수 있으며, 특정 블록의 크기는 기 설정된 범위 내에서 가변할 수 있다. 양자화부(115)는 변환부(110)에서 생성된 변환 계수 값을 양자화하여 엔트로피 코딩부(160)로 전달한다.
엔트로피 코딩부(160)는 양자화된 변환 계수를 나타내는 정보, 인트라 부호화 정보, 및 인터 부호화 정보 등을 엔트로피 코딩하여 비디오 신호 비트스트림을 생성한다. 엔트로피 코딩부(160)에서는 가변 길이 코딩(Variable Length Coding, VLC) 방식과 산술 코딩(arithmetic coding) 방식 등이 사용될 수 있다. 가변 길이 코딩(VLC) 방식은 입력되는 심볼들을 연속적인 코드워드로 변환하는데, 코드워드의 길이는 가변적일 수 있다. 예를 들어, 자주 발생하는 심볼들을 짧은 코드워드로, 자주 발생하지 않은 심볼들은 긴 코드워드로 표현하는 것이다. 가변 길이 코딩 방식으로서 컨텍스트 기반 적응형 가변 길이 코딩(Context-based Adaptive Variable Length Coding, CAVLC) 방식이 사용될 수 있다. 산술 코딩은 연속적인 데이터 심볼들을 하나의 소수로 변환하는데, 산술 코딩은 각 심볼을 표현하기 위하여 필요한 최적의 소수 비트를 얻을 수 있다. 산술 코딩으로서 컨텍스트 기반 적응형 산술 부호화(Context-based Adaptive Binary Arithmetic Code, CABAC)가 이용될 수 있다. 예를 들어, 엔트로피 코딩부(160)는 양자화된 변환 계수를 나타내는 정보를 이진화할 수 있다. 또한, 엔트로피 코딩부(160)는 이진화된 정보를 산술 코딩하여 비트스트림을 생성할 수 있다.
상기 생성된 비트스트림은 NAL(Network Abstraction Layer) 유닛을 기본 단위로 캡슐화 된다. NAL 유닛은 부호화된 정수 개의 코딩 트리 유닛(coding tree unit)을 포함한다. 비디오 디코더에서 비트스트림을 복호화하기 위해서는 먼저 비트스트림을 NAL 유닛 단위로 분리한 후, 분리된 각각의 NAL 유닛을 복호화해야 한다. 한편, 비디오 신호 비트스트림의 복호화를 위해 필요한 정보들은 픽쳐 파라미터 세트(Picture Parameter Set, PPS), 시퀀스 파라미터 세트(Sequence Parameter Set, SPS), 비디오 파라미터 세트(Video Parameter Set, VPS) 등과 같은 상위 레벨 세트의 RBSP(Raw Byte Sequence Payload)를 통해 전송될 수 있다.
한편, 도 1의 블록도는 본 발명의 일 실시예에 따른 인코딩 장치(100)를 나타낸 것으로서, 분리하여 표시된 블록들은 인코딩 장치(100)의 엘리먼트들을 논리적으로 구별하여 도시한 것이다. 따라서 전술한 인코딩 장치(100)의 엘리먼트들은 디바이스의 설계에 따라 하나의 칩으로 또는 복수의 칩으로 장착될 수 있다. 일 실시예에 따르면, 전술한 인코딩 장치(100)의 각 엘리먼트의 동작은 프로세서(미도시)에 의해 수행될 수 있다.
도 2는 본 발명의 일 실시예에 따른 비디오 신호 디코딩 장치(200)의 개략적인 블록도이다. 도 2를 참조하면 본 발명의 디코딩 장치(200)는 엔트로피 디코딩부(210), 역양자화부(220), 역변환부(225), 필터링부(230) 및 예측부(250)를 포함한다.
엔트로피 디코딩부(210)는 비디오 신호 비트스트림을 엔트로피 디코딩하여, 각 영역에 대한 변환 계수 정보, 인트라 부호화 정보, 인터 부호화 정보 등을 추출한다. 예를 들어, 엔트로피 디코딩부(210)는 비디오 신호 비트스트림으로부터 특정 영역의 변환 계수 정보에 대한 이진화 코드를 획득할 수 있다. 또한, 엔트로피 디코딩부(210)는 이진화 코드를 역 이진화하여 양자화된 변환 계수를 획득한다. 역양자화부(220)는 양자화된 변환 계수를 역양자화하고, 역변환부(225)는 역양자화된 변환 계수를 이용하여 레지듀얼 값을 복원한다. 비디오 신호 처리 장치(200)는 역변환부(225)에서 획득된 레지듀얼 값을 예측부(250)에서 획득된 예측값과 합산하여 원래의 화소값을 복원한다.
한편, 필터링부(230)는 픽쳐에 대한 필터링을 수행하여 화질을 향상시킨다. 여기에는 블록 왜곡 현상을 감소시키기 위한 디블록킹 필터 및/또는 픽쳐 전체의 왜곡 제거를 위한 적응적 루프 필터 등이 포함될 수 있다. 필터링을 거친 픽쳐는 출력되거나 다음 픽쳐에 대한 참조 픽쳐로 이용하기 위하여 복호 픽쳐 버퍼(DPB, 256)에 저장된다.
예측부(250)는 인트라 예측부(252) 및 인터 예측부(254)를 포함한다. 예측부(250)는 전술한 엔트로피 디코딩부(210)를 통해 복호화된 부호화 타입, 각 영역에 대한 변환 계수, 인트라/인터 부호화 정보 등을 활용하여 예측 픽쳐를 생성한다. 복호화가 수행되는 현재 블록을 복원하기 위해서, 현재 블록이 포함된 현재 픽쳐 또는 다른 픽쳐들의 복호화된 영역이 이용될 수 있다. 복원에 현재 픽쳐만을 이용하는, 즉 인트라 예측 또는 인트라 BC 예측을 수행하는 픽쳐(또는, 타일/슬라이스)를 인트라 픽쳐 또는 I 픽쳐(또는, 타일/슬라이스), 인트라 예측, 인터 예측 및 인트라 BC 예측을 모두 수행할 수 있는 픽쳐(또는, 타일/슬라이스)를 인터 픽쳐(또는, 타일/슬라이스)라고 한다. 인터 픽쳐(또는, 타일/슬라이스) 중 각 블록의 샘플값들을 예측하기 위하여 최대 하나의 모션 벡터 및 참조 픽쳐 인덱스를 이용하는 픽쳐(또는, 타일/슬라이스)를 예측 픽쳐(predictive picture) 또는 P 픽쳐(또는, 타일/슬라이스)라고 하며, 최대 두 개의 모션 벡터 및 참조 픽쳐 인덱스를 이용하는 픽쳐(또는, 타일/슬라이스)를 쌍예측 픽쳐(Bi-predictive picture) 또는 B 픽쳐(또는, 타일/슬라이스) 라고 한다. 다시 말해서, P 픽쳐(또는, 타일/슬라이스)는 각 블록을 예측하기 위해 최대 하나의 모션 정보 세트를 이용하고, B 픽쳐(또는, 타일/슬라이스)는 각 블록을 예측하기 위해 최대 두 개의 모션 정보 세트를 이용한다. 여기서, 모션 정보 세트는 하나 이상의 모션 벡터와 하나의 참조 픽쳐 인덱스를 포함한다.
인트라 예측부(252)는 인트라 부호화 정보 및 현재 픽쳐 내의 복원된 샘플들을 이용하여 예측 블록을 생성한다. 전술한 바와 같이, 인트라 부호화 정보는 인트라 예측 모드, MPM(Most Probable Mode) 플래그, MPM 인덱스 중 적어도 하나를 포함할 수 있다. 인트라 예측부(252)는 현재 블록의 좌측 및/또는 상측에 위치한 복원된 샘플들을 참조 샘플들로 이용하여 현재 블록의 샘플 값들을 예측한다. 본 개시에서, 복원된 샘플들, 참조 샘플들 및 현재 블록의 샘플들은 픽셀들을 나타낼 수 있다. 또한, 샘플 값(sample value)들은 픽셀 값들을 나타낼 수 있다.
일 실시예에 따르면, 참조 샘플들은 현재 블록의 주변 블록에 포함된 샘플들일 수 있다. 예를 들어, 참조 샘플들은 현재 블록의 좌측 경계에 인접한 샘플들 및/또는 상측 경계에 인접한 샘플들일 수 있다. 또한, 참조 샘플들은 현재 블록의 주변 블록의 샘플들 중 현재 블록의 좌측 경계로부터 기 설정된 거리 이내의 라인 상에 위치하는 샘플들 및/또는 현재 블록의 상측 경계로부터 기 설정된 거리 이내의 라인 상에 위치하는 샘플들일 수 있다. 이때, 현재 블록의 주변 블록은 현재 블록에 인접한 좌측(L) 블록, 상측(A) 블록, 하좌측(Below Left, BL) 블록, 상우측(Above Right, AR) 블록 또는 상좌측(Above Left, AL) 블록 중 적어도 하나를 포함할 수 있다.
인터 예측부(254)는 복호 픽쳐 버퍼(256)에 저장된 참조 픽쳐 및 인터 부호화 정보를 이용하여 예측 블록을 생성한다. 인터 부호화 정보는 참조 블록에 대한 현재 블록의 모션 정보 세트(참조 픽쳐 인덱스, 모션 벡터 정보 등)를 포함할 수 있다. 인터 예측에는 L0 예측, L1 예측 및 쌍예측(Bi-prediction)이 있을 수 있다. L0 예측은 L0 픽쳐 리스트에 포함된 1개의 참조 픽쳐를 이용한 예측이고, L1 예측은 L1 픽쳐 리스트에 포함된 1개의 참조 픽쳐를 이용한 예측을 의미한다. 이를 위해서는 1세트의 모션 정보(예를 들어, 모션 벡터 및 참조 픽쳐 인덱스)가 필요할 수 있다. 쌍예측 방식에서는 최대 2개의 참조 영역을 이용할 수 있는데, 이 2개의 참조 영역은 동일한 참조 픽쳐에 존재할 수도 있고, 서로 다른 픽쳐에 각각 존재할 수도 있다. 즉, 쌍예측 방식에서는 최대 2세트의 모션 정보(예를 들어, 모션 벡터 및 참조 픽쳐 인덱스)가 이용될 수 있는데, 2개의 모션 벡터가 동일한 참조 픽쳐 인덱스에 대응될 수도 있고 서로 다른 참조 픽쳐 인덱스에 대응될 수도 있다. 이때, 참조 픽쳐들은 시간적으로 현재 픽쳐 이전이나 이후 모두에 표시(또는 출력)될 수 있다. 일 실시예에 따라, 쌍예측 방식에서는 사용되는 2개의 참조 영역은 L0 픽쳐 리스트 및 L1 픽쳐 리스트 각각에서 선택된 영역일 수 있다.
인터 예측부(254)는 모션 벡터 및 참조 픽쳐 인덱스를 이용하여 현재 블록의 참조 블록을 획득할 수 있다. 상기 참조 블록은 참조 픽쳐 인덱스에 대응하는 참조 픽쳐 내에 존재한다. 또한, 모션 벡터에 의해서 특정된 블록의 샘플 값 또는 이의 보간(interpolation)된 값이 현재 블록의 예측자(predictor)로 이용될 수 있다. 서브펠(sub-pel) 단위의 픽셀 정확도를 갖는 모션 예측을 위하여 이를 테면, 휘도 신호에 대하여 8-탭 보간 필터가, 색차 신호에 대하여 4-탭 보간 필터가 사용될 수 있다. 다만, 서브펠 단위의 모션 예측을 위한 보간 필터는 이에 한정되지 않는다. 이와 같이 인터 예측부(254)는 이전에 복원된 픽쳐로부터 현재 유닛의 텍스쳐를 예측하는 모션 보상(motion compensation)을 수행한다. 이때, 인터 예측부는 모션 정보 세트를 이용할 수 있다.
추가적인 실시예에 따라, 예측부(250)는 인트라 BC 예측부(미도시)를 포함할 수 있다. 인트라 BC 예측부는 현재 픽쳐 내의 복원된 샘플들을 포함하는 특정 영역을 참조하여 현재 영역을 복원할 수 있다. 인트라 BC 예측부는 엔트로피 디코딩부(210)로부터 현재 영역에 대한 인트라 BC 부호화 정보를 획득한다. 인트라 BC 예측부는 현재 픽쳐 내의 특정 영역을 지시하는 현재 영역의 블록 벡터값을 획득한다. 인트라 BC 예측부는 획득된 블록 벡터값을 이용하여 인트라 BC 예측을 수행할 수 있다. 인트라 BC 부호화 정보는 블록 벡터 정보를 포함할 수 있다.
상기 인트라 예측부(252) 또는 인터 예측부(254)로부터 출력된 예측값, 및 역변환부(225)로부터 출력된 레지듀얼 값이 더해져서 복원된 비디오 픽쳐가 생성된다. 즉, 비디오 신호 디코딩 장치(200)는 예측부(250)에서 생성된 예측 블록과 역변환부(225)로부터 획득된 레지듀얼을 이용하여 현재 블록을 복원한다.
한편, 도 2의 블록도는 본 발명의 일 실시예에 따른 디코딩 장치(200)를 나타낸 것으로서, 분리하여 표시된 블록들은 디코딩 장치(200)의 엘리먼트들을 논리적으로 구별하여 도시한 것이다. 따라서 전술한 디코딩 장치(200)의 엘리먼트들은 디바이스의 설계에 따라 하나의 칩으로 또는 복수의 칩으로 장착될 수 있다. 일 실시예에 따르면, 전술한 디코딩 장치(200)의 각 엘리먼트의 동작은 프로세서(미도시)에 의해 수행될 수 있다.
도 3은 픽쳐 내에서 코딩 트리 유닛(Coding Tree Unit, CTU)이 코딩 유닛들(Coding Units, CUs)로 분할되는 실시예를 도시한다. 비디오 신호의 코딩 과정에서, 픽쳐는 코딩 트리 유닛(CTU)들의 시퀀스로 분할될 수 있다. 코딩 트리 유닛은 휘도(luma) 샘플들의 NXN 블록과, 이에 대응하는 색차(chroma) 샘플들의 2개의 블록들로 구성된다. 코딩 트리 유닛은 복수의 코딩 유닛들로 분할될 수 있다. 코딩 트리 유닛은 분할되지 않고 리프 노드가 될 수도 있다. 이 경우, 코딩 트리 유닛 자체가 코딩 유닛이 될 수 있다. 코딩 유닛은 상기에서 설명한 비디오 신호의 처리 과정, 즉 인트라/인터 예측, 변환, 양자화 및/또는 엔트로피 코딩 등의 과정에서 픽쳐를 처리하기 위한 기본 단위를 가리킨다. 하나의 픽쳐 내에서 코딩 유닛의 크기 및 모양은 일정하지 않을 수 있다. 코딩 유닛은 정사각형 혹은 직사각형의 모양을 가질 수 있다. 직사각형 코딩 유닛(혹은, 직사각형 블록)은 수직 코딩 유닛(혹은, 수직 블록)과 수평 코딩 유닛(혹은, 수평 블록)을 포함한다. 본 명세서에서, 수직 블록은 높이가 너비보다 큰 블록이며, 수평 블록은 너비가 높이보다 큰 블록이다. 또한, 본 명세서에서 정사각형이 아닌(non-square) 블록은 직사각형 블록을 가리킬 수 있지만, 본 발명은 이에 한정되지 않는다.
도 3을 참조하면, 코딩 트리 유닛은 먼저 쿼드 트리(Quad Tree, QT) 구조로 분할된다. 즉, 쿼드 트리 구조에서 2NX2N 크기를 가지는 하나의 노드는 NXN 크기를 가지는 네 개의 노드들로 분할될 수 있다. 본 명세서에서 쿼드 트리는 4진(quaternary) 트리로도 지칭될 수 있다. 쿼드 트리 분할은 재귀적으로 수행될 수 있으며, 모든 노드들이 동일한 깊이로 분할될 필요는 없다.
한편, 전술한 쿼드 트리의 리프 노드(leaf node)는 멀티-타입 트리(Multi-Type Tree, MTT) 구조로 더욱 분할될 수 있다. 본 발명의 실시예에 따르면, 멀티 타입 트리 구조에서는 하나의 노드가 수평 혹은 수직 분할의 2진(binary, 바이너리) 혹은 3진(ternary, 터너리) 트리 구조로 분할될 수 있다. 즉, 멀티-타입 트리 구조에는 수직 바이너리 분할, 수평 바이너리 분할, 수직 터너리 분할 및 수평 터너리 분할의 4가지 분할 구조가 존재한다. 본 발명의 실시예에 따르면, 상기 각 트리 구조에서 노드의 너비 및 높이는 모두 2의 거듭제곱 값을 가질 수 있다. 예를 들어, 바이너리 트리(Binary Tree, BT) 구조에서, 2NX2N 크기의 노드는 수직 바이너리 분할에 의해 2개의 NX2N 노드들로 분할되고, 수평 바이너리 분할에 의해 2개의 2NXN 노드들로 분할될 수 있다. 또한, 터너리 트리(Ternary Tree, TT) 구조에서, 2NX2N 크기의 노드는 수직 터너리 분할에 의해 (N/2)X2N, NX2N 및 (N/2)X2N의 노드들로 분할되고, 수평 터너리 분할에 의해 2NX(N/2), 2NXN 및 2NX(N/2)의 노드들로 분할될 수 있다. 이러한 멀티-타입 트리 분할은 재귀적으로 수행될 수 있다.
멀티-타입 트리의 리프 노드는 코딩 유닛이 될 수 있다. 코딩 유닛이 최대 변환 길이에 비해 크지 않은 경우, 해당 코딩 유닛은 더 이상의 분할 없이 예측 및/또는 변환의 단위로 사용될 수 있다. 일 실시예로서, 현재 코딩 유닛의 너비 또는 높이가 최대 변환 길이보다 큰 경우, 현재 코딩 유닛은 분할에 관한 명시적 시그널링 없이 복수의 변환 유닛으로 분할될 수 있다. 한편, 전술한 쿼드 트리 및 멀티-타입 트리에서 다음의 파라메터들 중 적어도 하나가 사전에 정의되거나 PPS, SPS, VPS 등과 같은 상위 레벨 세트의 RBSP를 통해 전송될 수 있다. 1) CTU 크기: 쿼드 트리의 루트 노드(root node) 크기, 2) 최소 QT 크기(MinQtSize): 허용된 최소 QT 리프 노드 크기, 3) 최대 BT 크기(MaxBtSize): 허용된 최대 BT 루트 노드 크기, 4) 최대 TT 크기(MaxTtSize): 허용된 최대 TT 루트 노드 크기, 5) 최대 MTT 깊이(MaxMttDepth): QT의 리프 노드로부터의 MTT 분할의 최대 허용 깊이, 6) 최소 BT 크기(MinBtSize): 허용된 최소 BT 리프 노드 크기, 7) 최소 TT 크기(MinTtSize): 허용된 최소 TT 리프 노드 크기.
도 4는 쿼드 트리 및 멀티-타입 트리의 분할을 시그널링하는 방법의 일 실시예를 도시한다. 전술한 쿼드 트리 및 멀티-타입 트리의 분할을 시그널링하기 위해 기 설정된 플래그들이 사용될 수 있다. 도 4를 참조하면, 노드의 분할 여부를 지시하는 플래그 'split_cu_flag', 쿼드 트리 노드의 분할 여부를 지시하는 플래그 'split_qt_flag', 멀티-타입 트리 노드의 분할 방향을 지시하는 플래그 'mtt_split_cu_vertical_flag' 또는 멀티-타입 트리 노드의 분할 모양을 지시하는 플래그 'mtt_split_cu_binary_flag' 중 적어도 하나가 사용될 수 있다.
본 발명의 실시예에 따르면, 현재 노드의 분할 여부를 지시하는 플래그인 'split_cu_flag'가 먼저 시그널링될 수 있다. 'split_cu_flag'의 값이 0인 경우, 현재 노드가 분할되지 않는 것을 나타내며, 현재 노드는 코딩 유닛이 된다. 현재 노드가 코팅 트리 유닛인 경우, 코딩 트리 유닛은 분할되지 않은 하나의 코딩 유닛을 포함한다. 현재 노드가 쿼드 트리 노드 'QT node'인 경우, 현재 노드는 쿼드 트리의 리프 노드 'QT leaf node'이며 코딩 유닛이 된다. 현재 노드가 멀티-타입 트리 노드 'MTT node'인 경우, 현재 노드는 멀티-타입 트리의 리프 노드 'MTT leaf node'이며 코딩 유닛이 된다.
'split_cu_flag'의 값이 1인 경우, 현재 노드는 'split_qt_flag'의 값에 따라 쿼드 트리 또는 멀티-타입 트리의 노드들로 분할될 수 있다. 코딩 트리 유닛은 쿼드 트리의 루트 노드이며, 쿼드 트리 구조로 우선 분할될 수 있다. 쿼드 트리 구조에서는 각각의 노드 'QT node' 별로 'split_qt_flag'가 시그널링된다. 'split_qt_flag'의 값이 1인 경우 해당 노드는 4개의 정사각형 노드들로 분할되며, 'qt_split_flag'의 값이 0인 경우 해당 노드는 쿼드 트리의 리프 노드 'QT leaf node'가 되며, 해당 노드는 멀티-타입 노드들로 분할된다. 본 발명의 실시예에 따르면, 현재 노드의 종류에 따라서 쿼드 트리 분할은 제한될 수 있다. 현재 노드가 코딩 트리 유닛(쿼트 트리의 루트 노드) 또는 쿼트 트리 노드인 경우에 쿼드 트리 분할이 허용될 수 있으며, 현재 노드가 멀티-타입 트리 노드인 경우 쿼트 트리 분할은 허용되지 않을 수 있다. 각각의 쿼드 트리 리프 노드 'QT leaf node'는 멀티-타입 트리 구조로 더 분할될 수 있다. 상술한 바와 같이, 'split_qt_flag'가 0인 경우 현재 노드는 멀티-타입 노드들로 분할될 수 있다. 분할 방향 및 분할 모양을 지시하기 위하여, 'mtt_split_cu_vertical_flag' 및 'mtt_split_cu_binary_flag'가 시그널링될 수 있다.'mtt_split_cu_vertical_flag'의 값이 1인 경우 노드 'MTT node'의 수직 분할이 지시되며, 'mtt_split_cu_vertical_flag'의 값이 0인 경우 노드 'MTT node'의 수평 분할이 지시된다. 또한, 'mtt_split_cu_binary_flag'의 값이 1인 경우 노드 'MTT node'는 2개의 직사각형 노드들로 분할되며, 'mtt_split_cu_binary_flag'의 값이 0인 경우 노드 'MTT node'는 3개의 직사각형 노드들로 분할된다.
코딩을 위한 픽쳐 예측(모션 보상)은 더 이상 나누어지지 않는 코딩 유닛(즉 코딩 유닛 트리의 리프 노드)을 대상으로 이루어진다. 이러한 예측을 수행하는 기본 단위를 이하에서는 예측 유닛(prediction unit) 또는 예측 블록(prediction block)이라고 한다.
이하, 본 명세서에서 사용되는 유닛이라는 용어는 예측을 수행하는 기본 단위인 상기 예측 유닛을 대체하는 용어로 사용될 수 있다. 다만, 본 발명이 이에 한정되는 것은 아니며, 더욱 광의적으로는 상기 코딩 유닛을 포함하는 개념으로 이해될 수 있다.
도 5 및 도 6은 본 발명의 실시예에 따른 인트라 예측 방법을 더욱 구체적으로 도시한다. 전술한 바와 같이, 인트라 예측부는 현재 블록의 좌측 및/또는 상측에 위치한 복원된 샘플들을 참조 샘플들로 이용하여 현재 블록의 샘플 값들을 예측한다.
먼저, 도 5는 인트라 예측 모드에서 현재 블록의 예측을 위해 사용되는 참조 샘플들의 일 실시예를 도시한다. 일 실시예에 따르면, 참조 샘플들은 현재 블록의 좌측 경계에 인접한 샘플들 및/또는 상측 경계에 인접한 샘플들일 수 있다. 도 5에 도시된 바와 같이, 현재 블록의 크기가 WXH이고 현재 블록에 인접한 단일 참조 라인(line)의 샘플들이 인트라 예측에 사용될 경우, 현재 블록의 좌측 및/또는 상측에 위치한 최대 2W+2H+1개의 주변 샘플들을 사용하여 참조 샘플들이 설정될 수 있다.
또한, 참조 샘플로 사용될 적어도 일부의 샘플이 아직 복원되지 않은 경우, 인트라 예측부는 참조 샘플 패딩 과정을 수행하여 참조 샘플을 획득할 수 있다. 또한, 인트라 예측부는 인트라 예측의 오차를 줄이기 위해 참조 샘플 필터링 과정을 수행할 수 있다. 즉, 주변 샘플들 및/또는 참조 샘플 패딩 과정에 의해 획득된 참조 샘플들에 필터링을 수행하여 필터링된 참조 샘플들을 획득할 수 있다. 인트라 예측부는 이와 같이 획득된 참조 샘플들을 이용하여 현재 블록의 샘플들을 예측한다. 인트라 예측부는 필터링되지 않은 참조 샘플들 또는 필터링된 참조 샘플들을 이용하여 현재 블록의 샘플들을 예측한다. 본 개시에서, 주변 샘플들은 적어도 하나의 참조 라인 상의 샘플들을 포함할 수 있다. 예를 들어, 주변 샘플들은 현재 블록의 경계에 인접한 라인 상의 인접 샘플들을 포함할 수 있다.
다음으로, 도 6은 인트라 예측에 사용되는 예측 모드들의 일 실시예를 도시한다. 인트라 예측을 위해, 인트라 예측 방향을 지시하는 인트라 예측 모드 정보가 시그널링될 수 있다. 인트라 예측 모드 정보는 인트라 예측 모드 세트를 구성하는 복수의 인트라 예측 모드들 중 어느 하나를 지시한다. 현재 블록이 인트라 예측 블록일 경우, 디코더는 비트스트림으로부터 현재 블록의 인트라 예측 모드 정보를 수신한다. 디코더의 인트라 예측부는 추출된 인트라 예측 모드 정보에 기초하여 현재 블록에 대한 인트라 예측을 수행한다.
본 발명의 실시예에 따르면, 인트라 예측 모드 세트는 인트라 예측에 사용되는 모든 인트라 예측 모드들(예, 총 67개의 인트라 예측 모드들)을 포함할 수 있다. 더욱 구체적으로, 인트라 예측 모드 세트는 평면 모드, DC 모드 및 복수의(예, 65개의) 각도 모드들(즉, 방향 모드들)을 포함할 수 있다. 각각의 인트라 예측 모드는 기 설정된 인덱스(즉, 인트라 예측 모드 인덱스)를 통해 지시될 수 있다. 예를 들어, 도 6에 도시된 바와 같이 인트라 예측 모드 인덱스 0은 평면(planar) 모드를 지시하고, 인트라 예측 모드 인덱스 1은 DC 모드를 지시한다. 또한, 인트라 예측 모드 인덱스 2 내지 66은 서로 다른 각도 모드들을 각각 지시할 수 있다. 각도 모드들은 기 설정된 각도 범위 이내의 서로 다른 각도들을 각각 지시한다. 예를 들어, 각도 모드는 시계 방향으로 45도에서 -135도 사이의 각도 범위(즉, 제1 각도 범위) 이내의 각도를 지시할 수 있다. 상기 각도 모드는 12시 방향을 기준으로 정의될 수 있다. 이때, 인트라 예측 모드 인덱스 2는 수평 대각(Horizontal Diagonal, HDIA) 모드를 지시하고, 인트라 예측 모드 인덱스 18은 수평(Horizontal, HOR) 모드를 지시하고, 인트라 예측 모드 인덱스 34는 대각(Diagonal, DIA) 모드를 지시하고, 인트라 예측 모드 인덱스 50은 수직(Vertical, VER) 모드를 지시하며, 인트라 예측 모드 인덱스 66은 수직 대각(Vertical Diagonal, VDIA) 모드를 지시한다.
한편, 기 설정된 각도 범위는 현재 블록의 모양에 따라 서로 다르게 설정될 수 있다. 예를 들어, 현재 블록이 직사각형 블록일 경우 시계 방향으로 45도를 초과하거나 -135도 미만 각도를 지시하는 광각 모드가 추가적으로 사용될 수 있다. 현재 블록이 수평 블록일 경우, 각도 모드는 시계 방향으로 (45+offset1)도에서 (-135+offset1)도 사이의 각도 범위(즉, 제2 각도 범위) 이내의 각도를 지시할 수 있다. 이때, 제1 각도 범위를 벗어나는 각도 모드 67 내지 76이 추가적으로 사용될 수 있다. 또한, 현재 블록이 수직 블록일 경우, 각도 모드는 시계 방향으로 (45-offset2)도에서 (-135-offset2)도 사이의 각도 범위(즉, 제3 각도 범위) 이내의 각도를 지시할 수 있다. 이때, 제1 각도 범위를 벗어나는 각도 모드 -10 내지 -1이 추가적으로 사용될 수 있다. 본 발명의 실시예에 따르면, offset1 및 offset2의 값은 직사각형 블록의 너비와 높이 간의 비율에 따라 서로 다르게 결정될 수 있다. 또한, offset1 및 offset2는 양수일 수 있다.
본 발명의 추가적인 실시예에 따르면, 인트라 예측 모드 세트를 구성하는 복수의 각도 모드들은 기본 각도 모드와 확장 각도 모드를 포함할 수 있다. 이때, 확장 각도 모드는 기본 각도 모드에 기초하여 결정될 수 있다.
일 실시예에 따르면, 기본 각도 모드는 기존 HEVC(High Efficiency Video Coding) 표준의 인트라 예측에서 사용되는 각도에 대응하는 모드이고, 확장 각도 모드는 차세대 비디오 코덱 표준의 인트라 예측에서 새롭게 추가되는 각도에 대응하는 모드일 수 있다. 더욱 구체적으로, 기본 각도 모드는 인트라 예측 모드 {2, 4, 6, …, 66} 중 어느 하나에 대응하는 각도 모드이고, 확장 각도 모드는 인트라 예측 모드 {3, 5, 7, …, 65} 중 어느 하나에 대응하는 각도 모드일 수 있다. 즉, 확장 각도 모드는 제1 각도 범위 내에서 기본 각도 모드들 사이의 각도 모드일 수 있다. 따라서, 확장 각도 모드가 지시하는 각도는 기본 각도 모드가 지시하는 각도에 기초하여 결정될 수 있다.
다른 실시예에 따르면, 기본 각도 모드는 기 설정된 제1 각도 범위 이내의 각도에 대응하는 모드이고, 확장 각도 모드는 상기 제1 각도 범위를 벗어나는 광각 모드일 수 있다. 즉, 기본 각도 모드는 인트라 예측 모드 {2, 3, 4, …, 66} 중 어느 하나에 대응하는 각도 모드이고, 확장 각도 모드는 인트라 예측 모드 {-10, -9, …, -1} 및 {67, 68, …, 76} 중 어느 하나에 대응하는 각도 모드일 수 있다. 확장 각도 모드가 지시하는 각도는 대응하는 기본 각도 모드가 지시하는 각도의 반대편 각도로 결정될 수 있다. 따라서, 확장 각도 모드가 지시하는 각도는 기본 각도 모드가 지시하는 각도에 기초하여 결정될 수 있다. 한편, 확장 각도 모드들의 개수는 이에 한정되지 않으며, 현재 블록의 크기 및/또는 모양에 따라 추가적인 확장 각도들이 정의될 수 있다. 예를 들어, 확장 각도 모드는 인트라 예측 모드 {-14, -13, …, -1} 및 {67, 68, …, 80} 중 어느 하나에 대응하는 각도 모드로 정의될 수도 있다. 한편, 인트라 예측 모드 세트에 포함되는 인트라 예측 모드들의 총 개수는 전술한 기본 각도 모드와 확장 각도 모드의 구성에 따라 가변할 수 있다.
상기 실시예들에서, 확장 각도 모드들 간의 간격은 대응하는 기본 각도 모드들 간의 간격에 기초하여 설정될 수 있다. 예를 들어, 확장 각도 모드들 {3, 5, 7, …, 65} 간의 간격은 대응하는 기본 각도 모드들 {2, 4, 6, …, 66} 간의 간격에 기초하여 결정될 수 있다. 또한, 확장 각도 모드들 {-10, -9, …, -1} 간의 간격은 대응하는 반대편의 기본 각도 모드들 {56, 57, …, 65} 간의 간격에 기초하여 결정되고, 확장 각도 모드들 {67, 68, …, 76} 간의 간격은 대응하는 반대편의 기본 각도 모드들 {3, 4, …, 12} 간의 간격에 기초하여 결정될 수 있다. 확장 각도 모드들 간의 각도 간격은 대응하는 기본 각도 모드들 간의 각도 간격과 동일하도록 설정될 수 있다. 또한, 인트라 예측 모드 세트에서 확장 각도 모드들의 개수는 기본 각도 모드들의 개수 이하로 설정될 수 있다.
본 발명의 실시예에 따르면, 확장 각도 모드는 기본 각도 모드를 기초로 시그널링될 수 있다. 예를 들어, 광각 모드(즉, 확장 각도 모드)는 제1 각도 범위 이내의 적어도 하나의 각도 모드(즉, 기본 각도 모드)를 대체할 수 있다. 대체되는 기본 각도 모드는 광각 모드의 반대편에 대응하는 각도 모드일 수 있다. 즉, 대체되는 기본 각도 모드는 광각 모드가 지시하는 각도의 반대 방향의 각도에 대응하거나 또는 상기 반대 방향의 각도로부터 기 설정된 오프셋 인덱스만큼 차이 나는 각도에 대응하는 각도 모드이다. 본 발명의 실시예에 따르면, 기 설정된 오프셋 인덱스는 1이다. 대체되는 기본 각도 모드에 대응하는 인트라 예측 모드 인덱스는 광각 모드에 다시 매핑되어 해당 광각 모드를 시그널링할 수 있다. 예를 들어, 광각 모드 {-10, -9, …, -1}은 인트라 예측 모드 인덱스 {57, 58, …, 66}에 의해 각각 시그널링될 수 있고, 광각 모드 {67, 68, …, 76}은 인트라 예측 모드 인덱스 {2, 3, …, 11}에 의해 각각 시그널링될 수 있다. 이와 같이 기본 각도 모드를 위한 인트라 예측 모드 인덱스가 확장 각도 모드를 시그널링하도록 함으로, 각 블록의 인트라 예측에 사용되는 각도 모드들의 구성이 서로 다르더라도 동일한 세트의 인트라 예측 모드 인덱스들이 인트라 예측 모드의 시그널링에 사용될 수 있다. 따라서, 인트라 예측 모드 구성의 변화에 따른 시그널링 오버헤드가 최소화될 수 있다.
한편, 확장 각도 모드의 사용 여부는 현재 블록의 모양 및 크기 중 적어도 하나에 기초하여 결정될 수 있다. 일 실시예에 따르면, 현재 블록의 크기가 기 설정된 크기보다 클 경우 확장 각도 모드가 현재 블록의 인트라 예측을 위해 사용되고, 그렇지 않을 경우 기본 각도 모드만 현재 블록의 인트라 예측을 위해 사용될 수 있다. 다른 실시예에 따르면, 현재 블록이 정사각형이 아닌 블록인 경우 확장 각도 모드가 현재 블록의 인트라 예측을 위해 사용되고, 현재 블록이 정사각형 블록인 경우 기본 각도 모드만 현재 블록의 인트라 예측을 위해 사용될 수 있다.
한편, 코딩 효율을 높이기 위하여 전술한 레지듀얼 신호를 그대로 코딩하는 것이 아니라, 레지듀얼 신호를 변환하여 획득된 변환 계수 값을 양자화하고, 양자화된 변환 계수를 코딩하는 방법이 사용될 수 있다. 전술한 바와 같이, 변환부는 레지듀얼 신호를 변환하여 변환 계수 값을 획득할 수 있다. 이때, 특정 블록의 레지듀얼 신호는 현재 블록의 전 영역에 분산되어 있을 수 있다. 이에 따라, 레지듀얼 신호에 대한 주파수 영역 변환을 통해 저주파 영역에 에너지를 집중시켜 코딩 효율을 향상시킬 수 있다. 이하에서는, 레지듀얼 신호가 변환 또는 역변환되는 방법에 대해 구체적으로 설명하도록 한다.
도 7은 인코더가 레지듀얼 신호를 변환하는 방법을 구체적으로 나타내는 도면이다. 전술한 바와 같이, 공간 영역의 레지듀얼 신호는 주파수 영역으로 변환될 수 있다. 인코더는 획득된 레지듀얼 신호를 변환하여 변환 계수를 획득할 수 있다. 먼저, 인코더는 현재 블록에 대한 레지듀얼 신호를 포함하는 적어도 하나의 레지듀얼 블록을 획득할 수 있다. 레지듀얼 블록은 현재 블록 또는 현재 블록으로부터 분할된 블록들 중 어느 하나일 수 있다. 본 개시에서, 레지듀얼 블록은 현재 블록의 레지듀얼 샘플들을 포함하는 레지듀얼 어레이(array) 또는 레지듀얼 매트릭스(matrix)로 지칭될 수 있다. 또한, 본 개시에서 레지듀얼 블록은 변환 유닛 또는 변환 블록의 크기와 동일한 크기의 블록을 나타낼 수 있다.
다음으로, 인코더는 변환 커널을 사용하여 레지듀얼 블록을 변환할 수 있다. 레지듀얼 블록에 대한 변환에 사용되는 변환 커널은 수직 변환 및 수평 변환의 분리 가능한 특성을 가지는 변환 커널일 수 있다. 이 경우, 레지듀얼 블록에 대한 변환은 수직 변환 및 수평 변환으로 분리되어 수행될 수 있다. 예를 들어, 인코더는 레지듀얼 블록의 수직 방향으로 변환 커널을 적용하여 수직 변환을 수행할 수 있다. 또한, 인코더는 레지듀얼 블록의 수평 방향으로 변환 커널을 적용하여 수평 변환을 수행할 수 있다. 본 개시에서, 변환 커널은 변환 매트릭스, 변환 어레이, 변환 함수, 변환과 같이 레지듀얼 신호의 변환에 사용되는 파라미터 세트를 지칭하는 용어로 사용될 수 있다. 일 실시예에 따라, 변환 커널은 복수의 사용 가능한 커널들 중 어느 하나일 수 있다. 또한, 수직 변환 및 수평 변환 각각에 대해 서로 다른 변환 타입에 기반한 변환 커널이 사용될 수도 있다.
인코더는 레지듀얼 블록으로부터 변환된 변환 블록을 양자화부로 전달하여 양자화할 수 있다. 이때, 변환 블록은 복수의 변환 계수들을 포함할 수 있다. 구체적으로, 변환 블록은 2차원 배열된 복수의 변환 계수들로 구성될 수 있다. 변환 블록의 크기는 레지듀얼 블록과 마찬가지로 현재 블록 또는 현재 블록으로부터 분할된 블록 중 어느 하나와 동일할 수 있다. 양자화부로 전달된 변환 계수들은 양자화된 값으로 표현될 수 있다.
또한, 인코더는 변환 계수가 양자화되기 전에 추가적인 변환을 수행할 수 있다. 도 7에 도시된 바와 같이, 전술한 변환 방법은 1차 변환(primary transform)으로 지칭되고, 추가적인 변환은 2차 변환(secondary transform)으로 지칭될 수 있다. 2차 변환은 레지듀얼 블록 별로 선택적일 수 있다. 일 실시예에 따라, 인코더는 1차 변환만으로 저주파 영역에 에너지를 집중시키기 어려운 영역에 대해 2차 변환을 수행하여 코딩 효율을 향상시킬 수 있다. 예를 들어, 레지듀얼 값들이 레지듀얼 블록의 수평 또는 수직 방향 이외의 방향에서 크게 나타나는 블록에 대해 2차 변환이 추가될 수 있다. 인트라 예측된 블록의 레지듀얼 값들은 인터 예측된 블록의 레지듀얼 값들에 비해 수평 또는 수직 방향 이외의 방향으로 변화할 확률이 높을 수 있다. 이에 따라, 인코더는 인트라 예측된 블록의 레지듀얼 신호에 대해 2차 변환을 추가적으로 수행할 수 있다. 또한, 인코더는 인터 예측된 블록의 레지듀얼 신호에 대해 2차 변환을 생략할 수 있다.
다른 예로, 현재 블록 또는 레지듀얼 블록의 크기에 따라, 2차 변환 수행 여부가 결정될 수 있다. 또한, 현재 블록 또는 레지듀얼 블록의 크기에 따라 크기가 서로 다른 변환 커널이 사용될 수 있다. 예를 들어, 너비 또는 높이 중 짧은 변의 길이가 제1 기 설정된 길이 보다 크거나 같은 블록에 대해서는 8X8 2차 변환이 적용될 수 있다. 또한, 너비 또는 높이 중 짧은 변의 길이가 제2 기 설정된 길이 보다 크거나 같고, 제1 기 설정된 길이 보다 작은 블록에 대해서는 4X4 2차 변환이 적용될 수 있다. 이때, 제1 기 설정된 길이는 제2 기 설정된 길이 보다 큰 값일 수 있으나, 본 개시가 이에 제한되는 것은 아니다. 또한, 2차 변환은 1차 변환과 달리 수직 변환 및 수평 변환으로 분리되어 수행되지 않을 수 있다. 이러한 2차 변환은 저대역 비-분리 변환(Low Frequency Non-Separable Transform, LFNST)으로 지칭될 수 있다.
또한, 특정 영역의 비디오 신호의 경우, 급격한 밝기 변화로 인해 주파수 변환을 수행하여도 고주파 대역 에너지가 줄어들지 않을 수 있다. 이에 따라, 양자화에 의한 압축 성능이 저하될 수 있다. 또한, 레지듀얼 값이 드물게 존재하는 영역에 대해 변환을 수행하는 경우, 인코딩 시간 및 디코딩 시간이 불필요하게 증가할 수 있다. 이에 따라, 특정 영역의 레지듀얼 신호에 대한 변환은 생략될 수 있다. 특정 영역의 레지듀얼 신호에 대한 변환 수행 여부는 특정 영역의 변환과 관련된 신택스 요소에 의해 결정될 수 있다. 예를 들어, 상기 신택스 요소는 변환 스킵 정보(transform skip information)를 포함할 수 있다. 변환 스킵 정보는 변환 스킵 플래그(transform skip flag)일 수 있다. 레지듀얼 블록에 대한 변환 스킵 정보가 변환 스킵을 나타내는 경우, 해당 레지듀얼 블록에 대한 변환이 수행되지 않는다. 이 경우, 인코더는 해당 영역의 변환이 수행되지 않은 레지듀얼 신호를 곧바로 양자화할 수 있다. 도 7을 참조하여 설명된 인코더의 동작들은 도 1의 변환부를 통해 수행될 수 있다.
전술한 변환 관련 신택스 요소들은 비디오 신호 비트스트림으로부터 파싱된 정보일 수 있다. 디코더는 비디오 신호 비트스트림을 엔트로피 디코딩하여 변환 관련 신택스 요소들을 획득할 수 있다. 또한, 인코더는 변환 관련 신택스 요소들을 엔트로피 코딩하여 비디오 신호 비트스트림을 생성할 수 있다.
도 8은 인코더 및 디코더가 변환 계수를 역변환하여 레지듀얼 신호를 획득하는 방법을 구체적으로 나타내는 도면이다. 이하 설명의 편의를 위해, 인코더 및 디코더 각각의 역변환부를 통해 역변환 동작이 수행되는 것으로 설명한다. 역변환부는 역양자화된 변환 계수를 역변환하여 레지듀얼 신호를 획득할 수 있다. 먼저, 역변환부는 특정 영역의 변환 관련 신택스 요소로부터 해당 영역에 대한 역변환이 수행되는지 검출할 수 있다. 일 실시예에 따라, 특정 변환 블록에 대한 변환 관련 신택스 요소가 변환 스킵을 나타내는 경우, 해당 변환 블록에 대한 변환이 생략될 수 있다. 이 경우, 변환 블록에 대해 1차 역변환 및 2차 역변환이 모두 생략될 수 있다. 또한, 역양자화된 변환 계수는 레지듀얼 신호로 사용될 수 있다. 예를 들어, 디코더는 역양자화된 변환 계수를 레지듀얼 신호로 사용하여 현재 블록을 복원할 수 있다. 전술한 1차 역변환은 1차 변환에 대한 역변환을 나타내며, 역 1차 변환(inverse primary transform)으로 지칭될 수 있다. 2차 역변환은 2차 변환에 대한 역변환을 나타내며, 역 2차 변환(inverse secondary transform) 또는 inverse LFNST로 지칭될 수 있다. 본 발명에서 1차 (역)변환은 제1 (역)변환으로 지칭될 수 있으며, 2차 (역)변환은 제2 (역)변환으로 지칭될 수 있다.
다른 일 실시예에 따라, 특정 변환 블록에 대한 변환 관련 신택스 요소가 변환 스킵을 나타내지 않을 수 있다. 이 경우, 역변환부는 2차 변환에 대한 2차 역변환 수행 여부를 결정할 수 있다. 예를 들어, 변환 블록이 인트라 예측된 블록의 변환 블록인 경우, 변환 블록에 대한 2차 역변환이 수행될 수 있다. 또한, 변환 블록에 대응하는 인트라 예측 모드에 기초하여 해당 변환 블록에 사용되는 2차 변환 커널이 결정될 수 있다. 다른 예로, 변환 블록의 크기에 기초하여 2차 역변환 수행 여부가 결정될 수도 있다. 2차 역변환은 역양자화 과정 이후 1차 역변환이 수행되기 전에 수행될 수 있다.
역변환부는 역양자화된 변환 계수 또는 2차 역변환된 변환 계수에 대한 1차 역변환을 수행할 수 있다. 1차 역변환의 경우, 1차 변환과 마찬가지로 수직 변환 및 수평 변환으로 분리되어 수행될 수 있다. 예를 들어, 역변환부는 변환 블록에 대한 수직 역변환 및 수평 역변환을 수행하여 레지듀얼 블록을 획득할 수 있다. 역변환부는 변환 블록의 변환에 사용된 변환 커널에 기초하여 변환 블록을 역변환할 수 있다. 예를 들어, 인코더는 복수의 사용 가능한 변환 커널들 중 현재 변환 블록에 적용된 변환 커널을 지시하는 정보를 명시적 또는 묵시적으로 시그널링할 수 있다. 디코더는 시그널링된 변환 커널을 나타내는 정보를 이용하여 복수의 사용 가능한 변환 커널들 중 변환 블록의 역변환에 사용될 변환 커널을 선택할 수 있다. 역변환부는 변환 계수에 대한 역변환을 통해 획득된 레지듀얼 신호를 이용하여 현재 블록을 복원할 수 있다.
한편, 픽쳐의 레지듀얼 신호의 분포는 영역 별로 다를 수 있다. 예를 들어, 특정 영역 내의 레지듀얼 신호는 예측 방법에 따라 값의 분포가 달라질 수 있다. 복수의 서로 다른 변환 영역들에 대해 동일한 변환 커널을 사용하여 변환을 수행하는 경우, 변환 영역 내의 값들의 분포와 특성에 따라 변환 영역 별로 코딩 효율이 달라질 수 있다. 이에 따라, 복수의 사용 가능한 변환 커널 중 특정 변환 블록의 변환에 사용되는 변환 커널을 적응적으로 선택하는 경우 코딩 효율이 추가적으로 향상될 수 있다. 즉, 인코더 및 디코더는 비디오 신호의 변환에 있어서, 기본 변환 커널 이외의 변환 커널을 추가적으로 사용 가능하도록 설정할 수 있다. 변환 커널을 적응적으로 선택하는 방법은 적응적 다중 코어 변환(adaptive multiple core transform, AMT) 또는 다중 변환 선택(multiple transform selection, MTS)으로 지칭될 수 있다. 본 개시에서는 설명의 편의를 위해 변환 및 역변환을 통틀어 변환이라 지칭한다. 또한, 변환 커널 및 역변환 커널을 통틀어 변환 커널이라 지칭한다.
원본 신호와 화면간 예측 또는 화면내 예측을 통해 생성한 예측 신호의 차이 신호인 잔차(레지듀얼) 신호는 픽셀 도메인 전 영역에 에너지가 분산되어 있으므로, 잔차 신호의 픽셀 값 자체가 부호화될 경우, 압축 효율이 떨어지는 문제가 발생한다. 따라서 픽셀 도메인의 잔차 신호를 변환 부호화를 통해 주파수 도메인의 저주파 영역으로 에너지를 집중시키는 과정이 필요하다.
HEVC(high efficiency video coding) 표준에서는 신호가 픽셀 도메인에서 고르게 분포하는 경우(이웃하는 픽셀 값이 유사한 경우)에 효율적인 DCT-II(discrete cosine transform type-II)를 대부분 사용하고, 화면내 예측된 4x4 블록에만 DST-VII(discrete sine transform type-VII)을 한정적으로 사용하여 픽셀 도메인의 잔차 신호를 주파수 영역으로 변환하였다. DCT-II 변환의 경우, 화면간 예측을 통해 생성한 잔차 신호 (픽셀 도메인에서 에너지가 고르게 분포하는 경우)에 적합할 수 있다. 그러나, 화면내 예측을 통해 생성한 잔차 신호의 경우, 현재 부호화 유닛 주변의 복원된 참조 샘플을 사용하여 예측하는 화면내 예측의 특성 상, 참조 샘플과 멀어질수록 잔차 신호의 에너지가 증가하는 경향을 보일 수 있다. 따라서, 잔차 신호를 주파수 영역으로 변환시키기 위해 DCT-II 변환만이 사용되는 경우, 높은 부호화 효율이 달성될 수 없다.
AMT는 예측 방법에 따라 여러 개의 기 설정된 변환 커널 중 적응적으로 변환 커널을 선택하는 변환 기법이다. 어떤 예측 방법이 사용되었는지에 따라 잔차 신호의 픽셀 도메인에서의 패턴 (수평 방향으로 신호의 특성, 수직 방향으로 신호의 특성)이 달라지기 때문에, 단순히 DCT-II만이 잔차 신호의 변환을 위해 사용되었을 때보다 높은 부호화 효율을 기대할 수 있다. 본 발명에서, AMT는 그 명칭에 제한되지 않으며, MTS(multiple transform selection)으로 지칭될 수 있다.
도 9는 1차 변환에서 사용될 수 있는 복수의 변환 커널에 대한 기저 함수를 나타낸 도면이다.
구체적으로, 도 9는 AMT에서 사용하는 변환 커널의 기저 함수를 도시한 도면으로, AMT에 적용되는 DCT-II, DCT-V(discrete cosine transform type-V), DCT-VIII(discrete cosine transform type-VIII), DST-I(discrete sine transform type-I), DST-VII 커널의 수식을 나타낸 것이다.
DCT와 DST는 각각 코사인, 사인의 함수로 표현이 가능하며, 샘플 수 N에 대한 변환 커널의 기저 함수를 Ti(j)로 표현할 경우, 인덱스 i는 주파수 도메인에서의 인덱스를 나타내며, 인덱스 j는 기저 함수 내의 인덱스를 나타낸다. 즉, i가 작아질수록 저주파 기저 함수를 나타내며, i가 커질수록 고주파 기저 함수를 나타낸다. 기저 함수 Ti(j)는 2차원 행렬로 표현했을 때, i 번째 행의 j 번째 요소를 나타낼 수 있으며, 도 9에 도시한 변환 커널은 모두 분리 가능한 특성을 가지고 있으므로, 잔차 신호 X에 대하여 수평 방향과 수직 방향에 각각 변환을 수행할 수 있다. 즉, 잔차 신호 블록을 X라 하고, 변환 커널 행렬을 T라 했을 때, 잔차 신호 X에 대한 변환은 TXT'으로 나타낼 수 있다. 이때, T'는 변환 커널 행렬 T의 전치(transpose) 행렬을 의미한다.
도 9에 도시된 기저 함수에 의해 정의되는 변환 매트릭스의 값들은 정수 형태가 아닌 소수 형태일 수 있다. 소수 형태의 값들은 비디오 인코딩 장치 및 디코딩 장치에 하드웨어적으로 구현되기 어려울 수 있다. 따라서 소수 형태의 값들을 포함하는 원형(original) 변환 커널로부터 정수 근사화된 변환 커널이 비디오 신호의 인코딩 및 디코딩에 사용될 수 있다. 정수 형태의 값들을 포함하는 근사화된 변환 커널은 원형 변형 커널에 대한 스케일링 및 라운딩을 통해 생성될 수 있다. 근사화된 변환 커널이 포함하는 정수 값은 기 설정된 개수의 비트로 표현 가능한 범위 내의 값일 수 있다. 기 설정된 개수의 비트는 8-bit 또는 10-bit일 수 있다. 근사화에 따라 DCT와 DST의 정규 직교 (orthonormal) 성질은 유지되지 않을 수 있다. 그러나, 이에 따른 부호화 효율 손실이 크지 않으므로, 변환 커널을 정수 형태로 근사화 시키는 것이 하드웨어적 구현 측면에서 유리할 수 있다.
도 7 내지 도 8에서 전술한 1차 변환 및 역 1차 변환의 경우, 분리 가능한 변환 커널에 대하여 2차원 행렬로 표현하여 수직 방향과 수평 방향에 각각 변환을 수행하는 것이므로 2차원 행렬 곱 연산이 두 차례 수행되는 것으로 볼 수 있다. 이는 많은 연산량을 수반하므로 구현 관점에서 문제가 될 수 있다. 따라서 구현 관점에서 DCT-II와 같이 버터플라이 구조(butterfly structure) 또는 하프 버터플라이 구조(half butterfly structure)와 하프 매트릭스 곱셈기(half matrix multiplier)의 조합 구조를 사용하여 연산량을 줄일 수 있는지 또는 해당 변환 커널을 구현 복잡도가 낮은 변환 커널들로 분해가 가능한지 (복잡도가 낮은 행렬들의 곱으로 해당 커널을 표현할 수 있는지)가 중요한 이슈가 될 수 있다. 그리고 변환 커널의 요소(변환 커널의 행렬 요소)들은 연산을 위해 메모리에 저장되어 있어야하므로, 커널 행렬 저장을 위한 메모리 용량도 구현에 고려되어야 한다. 이러한 관점에서 보았을 때, DST-VII과 DCT-VIII의 구현 복잡도는 높은 편이므로 DST-VII, DCT-VIII과 유사한 특성을 보이면서 구현 복잡도가 낮은 변환은 DST-VII과 DCT-VIII을 대체할 수 있다.
DST-IV(discrete sine transform type-IV)와 DCT-IV(discrete cosine transform type-IV)는 각각 DST-VII, DCT-VIII을 대체할 수 있는 후보로 볼 수 있다. 샘플 수 2N에 대한 DCT-II 커널은 샘플 수 N에 대한 DCT-IV 커널을 포함하고 있고, 샘플 수 N에 대한 DST-IV 커널은 샘플 수 N에 대한 DCT-IV 커널로부터 간단한 연산인 부호 반전과 해당 기저 함수를 역순으로 정렬함으로써 구현할 수 있으므로, 샘플수 2N에 대한 DCT-II로부터 간단하게 샘플수 N에 대한 DST-IV와 DCT-IV를 유도할 수 있다.
원본 신호와 예측 신호의 차이인 잔차 신호는 예측 방법에 따라 신호의 에너지 분포가 변하는 특성을 보이므로, AMT 또는 MTS와 같이 예측 방법에 따라 변환 커널을 적응적으로 선택할 경우 부호화 효율을 향상시킬 수 있다. 또한 도 7 내지 도 8에서 전술한 바와 같이, 1차 변환 및 역 1차 변환(1차 변환에 상응하는 역변환) 이외에 추가적인 변환인 2차 변환 및 역 2차 변환(2차 변환에 상응하는 역변환)을 수행하여 부호화 효율을 향상시킬 수 있다. 이러한 2차 변환은 특히 잔차 신호 블록의 수평 또는 수직 방향이 아닌 방향으로 강한 에너지가 존재할 가능성이 높은 화면내 예측된 잔차 신호 블록에 대하여 에너지 압축(energy compaction)을 향상시킬 수 있다. 전술한 바와 같이, 이러한 2차 변환은 저대역 비-분리 변환(Low Frequency Non-Separable Transform, LFNST)으로 지칭될 수 있다. 그리고, 상기 1차 변환은 코어 변환(core transform)으로 지칭될 수 있다.
도 10은 본 발명의 일 실시예에 따른 2차 변환을 수행하는 복호화기에서 잔차 신호를 복원하는 과정을 도시하는 블록도이다. 먼저, 엔트로피 코더는 비트스트림으로부터 잔차 신호와 관련된 syntax 요소를 파싱(parsing)하고 역이진화(de-binarization)를 통해 양자화 계수가 획득될 수 있다. 디코더는, 복원된 양자화 계수에 역양자화를 수행하여 변환 계수를 획득할 수 있으며, 변환 계수에 역 변환을 수행하여 잔차 신호 블록을 복원할 수 있다. 역변환은 변환 생략(transform skip, TS)이 적용되지 않는 블록에 적용될 수 있다. 역변환은 복호화기에서 2차 역변환, 1차 역변환 순으로 수행될 수 있다. 이때, 2차 역변환은 생략될 수도 있다. 화면간 예측된 블록에는 2차 역변환이 수행되지 않고, 생략될 수 있다. 또는 블록 크기 조건에 따라 2차 역변환이 생략될 수 있다. 복원된 잔차 신호는 양자화 오차가 포함된 것으로, 2차 변환은 잔차 신호의 에너지 분포를 변화시킴으로써 1차 변환만을 수행했을 때보다 양자화 오차를 줄일 수 있다.
도 11은 본 발명의 일 실시예에 따른 2차 변환을 수행하는 복호화기에서 잔차 신호를 복원하는 과정을 블록 레벨에서 도시하는 도면이다. 잔차 신호의 복원은 변환 유닛(transform unit, TU) 또는 TU 내의 서브-블록 단위로 수행될 수 있다. 도 11은 2차 변환이 적용되는 잔차 신호 블록의 복원 과정을 도시한 것으로, 역양자화된 변환 계수 블록에 대하여 2차 역변환이 먼저 수행될 수 있다. 디코더는, TU 내의 WxH (W: 너비, 수평 샘플 수, H: 높이, 수직 샘플 수)개의 모든 샘플들에 대하여 2차 역변환을 수행할 수도 있지만, 복잡도를 고려하여 가장 영향력이 높은 저 주파 영역인 좌-상단 W'xH' 크기의 서브-블록에 대해서만 2차 역변환을 수행할 수도 있다. 이때, W'은 W보다 작거나 같다. H'은 H보다 작거나 같다. 좌 상단 서브-블록 사이즈인 W'xH'은 TU 크기에 따라 다르게 설정될 수 있다. 예를 들어, min(W, H)=4인 경우, W'와 H'는 모두 4로 설정될 수 있다. min(W, H)>=8인 경우, W'와 H'는 모두 8로 설정될 수 있다. min(x, y)는 x가 y보다 작거나 같은 경우 x를 반환하고, x가 y보다 큰 경우 y를 반환하는 연산을 나타낸다. 디코더는, 2차 역변환을 수행한 후, TU 내의 좌-상단 W'xH' 크기의 서브-블록 변환 계수를 획득할 수 있고, 전체 WxH 크기의 변환 계수 블록에 대하여 1차 역변환을 수행하여 잔차 신호 블록을 복원할 수 있다.
2차 변환의 활성화 또는 적용 가능 여부는 시퀀스 파라미터 세트(sequence parameter set, SPS), 픽쳐 파라미터 세트(picture parameter set, PPS), 픽쳐 헤더, 슬라이스 헤더, 타일 그룹 헤더 등의 상위 레벨 신택스(High Level Syntax, HLS) RBSP 중의 적어도 어느 하나에 1-bit 플래그 형태로 포함되어 지시될 수 있다. 추가적으로, 2차 변환이 적용 가능한 경우, HLS RBSP 중의 적어도 어느 하나에 1-bit 플래그 형태로 2차 변환에서 고려하는 좌 상단 서브-블록의 사이즈가 지시될 수도 있다. 예를 들어, 4x4, 8x8 크기의 서브-블록을 고려하는 2차 변환에 8x8 크기의 서브-블록이 사용될 수 있는지는 HLS RBSP 중의 적어도 어느 하나에 1-bit 플래그로 지시될 수 있다.
2차 변환의 활성화 또는 적용 가능 여부가 상위 레벨(예: HLS)에서 지시되는 경우, 2차 변환이 적용되는지 여부는, 부호화 유닛(coding unit, CU) 레벨에서 1-bit 플래그로 지시될 수 있다. 또한 현재 블록에 2차 변환이 적용되는 경우, 부호화 유닛 레벨에서 2차 변환에 사용되는 변환 커널을 나타내는 인덱스가 지시될 수 있다. 디코더는 예측 모드에 따라 기 설정된 변환 커널 세트 내에서 해당 인덱스가 지시하는 변환 커널을 사용하여 2차 변환이 적용되는 블록에 2차 역변환을 수행할 수 있다. 변환 커널을 나타내는 인덱스는 절삭형 단항(truncated unary) 또는 고정 길이 이진화 방법을 사용하여 이진화될 수 있다. CU 레벨에서 2차 변환이 적용되는지 여부를 나타내는 1-bit 플래그와 2차 변환에 사용되는 변환 커널을 지시하는 인덱스는 하나의 신택스 요소를 사용하여 지시될 수도 있으며, 본 명세서에서는 이를 lfnst_idx[x0][y0] 또는 lfnst_idx로 지칭하나, 본 발명이 이러한 명칭에 제한되지 않는다. 일 실시예로서, lfnst_idx[x0][y0]의 첫 번째 비트는 CU 레벨에서 2차 변환의 적용 여부를 나타낼 수 있다. 그리고, 나머지 비트는 2차 변환에 사용된 변환 커널을 지시하는 인덱스를 나타낼 수 있다. 즉, lfnst_idx[x0][y0]는 2차 변환(LFNST)의 적용 여부 및 2차 변환이 적용되는 경우에 사용되는 변환 커널을 지시하는 인덱스를 나타낼 수 있다. 이러한 lfnst_idx[x0][y0]는 컨텍스트(context)에 따라 적응적으로 부호화하는 CABAC(context-based adeptive binary arithmetic coding), CAVLC (context-based adaptive variable length coding) 등의 엔트로피 코더를 통해 부호화될 수 있다. 현재 CU에 대하여 CU 크기보다 작은 다수의 TU로 분할되는 경우, 2차 변환은 적용되지 않을 수 있고, 2차 변환과 관련된 신택스 요소인 lfnst_idx[x0][y0]는 시그널링 없이 0으로 설정될 수 있다. 예를 들어, lfnst_idx[x0][y0]가 0인 경우, 2차 변환이 적용되지 않는 것을 나타낼 수 있다. 반면, lfnst_idx[x0][y0]가 0보다 큰 경우, 2차 변환이 적용되는 것을 나타낼 수 있으며, lfnst_idx[x0][y0]에 기초하여 2차 변환에 사용된 변환 커널이 선택될 수 있다.
전술한 바와 같이, 코딩 트리 유닛, 쿼드 트리의 리프 노드, 멀티-타입 트리의 리프 노드는 코딩 유닛이 될 수 있다. 코딩 유닛이 최대 변환 길이에 비해 크지 않은 경우, 해당 코딩 유닛은 더 이상의 분할 없이 예측 및/또는 변환의 단위로 사용될 수 있다. 일 실시예로서, 현재 코딩 유닛의 너비 또는 높이가 최대 변환 길이보다 큰 경우, 현재 코딩 유닛은 분할에 관한 명시적 시그널링 없이 복수의 변환 유닛으로 분할될 수 있다. 코딩 유닛의 크기가 최대 변환 크기보다 큰 경우 시그널링 없이 복수 개의 변환 블록으로 분할될 수 있다. 이 경우 2차 변환을 적용하게 되면 성능 저하 및 복잡도가 증가할 수 있기 때문에, 2차 변환이 적용되는 최대 코딩 블록(또는 코딩 블록의 최대 크기)은 제한적일 수 있다. 최대 코딩 블록의 크기는 최대 변환 크기와 같을 수 있다. 또는 최대 코딩 블록의 크기는 기 설정된 코딩 블록의 크기로 정의될 수 있다. 일 실시예로서, 기 설정된 값은 64, 32, 16일 수 있으나, 본 발명이 이에 한정되지 않는다. 이때, 기 설정된 값(또는 최대 변환 크기)과 비교되는 값은 긴 변의 길이 또는 총 샘플의 개수로 정의될 수 있다.
한편, 1차 변환에서 사용되는 DCT-II, DST-VII, DCT-VIII 기저 함수에 기초한 변환 커널은 분리 가능한(separable) 특성을 가진다. 따라서, NxN 크기의 잔차 블록 내 샘플들에 대하여 수직/수평 방향으로의 두 번의 변환이 수행될 수 있으며, 변환 커널의 사이즈는 NxN일 수 있다. 반면, 2차 변환의 경우, 변환 커널이 분리 불가능한(non-separable) 특성을 가진다. 따라서 2차 변환에서 고려되는 샘플 수가 nxn인 경우, 한번의 변환이 수행될 수 있다. 이때, 변환 커널의 사이즈는 (n^2)x(n^2)일 수 있다. 예를 들어, 좌-상단 4x4 계수 블록에 2차 변환을 수행하는 경우, 16x16 크기의 변환 커널이 적용될 수 있다. 그리고, 좌-상단 8x8 계수 블록에 2차 변환을 수행하는 경우, 64x64 크기의 변환 커널이 적용될 수 있다. 64x64 크기의 변환 커널은 많은 양의 곱셈 연산을 수반하므로, 인코더와 디코더에 큰 부담이 될 수 있다. 따라서, 2차 변환에서 고려되는 샘플 수가 줄어드는 경우, 연산량과 변환 커널 저장에 필요한 메모리를 줄일 수 있다.
도 12는 본 발명의 일 실시예에 따른 감소된 샘플 수를 이용하는 2차 변환을 적용하는 방법을 도시한 도면이다. 본 발명의 실시예에 따르면, 2차 변환은 2차 변환 커널 행렬과 1차 변환된 계수 벡터의 곱으로 표현될 수 있으며, 1차 변환된 계수를 또 다른 공간으로 매핑하는 것으로 해석할 수 있다. 이때, 2차 변환되는 계수의 개수를 줄일 경우, 즉, 2차 변환 커널을 구성하는 기저 벡터의 수를 줄일 경우, 2차 변환에서 필요한 연산량과 변환 커널 저장에 필요한 메모리 용량을 줄일 수 있다. 예를 들어, 좌-상단 8x8 계수 블록에 2차 변환을 수행할 때, 2차 변환되는 계수의 개수를 16개로 줄이는 경우, 16(행)x64(열) 크기(또는 16(행)x48(열) 크기)의 2차 변환 커널이 적용될 수 있다. 인코더의 변환부는 변환 커널 매트릭스를 구성하는 각각의 행 벡터와 1차 변환된 계수 벡터와의 내적(inner product)을 통해 2차 변환된 계수 벡터를 획득할 수 있다. 인코더 및 디코더의 역변환부는 변환 커널 매트릭스를 구성하는 각각의 열 벡터와 2차 변환된 계수 벡터와의 내적을 통해 1차 변환된 계수 벡터를 획득할 수 있다.
도 12를 참조하면, 인코더는 먼저 잔차 신호 블록에 대하여 1차 변환(forward primary transform)을 수행하여 1차 변환된 계수 블록을 얻을 수 있다. 1차 변환된 계수 블록의 사이즈를 MxN이라 하였을 때, min(M, N)의 값이 4인 인트라 예측된 블록에 대하여, 1차 변환된 계수 블록의 좌-상단 4x4 샘플들에 4x4 2차 변환(forward secondary transform)이 수행될 수 있다. min(M, N)의 값이 8 이상인 인트라 예측된 블록에 대해서는, 1차 변환된 계수 블록의 좌-상단 8x8 샘플들에 8x8 2차 변환이 수행될 수 있다. 8x8 2차 변환의 경우, 많은 연산량과 메모리를 수반하므로, 8x8 샘플들 중의 일부만이 활용될 수도 있다. 일 실시예에서, 부호화 효율 향상을 위하여, min(M, N)의 값이 4이고, M 또는 N이 8보다 큰 직사각형 블록에 대하여 (예를 들어, 4x16, 16x4 크기의 직사각형 블록), 1차 변환된 계수 블록 내 두 개의 좌-상단 4x4 서브 블록에 각각 4x4 2차 변환이 수행될 수도 있다.
2차 변환은 2차 변환 커널 행렬과 입력 벡터의 곱으로 계산될 수 있으므로, 먼저 인코더는 1차 변환된 계수 블록의 좌-상단 서브 블록 내의 계수들을 벡터 형태로 구성할 수 있다. 벡터로 구성하는 방법은 인트라 예측 모드에 의존적일 수 있다. 예를 들어, 인트라 예측 모드가 앞서 도 6에서 도시한 인트라 예측 모드 중에서, 34번 각도 모드 이하인 경우, 인코더는 1차 변환된 계수 블록의 좌-상단 서브 블록을 수평 방향으로 스캔하여 계수들을 벡터로 구성할 수 있다. 1차 변환된 계수 블록의 좌-상단 nxn 블록의 i번째 행, j번째 열의 원소를 x(I, j)라고 표현할 경우, 벡터화된 계수는 [x(0, 0), x(0, 1), ..., x(0, n-1), x(1, 0), x(1, 1), …, x(1, n-1), ..., x(n-1, 0), x(n-1, 1), ..., x(n-1, n-1)]로 표현할 수 있다. 반면, 인트라 예측 모드가 34번 각도 모드보다 큰 경우, 1차 변환된 계수 블록의 좌-상단 서브 블록을 수직 방향으로 스캔하여 계수들을 벡터로 구성할 수 있다. 벡터화된 계수는 [x(0, 0), x(1, 0), ..., x(n-1, 0), x(0, 1), x(1, 1), ..., x(n-1, 1), ..., x(0, n-1), x(1, n-1), ..., x(n-1, n-1)]로 표현될 수 있다. 연산량을 줄이기 위하여, 8x8 2차 변환에서 8x8 샘플들 중의 일부만을 활용하는 경우, 상기 기술한 벡터 구성 방법에서 i>3이고 j>3인 계수 x_ij는 포함되지 않을 수도 있다. 이 경우, 4x4 2차 변환에서는 16개의 1차 변환된 계수가 2차 변환의 입력이 될 수 있다. 8x8 2차 변환에서는 48개의 1차 변환된 계수가 2차 변환의 입력이 될 수 있다.
인코더는 벡터화된 1차 변환 계수 블록의 좌-상단 서브 블록 샘플들과 2차 변환 커널 매트릭스와의 곱을 통해 2차 변환된 계수들을 획득할 수 있다. 2차 변환에 적용되는 2차 변환 커널은 변환 유닛 또는 변환 블록의 사이즈, 인트라 모드 및 변환 커널을 지시하는 신택스 요소에 따라 결정될 수 있다. 전술한 바와 같이, 2차 변환되는 계수의 개수가 줄어들면, 연산량과 변환 커널 저장에 필요한 메모리가 줄어들 수 있다. 따라서, 현재 변환 블록의 사이즈에 따라 2차 변환되는 계수의 개수는 결정될 수 있다. 예를 들어, 인코더는 4x4 블록의 경우, 길이가 16인 벡터와 8(행)x16(열) 변환 커널 매트릭스의 곱을 통해 길이가 8인 계수 벡터를 획득할 수 있다. 8(행)x16(열) 변환 커널 매트릭스는 16(행)x16(열) 변환 커널 매트릭스를 구성하는 첫 번째 기저 벡터부터 여덟 번째 기저 벡터에 기초하여 획득될 수 있다. 인코더는 4xN 또는 Mx4 블록(N과 M은 8 이상)의 경우, 길이가 16인 벡터와 16(행)x16(열) 변환 커널 매트릭스의 곱을 통해 길이가 16인 계수 벡터를 획득할 수 있다. 인코더는 8x8 블록의 경우, 길이가 48인 벡터와 8(행)x48(열) 변환 커널 매트릭스의 곱을 통해 길이가 8인 계수 벡터를 획득할 수 있다. 8(행)x48(열) 변환 커널 매트릭스는 16(행)x48(열) 변환 커널 매트릭스를 구성하는 첫 번째 기저 벡터부터 여덟 번째 기저 벡터에 기초하여 획득될 수 있다. 인코더는 8x8을 제외한 MxN 블록(M과 N은 8 이상)의 경우, 길이가 48인 벡터와 16(행)x48(열) 변환 커널 매트릭스의 곱을 통해 길이가 16인 계수 벡터를 획득할 수 있다.
본 발명의 일 실시예에 따르면, 2차 변환된 계수들은 벡터 형태이므로, 2차원 형태의 데이터로 표현될 수 있다. 기 설정된 스캔 순서에 따라 2차 변환된 계수들은 좌-상단 계수 서브-블록으로 구성될 수 있다. 일 실시예에서, 기 설정된 스캔 순서는 우상측 대각(up-right diagonal) 스캔 순서일 수 있다. 본 발명은 이에 국한되지 않으며, 우상측 대각 스캔 순서는 후술하는 도 13, 도 14에서 기술하는 방법에 기초하여 결정될 수 있다.
또한, 본 발명의 일 실시예에 따르면, 2차 변환된 계수들을 포함하는 전체 변환 유닛 크기의 변환 계수들은 양자화(quantization) 이후, 비트스트림에 포함되어 전송될 수 있다. 비트스트림은 2차 변환과 관련된 신택스 요소를 포함할 수 있다. 구체적으로, 비트스트림은 현재 블록에 2차 변환이 적용되는지 여부에 관한 정보 및 상기 현재 블록에 적용되는 변환 커널을 지시하는 정보를 포함할 수 있다.
디코더는 먼저 비트스트림으로부터 양자화된 변환 계수들을 파싱할 수 있고, 역-양자화(de-quantization)를 통해 변환 계수들을 획득할 수 있다. 역-양자화는 스케일링(scaling)으로 지칭될 수 있다. 디코더는 2차 변환과 관련된 신택스 요소에 기반하여 현재 블록에 2차 역변환이 수행될지를 결정할 수 있다. 현재 변환 유닛 또는 변환 블록에 2차 역변환이 적용되는 경우, 변환 유닛 또는 변환 블록의 사이즈에 따라 8개 또는 16개의 변환 계수가 2차 역변환의 입력이 될 수 있다. 2차 역변환의 입력이 되는 계수의 개수는 인코더의 2차 변환에서 출력되는 계수의 개수와 일치할 수 있다. 예를 들어, 변환 유닛 또는 변환 블록의 사이즈가 4x4 또는 8x8인 경우, 8개의 변환 계수가 2차 역변환의 입력이 될 수 있으며, 그렇지 않은 경우, 16개의 변환 계수가 2차 역변환의 입력이 될 수 있다. 변환 유닛의 크기가 MxN일 때, min(M, N)의 값이 4인 인트라 예측된 블록에 대하여 변환 계수 블록의 좌-상단 4x4 서브 블록의 16개 또는 8개의 계수에 4x4 2차 역변환이 수행될 수 있다. min(M, N)이 8 이상인 인트라 예측된 블록에 대해서는 변환 계수 블록의 좌-상단 4x4 서브 블록의 16개 또는 8개의 계수에 8x8 2차 역변환이 수행될 수 있다. 일 실시예에서, 부호화 효율 향상을 위하여 min(M,N)이 4이고, M 또는 N이 8보다 큰 경우 (예를 들어, 4x16, 16x4 크기의 직사각형 블록), 변환 계수 블록 내 두 개의 좌-상단 4x4 서브 블록에 각각 4x4 2차 역변환이 수행될 수도 있다.
본 발명의 일 실시예에 따르면, 2차 역변환은 2차 역변환 커널 행렬과 입력 벡터의 곱으로 계산이 될 수 있으므로, 디코더는 먼저 입력이 되는 역-양자화된 변환 계수 블록을 기 설정된 스캔 순서에 따라 벡터 형태로 구성할 수 있다. 일 실시예에서, 기 설정된 스캔 순서는 우상측 대각(up-right diagonal) 스캔 순서일 수 있으며, 본 발명은 이에 국한되지 않으며, 우상측 대각 스캔 순서는 후술하는 도 13, 도 14에서 기술하는 방법에 기초하여 결정될 수 있다.
또한, 본 발명의 일 실시예에 따르면, 디코더는 벡터화된 변환 계수와 2차 역변환 커널 매트릭스의 곱을 통해 1차 변환된 계수를 획득할 수 있다. 이때, 2차 역변환 커널은 변환 유닛 또는 변환 블록의 사이즈, 인트라 모드 및 변환 커널을 지시하는 신택스 요소에 따라 결정될 수 있다. 2차 역변환 커널 행렬은 2차 변환 커널 행렬의 전치 행렬일 수 있다. 구현의 복잡도를 고려하여 커널 행렬의 원소는 10-bit 또는 8-bit 정확도로 표현되는 정수일 수 있다. 현재 변환 블록의 사이즈에 기초하여 2차 역변환의 출력이 되는 벡터의 길이가 결정될 수 있다. 예를 들어, 4x4 블록의 경우, 길이가 8인 벡터와 8(행)x16(열) 변환 커널 매트릭스의 곱을 통해 길이가 16인 계수 벡터가 획득될 수 있다. 8(행)x16(열) 변환 커널 매트릭스는 16(행)x16(열) 변환 커널 매트릭스를 구성하는 첫 번째 기저 벡터부터 여덟 번째 기저 벡터에 기초하여 획득될 수 있다. 4xN 또는 MxN 블록(N과 M은 8 이상)의 경우, 길이가 16인 벡터와 16(행)x16(열) 변환 커널 매트릭스의 곱을 통해 길이가 16인 계수 벡터가 획득될 수 있다. 8x8 블록의 경우, 길이가 8인 벡터와 8(행)x48(열) 변환 커널 매트릭스의 곱을 통해 길이가 48인 계수 벡터를 획득할 수 있다. 8(행)x48(열) 변환 커널 매트릭스는 16(행)x48(열) 변환 커널 매트릭스를 구성하는 첫 번째 기저 벡터부터 여덟 번째 기저 벡터에 기초하여 획득될 수 있다. 8x8을 제외한 MxN 블록(M과 N은 8 이상)의 경우, 길이가 16인 벡터와 16(행)x48(열) 변환 커널 매트릭스의 곱을 통해 길이가 48인 계수 벡터를 획득할 수 있다.
일 실시예에서, 2차 역변환을 통해 획득한 1차 변환 계수는 벡터 형태이므로, 디코더는 이를 다시 2차원 형태의 데이터로 표현할 수 있으며, 이는 인트라 모드에 의존적일 수 있다. 이때 인코더에서 적용한 인트라 모드에 기반하는 매핑 관계가 동일하게 적용될 수 있다. 전술한 바와 같이, 인트라 예측 모드가 34번 각도 모드 이하인 경우, 디코더는 2차 역변환된 계수 벡터를 수평 방향으로 스캔하여 2차원 형태의 변환 계수 어레이를 획득할 수 있다. 디코더는 인트라 예측 모드가 34번 각도 모드보다 큰 경우, 2차 역변환된 계수 벡터를 수직 방향으로 스캔하여 2차원 형태의 변환 계수 어레이를 획득할 수 있다. 디코더는 2차 역변환을 수행하여 획득한 변환 계수를 포함하는 전체 변환 유닛 또는 변환 블록 사이즈의 변환 계수 블록에 대하여 1차 역변환을 수행하여 잔차 신호를 획득할 수 있다.
도 12에서는 도시하지 않았으나, 변환 또는 역변환 이후 변환 커널로 인해 증가하는 스케일을 보정해 주기 위하여, 변환 또는 역변환을 적용함에 있어 비트 쉬프트 연산을 이용한 스케일링 과정이 포함될 수도 있다.
도 13은 본 발명의 일 실시예에 따른 우상측 대각(up-right diagonal) 스캔 순서의 결정 방법을 예시하는 도면이다. 본 발명의 실시예에 따르면, 인코딩 또는 디코딩 시에 스캔 순서를 초기화하는 과정이 수행될 수 있다. 블록 사이즈에 따라 스캔 순서 정보를 포함하는 배열의 초기화가 수행될 수 있다. 구체적으로, log2BlockWidth, log2BlockHeight의 조합에 대하여 1<<log2BlockWidth, 1<<log2BlockHeight을 입력으로 하는 도 13에 도시된 우상측 대각 스캔 순서 배열 초기화 과정이 호출(또는 수행)될 수 있다. 우상측 대각 스캔 순서 배열 초기화 과정의 출력은 DiagScanOrder[log2BlockWidth][log2BlockHeight]에 할당될 수 있다. 여기서, log2BlockWidth 및 log2BlockHeight는 각각 블록의 너비 및 높이에 대하여 밑이 2이 로그를 취한 값을 나타내는 변수이며, [0, 4] 범위의 값일 수 있다.
도 13에 도시된 우상측 대각 스캔 순서 배열 초기화 과정을 통해, 인코더/디코더는 입력 받은 블록의 너비인 blkWidth, 블록의 높이인 blkHeight에 대하여 배열 diagScan[sPos][sComp]를 출력할 수 있다. 배열의 인덱스인 sPos는 스캔 포지션(스캔 인덱스)을 나타낼 수 있으며, [0, blkWidth*blkHeight-1] 범위의 값일 수 있다. 배열의 인덱스인 sComp가 0인 경우, sPos는 수평 컴포넌트(x)를 나타낼 수 있으며, sComp가 1인 경우, sPos는 수직 컴포넌트(y)를 나타낼 수 있다. 도 13에 도시된 알고리즘은 우상측 대각 스캔 순서에 의하여 스캔 포지션 sPos일 때의 2차원 좌표 상의 x 좌표 값, y좌표 값이 각각 diagScan[sPos][0], diagScan[sPos][1]에 할당되는 것으로 해석할 수 있다. 즉, DiagScanOrder[log2BlockWidth][log2BlockHeight][sPos][sComp] 배열(또는 어레이)에 저장된 값은 블록의 너비와 높이가 각각 1<<log2BlockWidth, 1<<log2BlockHeight인 블록의 우상측 대각 스캔 순서에서 sPos 스캔 위치(스캔 인덱스)일 때의 sComp에 해당하는 좌표 값을 의미할 수 있다.
도 14는 본 발명의 일 실시예에 따른 우상측 대각 스캔 순서를 블록 사이즈에 따라 나타낸 도면이다. 도 14(a)를 참조하면, log2BlockWidth와 log2BlockHeight가 모두 2인 경우, 4x4 크기의 블록을 의미할 수 있다. 도 14(b)를 참조하면, log2BlockWidth와 log2BlockHeight가 모두 3인 경우, 8x8 크기의 블록을 의미할 수 있다. 도 14에서, 회색 음영 영역에 표시된 숫자는 스캔 위치(스캔 인덱스) sPos를 나타낸다. sPos 위치에서의 x 좌표 값, y 좌표 값이 각각 DiagScanOrder[log2BlockWidth][log2BlockHeight][sPos][0], DiagScanOrder[log2BlockWidth][log2BlockHeight][sPos][1]에 할당될 수 있다.
인코더/디코더는 상기 기술한 스캔 순서에 기반하여 변환 계수 정보를 코딩할 수 있다. 본 발명에서는 우상측 스캔 방법이 사용되는 경우에 기반하는 실시예를 위주로 기술하나, 본 발명이 이에 제한되는 것은 아니며, 이외에 공지된 다른 스캔 방법에 대해서도 적용될 수 있다.
이하에서는, 2차 변환과 관련된 디코딩 과정을 상세히 기술한다. 설명의 편의를 위해 2차 변환과 관련된 과정을 디코더를 위주로 설명하나, 이하에서 설명하는 실시예는 실질적으로 동일한 방법으로 인코더에 적용될 수 있다.
도 15는 코딩 유닛 레벨에서 2차 변환을 지시하는 방법을 도시한 도면이다. 2차 변환은 코딩 유닛 레벨에서 지시될 수 있으며, 2차 변환과 관련된 신택스 요소가 coding_unit 신택스 구조에 포함될 수 있다. coding_unit 신택스 구조는 코딩 유닛과 관련된 신택스 요소를 포함할 수 있다. 이때, 픽쳐의 좌-상단 루마 샘플을 기준으로 현재 블록의 좌-상단 루마 샘플 좌표인 (x0, y0), 블록의 너비인 cbWidth, 블록의 높이인 cbHeight 및 부호화 트리의 종류를 나타내는 변수인 treeType이 coding_unit 신택스 구조의 입력일 수 있다. 루마와 크로마 간에는 상관관계가 존재하기 때문에, 루마와 크로마를 동일한 부호화 구조로 부호화하게 되면, 효율적인 영상 압축이 가능하다. 또는, 부호화 효율을 향상시키기 위하여, 루마와 크로마는 서로 다른 부호화 구조로 부호화될 수도 있다. 변수 treeType이 SINGLE_TREE인 경우, 루마와 크로마가 동일한 부호화 트리 구조로 부호화되었음을 의미할 수 있으며, 코딩 유닛은 루마 코딩 블록과 컬러 포맷에 따라 크로마 코딩 블록을 포함할 수 있다. treeType이 DUAL_TREE_LUMA인 경우, 루마와 크로마가 서로 다른 부호화 트리로 부호화되었음을 의미하여, 현재 처리되는 트리가 루마에 대한 트리임을 나타낼 수 있다. 이때, 코딩 유닛은 루마 코딩 블록만을 포함할 수 있다. treeType이 DUAL_TREE_CHROMA인 경우, 루마와 크로마가 서로 다른 부호화 트리로 부호화되었음을 의미하며, 현재 처리되는 트리가 크로마에 대한 트리임을 나타낼 수 있다. 이때, 코딩 유닛은 컬러 포맷에 따라 크로마 코딩 블록을 포함할 수 있다.
coding_unit 신택스 구조에서는, 현재 코딩 유닛에 대한 예측 방법이 지시될 수 있으며, 변수 CuPredMode[x0][y0]는 현재 블록에 대한 예측 방법을 나타낼 수 있다. CuPredMode[x0][y0]가 MODE_INTRA인 경우, 현재 블록에 인트라 예측 방법이 적용되었음을 나타낼 수 있으며, MODE_INTER인 경우, 현재 블록에 인터 예측 방법이 적용되었음을 나타낼 수 있다. 또한, CuPredMode[x0][y0]가 MODE_IBC인 경우, 현재 픽쳐의 복원이 완료된 영역으로부터 참조 블록을 생성하여 예측을 수행하는 IBC (Intra Block Copy) 예측이 현재 블록에 적용되었음을 나타낼 수 있다. 변수 CuPredMode[x0][y0]의 값에 따라, 예측 방법과 관련된 신택스 요소의 처리가 수행될 수 있다. 예를 들어, 변수 CuPredMode[x0][y0]이 인트라 예측을 나타내는 경우, 디코더는 인트라 예측 모드, 참조 라인 인덱스, ISP (Intra Sub-Partitions) 예측 관련 정보를 포함하는 신택스 요소를 파싱하거나, 기 설정된 방법에 따라 인트라 예측 모드와 관련 변수를 설정할 수 있다.
예측 방법과 관련된 신택스 요소의 처리 이후, 잔차 신호와 관련된 신택스 요소의 처리가 수행될 수 있다. transform_tree() 신택스 구조는 변환 트리(transform tree)에 대한 신택스 구조로써, 변환 트리(transform tree)는 코딩 유닛과 동일한 사이즈를 루트 노드로 하여, 루트 노드보다 작은 사이즈의 노드들로 분할될 수 있으며, 변환 트리(transform tree)의 리프 노드는 변환 유닛이 될 수 있다. transform_tree 신택스 구조는 변환 트리(transform tree)의 분할과 관련된 정보를 포함할 수 있다.
인트라 예측 방법 중의 하나로써 PCM(Pulse Code Modulation) 예측이 있을수 있다. PCM 예측이 현재 코딩 유닛의 예측에 사용되는 경우, 변환과 양자화가 수행되지 않으므로, transform_tree 신택스 구조는 존재하지 않을 수 있다. 즉, transform_tree 신택스 구조는 존재하지 않으므로, 디코더는 transform_tree 신택스 구조에 대한 동작을 수행하지 않을 수 있다. PCM 예측은 현재 코딩 유닛에 인트라 예측이라 지시되는 경우, pcm_flag[x0][y0]로 지시될 수 있다. 즉, pcm_flag[x0][y0]가 1인 경우, transform_tree 신택스 구조에 대한 디코더의 동작은 수행되지 않을 수 있다. 한편, 현재 코딩 유닛에 대하여 transform_tree 신택스 구조가 존재하는지 여부는 1-bit 플래그로 지시될 수 있으며, 이를 본 명세서에서는 cu_cbf로 지칭하나 이에 한정되는 것은 아니다. 디코더는 cu_cbf를 파싱하거나, cu_cbf가 파싱되지 않는 경우, 기 설정된 방법에 따라 cu_cbf를 설정할 수 있다. cu_cbf가 1인 경우 디코더는 transform_tree 신택스 구조에 대한 동작을 수행할 수 있다. 현재 코딩 유닛의 예측에 인터 예측 또는, IBC 예측이 사용되는 경우, 현재 코딩 유닛의 예측에 머지 예측도 사용될 수 있다. 머지 예측이 사용되는지 여부는 merge_flag[x0][y0]로 지시될 수 있다. 현재 블록에 머지 예측이 사용되는 것으로 지시되는 경우 (merge_flag[x0][y0]==1), cu_cbf는 파싱되지 않고, 기 설정된 방법에 따라 cu_cbf의 값이 결정될 수 있다. 기 설정된 방법은 스킵 모드를 지시하는 cu_skip_flag[x0][y0]에 기반하는 방법일 수 있다. 예를 들어, cu_skip_flag[x0][y0]가 1인 경우, cu_cbf는 0으로 추론(infer)되고, 그렇지 않은 경우, cu_cbf는 1로 추론될 수 있다. cu_cbf가 1인 경우, transform_tree 신택스 구조의 처리가 수행될 수 있으며, 0이 아닌 양자화 계수(significant coefficient)의 개수를 측정하기 위한 카운터 값은 0으로 초기화될 수 있다.
numSigCoeff 변수는 현재 코딩 유닛의 변환 유닛 내에 존재하는 0이 아닌 양자화 계수(significant coefficient)의 개수를 나타내는 변수를 의미하는 것으로, numSigCoeff의 값에 따라 2차 변환과 관련된 신택스 요소의 처리가 달라질 수 있다.
numZeroOutSigCoeff 변수는 현재 코딩 유닛이 포함하는 변환 유닛 내의 특정 위치 상에 존재하는 0이 아닌 양자화 계수(significant coefficient)의 개수를 나타내는 변수를 의미하는 것으로, numZeroOutSigCoeff의 값에 따라 2차 변환과 관련된 신택스 요소의 처리가 달라질 수 있다.
transform_tree에서 변환 트리(transform tree)가 분할될 수 있으며, 변환 트리(transform tree)의 리프 노드는 변환 유닛일 수 있다. transform_tree는 리프 노드인 변환 유닛과 관련된 신택스 구조인 transform_unit 신택스 구조를 포함할 수 있다. transform_unit은 변환 유닛과 관련된 신택스 요소를 처리할 수 있으며, 해당 변환 유닛이 0이 아닌 변환 계수를 하나 이상 포함하는 경우, residual_coding 신택스 구조를 포함할 수 있다. residual_coding 신택스 구조는 양자화된 변환 계수와 관련된 신택스 구조 및 이와 관련된 처리를 포함할 수 있다. 현재 처리되는 트리의 타입에 따라 변환 유닛을 구성하는 변환 블록은 달라질 수 있다. treeType이 SINGLE_TREE인 경우, 현재 변환 유닛은 루마 변환 블록 및 컬러 포맷에 따라 크로마 변환 블록들을 포함할 수 있다. treeType이 DUAL_TREE_LUMA인 경우, 현재 변환 유닛은 루마 변환 블록을 포함할 수 있다. treeType이 DUAL_TREE_CHROMA인 경우, 현재 변환 유닛은 크로마 변환 블록들을 포함할 수 있다. transform_unit 신택스 구조는 treeType에 따라 현재 변환 유닛이 포함하는 변환 블록들에 대하여 해당 변환 블록이 0이 아닌 계수를 하나 이상 포함하는지를 지시하는 정보인 CBF(coded block flag) 정보를 포함할 수 있다. 상기 CBF 정보는 컬러 성분 별로 지시되는 정보일 수 있다. 예를 들어, 현재 변환 유닛의 루마 변환 블록에 대한 CBF의 값이 루마 변환 블록이 0이 아닌 계수를 하나 이상 포함하지 않음을 나타내는 경우, 루마 변환 블록의 계수는 모두 0이므로, 루마 변환 블록에 대한 residual_coding 신택스 구조는 처리되지 않을 수 있다. 또 다른 예로, 현재 변환 유닛의 크로마 Cb 변환 블록에 대한 CBF의 값이 크로마 Cb 변환 블록이 0이 아닌 계수를 하나 이상 포함하는 것을 나타내는 경우, 현재 변환 유닛의 Cb 변환 블록에 대한 residual_coding 신택스 구조는 존재할 수 있다.
현재 블록에 2차 변환이 적용되는지 여부는, CU 레벨에서 지시될 수 있다. 2차 변환이 적용되는 경우, 추가적으로 2차 변환에 사용되는 변환 커널을 지시하는 인덱스가 지시될 수도 있다. 도 11에서 설명한 바와 같이, lfnst_idx[x0][y0] 신택스 요소를 사용하여 현재 블록에 2차 변환이 적용되는지 여부가 지시될 수 있다. lfnst_idx[x0][y0]의 첫 번째 비트는 현재 코딩 유닛에 2차 변환이 적용되는지를 나타낼 수 있다. lfnst_idx[x0][y0]의 첫 번째 비트가 0이면, 즉, lfnst_idx[x0][y0]가 0인 경우, 현재 블록에 2차 변환이 적용되지 않았음을 나타낼 수 있다. 반면에, lfnst_idx[x0][y0]의 첫 번째 비트가 1이면, 즉, lfnst_idx[x0][y0]가 0보다 큰 경우(lfnst_idx[x0][y0] > 0), 현재 블록에 2차 변환이 적용되는 것을 나타낸다. 이때, 2차 변환에 사용된 변환 커널을 지시하기 위해 추가적인 비트가 사용될 수 있고, 추가적인 비트를 통해 2차 변환 커널을 지시하는 인덱스가 시그널링될 수 있다.
lfnst_idx[x0][y0] 신택스 요소는 후술하는 조건들이 만족되는 경우 파싱될 수 있다. 반면 후술하는 조건들이 만족되지 않는 경우, lfnst_idx[x0][y0]는 현재 코딩 유닛에 존재하지 않고, lfnst_idx[x0][y0]는 0으로 설정될 수 있다.
다시 말하면, 후술하는 lfnst_idx[x0][y0] 신택스 요소 파싱 조건을 포함하는 제1 실시예 내지 제4 실시예에서 설명하는 조건들이 만족되면 인코더는, 현재 코딩 유닛에 대한 lfnst_idx[x0][y0] 신택스 요소를 포함하는 비트스트림을 생성할 수 있다. 반면 후술하는 조건들이 만족되지 않으면 인코더가 생성하는 비트스트림에는 현재 코딩 유닛에 대한 lfnst_idx[x0][y0] 신택스 요소가 포함되지 않고, lfnst_idx[x0][y0]는 0으로 설정될 수 있다. 이러한 비트스트림을 수신한 디코더는, 후술하는 조건들에 기초하여 lfnst_idx[x0][y0] 신택스 요소를 파싱할 수 있다.
lfnst_idx[x0][y0] 신택스 요소 파싱 조건
i) Min(lfnstWidth, lfnstHeight)>=4
먼저 첫 번째 조건은, 블록 크기(사이즈)와 관련된 것으로, 블록의 너비 및 높이가 각각 4픽셀 이상일 때, 디코더는 lfnst_idx[x0][y0] 신택스 요소를 파싱할 수 있다.
구체적으로, 디코더는 2차 변환을 적용할 수 있는 블록 사이즈 조건을 검사할 수 있다. 변수 SubWidthC, SubHeightC는 컬러 포맷에 따라 설정되는 것으로, 각각 픽쳐의 루마 성분의 너비, 높이 대비 크로마 성분의 너비, 높이의 비를 나타낼 수 있다. 예를 들어, 4:2:0 컬러 포맷 영상은, 루마 샘플 4개 당 이에 상응하는 크로마 샘플 1개를 포함하는 구조이므로 SubWidthC와 SubHeightC는 모두 2로 설정될 수 있다. 다른 예로, 4:4:4 컬러 포맷 영상은, 루마 샘플 1개 당 이에 상응하는 크로마 샘플 1개를 포함하는 구조이므로 SubWidthC와 SubHeightC는 모두 1로 설정될 수 있다. 현재 블록의 수평 방향 샘플 수인 lfnstWidth, 수직 방향 샘플 수인 lfnstHeight는 SubWidthC, SubHeightC에 기초하여 설정될 수 있다. treeType이 DUAL_TREE_CHROMA인 경우, 코딩 유닛은 크로마 성분만을 포함하므로, 크로마 코딩 블록의 수평 방향 샘플 수는 루마 코딩 블록의 너비인 cbWidth를 SubWidthC로 나눈 값과 같다. 마찬가지로, 크로마 코딩 블록의 수직 방향 샘플 수는 루마 코딩 블록의 높이인 cbHeight를 SubHeightC로 나눈 값과 같다. treeType이 SINGLE_TREE이거나 DUAL_TREE_LUMA인 경우, 코딩 유닛은 루마 성분을 포함하므로 lnfnstWidth, lfnstHeight은 각각 cbWidth, cbHeight로 설정될 수 있다. 2차 변환이 적용될 수 있는 블록의 최소 조건은 4x4이므로, Min(lfnstWidth, lfnstHeight)>=4를 만족할 경우, lfnst_idx[x0][y0]는 파싱될 수 있다.
ii) sps_lfnst_enabled_flag==1
두 번째 조건은, 2차 변환의 활성화 또는 적용 가능 여부를 지시하는 플래그 값에 관한 것으로, 2차 변환의 활성화 또는 적용 가능 여부를 지시하는 플래그(sps_lfnst_enabled_flag) 값이 1로 설정되었을 때, 디코더는 lfnst_idx[x0][y0] 신택스 요소를 파싱할 수 있다.
구체적으로, 2차 변환은 상위 레벨 신택스 RBSP에서 지시될 수 있다. SPS, PPS, VPS, 타일 그룹 헤더, 슬라이스 헤더 중의 적어도 하나에 2차 변환의 활성화 또는 적용 가능 여부를 지시하는 1-bit 크기를 가지는 플래그가 포함될 수 있다. sps_lfnst_enabled_flag가 1일 경우, lfnst_idx[x0][y0] 신택스 요소가 코딩 유닛 신택스 내에 존재하는 것을 나타낸다. sps_lfnst_enabled_flag가 0일 경우, lfnst_idx[x0][y0] 신택스 요소가 코딩 유닛 신택스 내에 존재하지 않는 것을 나타낸다.
iii) CuPredMode[x0][y0]==MODE_INTRA
세 번째 조건은, 예측 모드에 관한 것으로, 2차 변환은 인트라 예측된 블록에만 적용될 수 있다. 따라서, 현재 블록이 인트라 예측된 블록인 경우, 디코더는 lfnst_idx[x0][y0] 신택스 요소를 파싱할 수 있다.
iv) IntraSubPartitionsSplitType==ISP_NO_SPLIT
네 번째 조건은, ISP 예측 방법이 적용되는지 여부와 관련된 것으로, 현재 블록에 ISP가 적용되지 않을 때, 디코더는 lfnst_idx[x0][y0] 신택스 요소를 파싱할 수 있다.
구체적으로, 도 11을 참고하여 설명한 바와 같이, 현재 CU에 대하여 CU 크기보다 작은 다수의 변환 유닛으로 분할되는 경우, 분할된 변환 유닛에는 2차 변환이 적용되지 않을 수 있다. 이때, 2차 변환과 관련된 신택스 요소인 lfnst_idx[x0][y0]는 파싱되지 않고 0으로 설정될 수 있다. 현재 CU에 대하여 변환 트리(transform tree)가 CU 크기보다 작은 다수의 변환 유닛으로 분할되는 경우는, ISP 예측이 현재 코딩 유닛에 적용되는 경우를 포함할 수 있다. ISP 예측 방법은 현재 코딩 유닛에 인트라 예측이 적용되는 경우, 기 설정된 분할 방법에 따라 변환 트리(transform tree)를 CU 크기보다 작은 다수의 변환 유닛으로 분할하는 예측 방법일 수 있다. 코딩 유닛 레벨에서 ISP 예측 모드가 지시될 수 있고, 이에 기반하여 변수 IntraSubPartitionsSplitType가 설정될 수 있다. 이때, IntraSubPartitionsSplitType이 ISP_NO_SPLIT인 경우, 현재 블록에 ISP가 적용되지 않음을 나타낸다. 2차 변환은 코딩 유닛 레벨에서 지시되지만, 실제 2차 변환은 변환 유닛 레벨에서 적용될 수 있다. 따라서, 변환 트리(transform tree)가 다수의 변환 유닛으로 분할되었을 때, 분할된 모든 변환 유닛에 동일한 2차 변환 커널이 적용되는 것은 비효율적일 수 있다. 또한, 변환 유닛 레벨에서 예측 샘플을 생성하는 인트라 예측의 특성 상, 변환 트리(transform tree)를 분할하여 다수의 변환 유닛으로 분할하였을 때가 분할하지 않았을 때보다 예측의 정확도가 높아질 수 있다. 따라서 변환 트리(transform tree)가 다수의 변환 유닛으로 분할되면 분할된 다수의 변환 유닛에 2차 변환이 적용되지 않더라도, 잔차 신호의 에너지가 효율적으로 압축(compaction)될 가능성이 높다. 또한, 현재 CU의 사이즈가 루마 최대 변환 블록 사이즈 (MaxTbSizeY)보다 큰 경우 (즉, cbWidth>MaxTbSizeY||cbHeight>MaxTbSizeY), 변환 트리(transform tree)는 CU 사이즈보다 작은 다수의 변환 유닛으로 분할될 수 있다. 도 15에는 도시하지 않았으나, 이 현재 CU의 사이즈가 루마 최대 변환 블록 사이즈 (MaxTbSizeY)보다 큰 경우에도 2차 변환은 적용되지 않을 수 있다. 따라서, 네 번째 조건은, IntraSubPartitionsSplitType==ISP_NO_SPLIT&&cbWidth<=MaxTbSizeY&&cbHeight<=MaxTbSizeY로 표현될 수도 있다. 이때, MaxTbSizeY는 2의 지수승 형태로 표현되는 자연수일 수 있다. MaxTbSizeY는 SPS, PPS, 슬라이스 헤더, 타일 그룹 헤더 등의 상위 레벨 신택스 RBSP에 포함되어 지시되거나, 인코더와 디코더가 기 설정된 동일한 값을 사용할 수도 있다. 예를 들어, 기 설정된 값은 64(2^6)일 수 있다.
v) !intra_mip_flag[x0][y0]
다섯 번째 조건은, 인트라 예측 방법에 관한 것으로, 현재 코딩 유닛 예측에 MIP(Matrix based Intra Predicition)가 적용되지 않는 경우, 디코더는 lfnst_idx[x0][y0] 신택스 요소를 파싱할 수 있다.
구체적으로, 인트라 예측의 한 방법으로 MIP가 사용될 수 있고, MIP의 적용 여부는 코딩 유닛 레벨에서 intra_mip_flag[x0][y0]로 지시될 수 있다. Intra_mip_flag[x0][y0]가 1인 경우, MIP가 현재 코딩 유닛의 예측에 적용됨을 나타낼 수 있고, 현재 블록 주변의 복원된 샘플들과 기 설정된 행렬의 곱으로 예측이 수행될 수 있다. MIP가 적용되면, 방향성 또는 무방향성 예측을 수행하는 일반적인 인트라 예측과는 다른 잔차 신호의 성질을 보이므로, MIP가 적용될 때에는 변환 블록에 2차 변환은 적용되지 않을 수 있다.
vi) numSigCoeff>((treeType==SINGLE_TREE)?2:1)
여섯 번째 조건은, treeType 및 계수와 관련된 것이다.
구체적으로, treeType이 SINGLE_TREE인 경우, 변수 numSigCoeff의 값이 2보다 클 때, 현재 블록에 2차 변환이 적용될 수 있고, 디코더는 lfnst_idx[x0][y0] 신택스 요소를 파싱할 수 있다.
treeType이 DUAL_TREE_LUMA 또는 DUAL_TREE_CHROMA인 경우, 변수 numSigCoeff의 값이 1보다 클 때, 현재 블록에 2차 변환이 적용될 수 있고, lfnst_idx[x0][y0]는 파싱될 수 있다. 이때, numSigCoeff는 현재 코딩 유닛 내에 존재하는 유효 계수(significant coefficient)의 개수를 나타내는 변수를 의미한다. numSigCoeff가 임계 값보다 작을 때에는, 현재 블록에 2차 변환이 적용되더라도 효율적인 부호화가 이루어지지 않을 수 있다. 유효 계수(significant coefficient)의 개수가 적은 경우, 계수 코딩(coefficient coding)에 필요한 비트 대비 lfnst_idx[x0][y0]를 시그널링하는 오버헤드가 상대적으로 크기 때문일 수 있다. 이때 유효 계수(significant coefficient)는, 0이 아닌(non-zero) 계수를 의미할 수 있다. 이하 본 명세서에서 기술하는 유효 계수(significant coefficient)는, 상술한 바와 같이 0이 아닌(non-zero) 계수를 의미할 수 있다.
vii) numZeroOutSigCoeff==0
일곱 번째 조건은, 특정 위치에 존재하는 유효 계수(significant coefficeient)와 관련된 것이다.
구체적으로, 현재 블록에 2차 변환이 적용되는 경우, 디코더에서 양자화된 변환 계수는 특정 위치에서 항상 0일 수 있다. 따라서, 특정 위치에서 0이 아닌 (양자화) 계수가 존재하는 경우, 현재 블록에 2차 변환이 적용되지 않은 것이므로 특정 위치에서의 유효 계수(significant coefficient)의 개수에 따라 lfnst_idx[x0][y0]의 파싱 여부가 결정될 수 있다. 예를 들어, numZeroOutSigCoeff가 0이 아니면 특정 위치에 유효 계수(significant coefficient)가 존재하는 것을 의미하므로, lfnst_idx[x0][y0]는 파싱되지 않고 0으로 설정될 수 있다. 반면에, numZeroOutSigCoeff가 0이면, 특정 위치에 유효 계수(significant coefficient)가 존재하지 않는 것을 의미하므로, lfnst_idx[x0][y0]는 파싱될 수 있다.
도 16은 본 발명의 일 실시예에 따른 residual_coding 신택스 구조를 도시한 도면이다.
residual_coding 신택스 구조는 양자화 계수와 관련된 신택스 구조이고, x0, y0, log2TbWidth, log2TbHeight를 입력으로 받을 수 있다. 이때, x0, y0는 변환 블록의 좌-상단 좌표인 (x0, y0)를 의미하고, log2TbWidth는 변환 블록의 너비에 밑이 2인 로그를 취한 값이고, log2TbHeight는 변환 블록의 높이에 밑이 2인 로그를 취한 값을 의미할 수 있다. 변환 블록 내의 계수는 서브 블록 단위로 코딩될 수 있으며, 각각의 서브 블록 내의 계수 값은 sig_coeff_flag를 포함하는 여러 신택스 요소에 기초하여 결정될 수 있다. 이때, 서브 블록 단위의 계수는 계수 그룹(Coefficient Group, CG)이라 표현될 수도 있다. sig_coeff_flag[xC][yC]는 현재 변환 블록 내의 (xC, yC) 위치의 계수 값이 0인지 아닌지를 나타낼 수 있다. sig_coeff_flag[xC][yC]가 1일 경우, 해당 위치의 계수 값이 0이 아닌 값임을 나타낼 수 있고, sig_coeff_flag[xC][yC]가 0일 경우, 해당 위치의 계수 값이 0임을 나타내는 것일 수 있다. residual_coding에서는 스캔 순서 상 마지막 유효 계수(last significant coefficient)의 x 좌표 값, y 좌표 값이 지시될 수 있다. 스캔 순서 상 마지막 유효 계수(last significant coefficient)의 x 좌표 값, y 좌표 값에 기초하여 스캔 순서 상 마지막 유효 계수(last significant coefficient)를 포함하는 서브 블록의 인덱스 (lastSubBlock)가 결정될 수 있다. 상기 서브 블록의 인덱스 또한 스캔 순서에 기초하여 인덱싱될 수 있다. 상기 스캔 순서는 도 13에서 설명한 우상측 대각(up-right diagonal) 스캔 순서일 수 있다. 서브 블록 단위의 계수 코딩에서 계수의 위치(좌표 값)를 나타내는 인덱스 xC, yC는 서브 블록의 좌-상단 좌표 (xS<<log2SbW, yS<<log2SbH), 우상측 대각 스캔 순서(DiagScanOrder)에 기반하여 결정될 수 있다. 이때, xS, yS는 각각 수평 방향으로의 인덱스, 수직 방향으로의 인덱스를 나타낸다. log2SbW, log2SbH는 각각 서브 블록의 너비와 높이에 밑이 2인 로그를 취한 값일 수 있다.
sig_coeff_flag[xC][yC]의 값이 1이고, (즉, (xC, yC) 위치의 계수가 0이 아닌 경우), 현재 블록에 변환 스킵이 적용되지 않는 경우 (즉, !transform_skip_flag[x0][y0]), numSigCoeff가 카운팅(counting)될 수 있다. 변환 스킵이 적용될 때는, 2차 변환이 적용되지 않을 수 있으므로, lfnst_idx[x0][y0]의 파싱에 활용되는 numSigCoeff는 변환 스킵이 적용되지 않는 블록의 유효 계수의 개수를 카운팅(counting)할 수 있다.
또한, 도 15에서 설명한 바와 같이, 변환 블록에 2차 변환이 적용되면 변환 블록 내의 특정 영역에서는 유효 계수가 존재하지 않을 수 있다. 따라서 특정 영역 내에 존재하는 유효 계수의 개수(numZeroOutSigCoeff)를 numZeroOutSigCoeff 카운터(counter)가 카운팅(counting)하여, numZeroOutSigCoeff가 0이 아닌 경우에는 lfnst_idx[x0][y0]는 파싱되지 않을 수 있다. 구체적으로, 변환 블록에 2차 변환이 적용되었을 때, 유효 계수가 존재할 수 없는 영역은 변환 블록의 사이즈에 따라 결정될 수 있다.
예를 들어, 2차 변환이 적용되기 위해서는, 변환 블록의 사이즈가 4x4인 경우 (즉, log2TbWidth==2&&log2TbHeight==2), 변환 블록 내에서 스캔 순서 상 인덱스 [0, 7] 영역과 [8, 15] 영역을 구분하여, [0, 7] 영역에는 유효 계수가 존재할 수 있고, [8, 15] 영역에서는 유효 계수가 존재할 수 없다. 상기 4x4 변환 블록은 하나의 서브 블록을 포함할 수 있다. 따라서 변환 블록의 사이즈가 4x4인 경우, 스캔 위치가 8 이상이고 서브 블록의 인덱스가 0인 경우 (즉, n>=8&&i==0), 유효 계수의 개수가 카운팅(counting)될 수 있다. 이때, 스캔 순서는 우상측 대각(up-right diagonal) 스캔 순서일 수 있다.
또 다른 예로, 2차 변환이 적용되기 위해서는, 변환 블록의 사이즈가 8x8인 경우 (즉, log2TbWidth==3&&log2TbHeight==3), 변환 블록 내에서 첫 번째 서브 블록 내에만 유효 계수가 존재할 수 있고, 나머지 서브 블록들(예를 들어, 두 번째, 세 번째 서브블록)에는 유효 계수가 존재할 수 없다. 상기 첫 번째 서브 블록 내에서도 스캔 순서 상 인덱스 [0, 7] 영역에서는 유효 계수가 존재할 수 있으나, 인덱스 [8, 15] 영역에서는 유효 계수가 존재할 수 없다. 따라서 변환 블록의 사이즈가 8x8인 경우, 첫 번째 서브 블록에서 스캔 위치가 8 이상이거나 (즉, n>=8&&i==0) 스캔 위치가 첫 번째 서브블록을 제외한 나머지 서브 블록에 존재하는 경우 (예를 들어, 두 번째, 세 번째 서브 블록에 존재, i==1||i==2), 유효 계수의 개수가 카운팅(counting)될 수 있다.
마지막으로, 변환 블록의 사이즈가 8x8보다 큰 경우, 변환 블록 내에서 첫 번째 서브 블록 내에서만 유효 계수가 존재할 수 있고, 나머지 서브 블록들(예를 들어, 두 번째, 세 번째 서브 블록)에서는 유효 계수가 존재할 수 없다. 따라서, 서브 블록이 두 번째 또는 세 번째인 경우 (즉, i==1||i==2), 유효 계수의 개수가 카운팅(counting)될 수 있다. numZeroOutSigCoeff 카운터(counter)는 numSigCoeff 카운터(counter)와 마찬가지로, sig_coeff_flag[xC][yC]가 1이고, transform_skip_flag[x0][y0]가 0인 경우에만 유효 계수의 개수를 카운팅(counting)할 수 있다. 이때, 서브 블록은 도 13에서 설명한 우상측 대각 스캔 순서에 따라 인덱싱이 될 수 있다.
다시 말하면, 유효 계수(significant coefficient)가 존재할 수 없는 영역(특정 영역)에 0이 아닌 계수가 존재하게 되면 2차 변환이 수행되지 않은 것을 나타내므로, 특정 영역에 0이 아닌 계수가 존재하는지 여부를 확인하기 위해 유효 계수(significant coefficient)가 카운팅 되는 것이다.
도 17은 본 발명의 일 실시예에 따른 코딩 유닛 레벨에서 2차 변환을 지시하는 방법을 나타낸 도면이다.
도 15 및 도 16에서 설명한 것처럼, 2차 변환이 적용되는지 여부는 코딩 유닛 레벨에서 lfnst_idx[x0][y0] 신택스 요소로 지시될 수 있고, lfnst_idx[x0][y0]가 파싱되기 위해서는 두 개의 유효 계수 카운터(significant coefficient counter, 즉, numSigCoeff 카운터, numZeroOutSigCoeff 카운터)가 필요할 수 있다. 특히, numSigCoeff의 경우, numSigCoeff 카운터가 코딩 유닛 전체 영역 내에 존재하는 유효 계수(significant coefficient)의 개수를 카운팅(counting)해야하므로, 계수 코딩의 처리율(throughput)이 저하될 수 있다. 따라서 카운터(counter)의 개수를 줄이거나, 카운터(counter)를 사용하지 않는 방법이 필요하다.
도 17에서 나타내는 2차 변환 지시 방법은 numSigCoeff와 무관하게 lfnst_idx[x0][y0]를 파싱할 수 있는 방법이다. 다시 말하면, 도 15에서 기술한 조건 중, i), ii), iii), iv), v), vii)이 모두 만족되는 경우(모두 참인 경우), 디코더는 lfnst_idx[x0][y0]를 파싱할 수 있다. 또한, numSigCoeff의 값은 참조되지 않으므로 도 16에서 기술한 numSigCoeff 카운터(counter)의 동작은 수행되지 않을 수 있다.
이하 본 명세서에서는 스캔 순서 상 마지막 유효 계수(last significant coefficient)의 위치 정보에 기반하여, 2차 변환을 지시하는 방법에 대해 설명한다. 유효 계수(significant coefficient)의 개수가 적을 때와 마찬가지로, 스캔 순서 상 마지막 유효 계수(last significant coefficient)의 위치(스캔 인덱스)가 작은 경우, 2차 변환으로 인한 부호화 효율성이 낮을 수 있다. 따라서, 카운터(counter)를 사용하지 않고, 스캔 순서 상 마지막 유효 계수(last significant coefficient)의 위치 정보에 기초하여 2차 변환을 효율적으로 지시할 필요가 있다.
(제1 실시예)
도 18은 본 발명의 실시 예에 따른 코딩 유닛 레벨에서 2차 변환을 지시하는 방법을 나타낸 도면이다.
도 18은 numSigCoeff 카운터(counter) 대신, residual_coding에서 획득하는 스캔 순서 상 마지막 유효 계수(last significant coefficient)의 위치 정보를 이용하여 lfnst_idx[x0][y0]를 파싱하는 방법을 나타낸 도면이다.
도 18에 따르면 numSigCoeff 카운터(counter)는 사용되지 않으므로, numSigCoeff 값은 초기화될 필요가 없고, 스캔 순서 상 마지막 유효 계수(last significant coefficient)의 위치와 관련된 변수인 lfnstLastScanPos가 1로 초기화될 수 있다. lfnstLastScanPos 값이 1일 경우, 스캔 순서 상 마지막 유효 계수(significant coefficient)의 위치(스캔 인덱스)가 임계 값보다 작거나 블록 내의 변환 계수가 모두 0임을 나타낸다. 반대로, lfnstLastScanPos 값이 0일 경우, 블록 내에 유효 계수가 하나 이상 존재하며, 스캔 순서 상 마지막 유효 계수(last significant coefficient)의 위치(스캔 인덱스)가 임계 값 이상임을 나타낸다. 따라서, lfnstLastScanPos 값이 1이면 lfnst_idx[x0][y0]는 파싱되지 않고 lfnstLastScanPos 값이 0이면 lfnst_idx[x0][y0]는 파싱될 수 있다. 더하여, lfnst_idx[x0][y0]는 lfnstLastScanPos 값이 0이고, 도 15에서 설명한 조건 i), ii), iii), iv), v), vii)이 모두 만족되는 경우(모두 참인 경우) 파싱될 수도 있다.
다시 말하면, 현재 블록 내에 유효 계수 (significant coefficient)가 하나 이상 존재하며, 스캔 순서 상 마지막 유효 계수(last significant coefficient)의 위치(스캔 인덱스)가 임계 값 이상일 때, lfnst_idx[x0][y0]는 파싱될 수 있다. 이때, 후술하는 바와 같이 임계 값은 0 이상의 정수 일 수 있다. 예를 들어, 임계 값이 1이라고 가정하면, 스캔 순서 상 마지막 유효 계수(last significant coefficient)의 위치(스캔 인덱스)가 임계 값 이상이라는 것은, 유효 계수가 블록의 좌상단 이외의 위치에 존재한다는 의미일 수 있다. 즉, 유효 계수(significant coefficient)가 현재 블록에 존재하지 않거나 현재 블록의 좌상단에만 존재하는 경우를 제외한 나머지 경우, 즉, 현재 블록의 좌상단을 제외한 위치에 유효 계수(significant coefficient)가 존재하는 경우에만 lfnst_idx[x0][y0]는 파싱될 수 있다. 현재 블록의 좌상단을 제외한 위치에 유효 계수(significant coefficient)가 존재한다는 의미는, 'LfnstDConly ==0'으로 표현될 수도 있다. 본 명세서에서 설명하는, 블록의 좌상단은, 수평, 수직 좌표의 값이 (0, 0)임을 의미하는 것일 수 있고, 기 설정된 스캔 순서(예: 우상측 대각(up-right diagonal) 순서)에 따른 첫 번째 위치를 의미할 수 있고, 또는 DC로 지칭될 수도 있다.
도 19는 본 발명의 실시예에 따른 residual_coding 신택스 구조를 나타낸 도면이다.
도 19는 상술한 도 18에 따른 residual_coding 신택스 구조를 나타낸 것으로, residual_coding에서는 스캔 순서 상 마지막 유효 계수(last significant coefficient)의 x 좌표, y 좌표와 관련된 신택스 요소가 파싱되어, LastSignificantCoeffX, LastSignificantCoeffY 변수가 설정될 수 있다. LastSignificantCoeffX는 스캔 순서 상 마지막 유효 계수(last significant coefficient)의 x 좌표를 나타내며, LastSignificantCoeffY는 스캔 순서 상 마지막 유효 계수(last significant coefficient)의 y 좌표를 나타낸다. LastSignificantCoeffX, LastSignificantCoeffY에 기반하여 스캔 순서 상 마지막 유효 계수(last significant coefficient)의 스캔 인덱스인 lastScanPos 변수와 마지막 유효 계수(last significant coefficient)를 포함하는 서브 블록의 인덱스(lastSubBlock)는 결정될 수 있다. 이때, 도 16에서 설명한 바와 같이, 현재 블록에 2차 변환이 적용되는 경우에는 첫 번째 서브블록에만 유효 계수가 존재할 수 있다. 다시 말하면 유효 계수가 첫 번째 서브블록에만 존재하는 경우에 2차 변환이 적용될 수 있는 것이다.
예를 들어, 도 14(a)의 4x4 크기의 블록에서 LastSignificantCoeffX가 2이고 LastSignificantCoeffY가 3인 경우 lastScanPos는 13으로 결정될 수 있다. 4x4 크기의 블록은 하나의 서브 블록으로 구성될 수 있으므로 마지막 유효 계수(last significant coefficient)를 포함하는 서브블록의 인덱스(lastSubBlock)는 0으로 결정될 수 있다. 또 다른 예로, 도 14(b)의 8x8 크기의 블록은, 4x4 크기의 서브블록들로 나누어질 수 있다. 구체적으로, 도14(b)에서 x좌표 0 내지 3 및 y좌표 0 내지 3에 해당하는 4x4 블록은 첫 번째 서브블록으로, x좌표 0 내지 3 및 y좌표 4 내지 7에 해당하는 4x4 블록은 두 번째 서브블록으로, x좌표 4 내지 7 및 y좌표 0 내지 3에 해당하는 4x4 블록은 세 번째 서브블록으로, x좌표 4 내지 7 및 y좌표 4 내지 7에 해당하는 4x4 블록은 네 번째 서브블록으로 설정될 수 있다. 이때 첫 번째 서브블록은 인덱스 0, 두 번째 서브블록은 인덱스 1, 세 번째 서브블록은 인덱스 2, 네 번째 서브블록은 인덱스 3으로 인덱싱될 수 있다. 서브 블록은 도 13에서 설명한 우상측 대각 스캔 순서에 따라 인덱싱이 될 수 있다. 이때, LastSignificantCoeffX가 2이고 LastSignificantCoeffY가 3인 경우 lastScanPos는 13으로 결정될 수 있다. lastScanPos는 13이므로, lastScanPos 13을 포함하는 서브블록은 첫번째 서브블록(즉, 서브블록 인덱스 0)이므로 마지막 유효 계수(last significant coefficient)를 포함하는 서브 블록의 인덱스(lastSubBlock)는 0으로 결정될 수 있다.
상술한 lastScanPos에 기반하여, lfnstLastScanPos가 결정될 수 있다. 구체적으로, 변환 블록의 너비 및 높이가 4 이상이고, 변환 블록에 변환 스킵이 적용되지 않을 때, lfnstLastScanPos는 아래 수학식 1과 같이 설정될 수 있다. 다시 말하면 log2TbWidth>=2이고, log2TbHeight>=2이고, transform_skip_flag[x0][y0]가 0인 경우, lfnstLastScanPos는 아래 수학식 1과 같이 설정될 수 있다. 이때, transform_skip_flag[x0][y0]가 0이면 현재 변환 블록에 변환 스킵이 적용되지 않는 경우를 의미할 수 있다. 구체적으로, 본 명세서에서 설명하는 플래그 transform_skip_flag[x0][y0]는, 변환 블록에 1차 변환 및 2차 변환이 적용되는지 여부를 지시하는 것일 수 있다. 예를 들어, 상기 transform_skip_flag[x0][y0] 값이 1이면 변환 블록에 1차 변환 및 2차 변환이 적용되지 않음을 나타내고(즉, 변환 스킵이 적용됨), 상기 transform_skip_flag[x0][y0] 값이 0이면 변환 블록에 1차 변환 및 2차 변환이 적용될 수 있음을 나타낼 수 있다(즉, 변환 스킵이 적용되지 않음).
상술한 바와 같이 lfnstLastScanPos의 초기화 값은 1로 설정될 수 있다.
수학식 1에서 cIdx는 현재 변환 블록의 컬러 성분을 의미하는 변수를 나타낼 수 있다. 예를 들어, cIdx가 0인 경우 residual_coding에서 처리되는 변환 블록이 루마 Y 성분임을 나타낼 수 있다. cIdx가 1인 경우 residual_coding에서 처리되는 변환 블록이 크로마 Cb 성분임을 나타낼 수 있고, cIdx가 2인 경우 처리되는 변환 블록이 크로마 Cr 성분임을 나타낼 수 있다. lastScanPos에 대한 임계 값인 lfnstLastScanPosTh[cIdx]는 컬러 성분에 따라 다른 값으로 설정될 수 있다.
수학식 1에 따르면, 직전 lfnstLastScanPos가 1이고 lastScanPos가 lfnstLastScanPosTh[cIdx]보다 작은 경우, lfnstLastScanPos는 1로 업데이트될 수 있다. 한편, 직전 lfnstLastScanPos가 0이거나, lastScanPos가 lfnstScanPosTh[cIdx] 이상인 경우, lfnstLastScanPos는 0으로 업데이트될 수 있다. 다시 말하면 코딩 유닛이 포함하는 모든 변환 블록의 lastScanPos가 임계 값보다 작거나 모든 변환 블록의 계수가 모두 0인 경우, lfnstLastScanPos는 1로 결정될 수 있고, 도 18의 lfnst_idx[x0][y0] 파싱 조건에 따라, lfnst_idx[x0][y0]는 파싱되지 않고 0으로 설정될 수 있다. lfnst_idx[x0][y0]는 파싱되지 않고 0으로 설정된다는 것은 현재 블록에 2차 변환이 적용되지 않음을 나타낸다. 반면 코딩 유닛이 포함하는 변환 블록들 중 어느 하나라도 lastScanPos가 임계 값 이상일 경우, lfnstLastScanPos는 0으로 결정될 수 있고, 도 15에서 설명한 조건 i), ii), iii), iv), v), vii)이 모두 만족되는 경우(모두 참인 경우), 디코더는 lfnst_idx[x0][y0]를 파싱할 수 있다. 디코더는 lfnst_idx[x0][y0]를 파싱하여 현재 블록에 2차 변환이 적용되는지 여부를 확인할 수 있고, 2차 변환이 적용되는 경우, 2차 변환에 사용되는 변환 커널을 확인/결정할 수 있다.
수학식 1의 lfnstLastScanPosTh[cIdx]는 기 설정된 0 이상의 정수 값으로 인코더와 디코더가 모두 동일한 값을 사용할 수 있다. 또한, 모든 컬러 성분에 대해 동일한 임계 값이 사용될 수도 있다. 이 경우, lfnstLastScanPos는 아래 수학식 2와 같이 설정될 수 있다. 본 명세서에서 설명하는 코딩 유닛은 복수의 코딩 블록들로 구성될 수 있고, 각각의 코딩 블록들에 대응하는 변환 블록이 존재할 수 있다. 변환 블록은, 휘도, 색차 성분을 가지는 변환 블록일 수 있다. 구체적으로, Y 변환 블록, Cb 변환 블록, Cr 변환 블록일 수 있다. 이때, 본 명세서에서 설명하는 lfnst_idx[x0[y0]를 파싱할 것인지 여부는 상기 각각의 코딩 블록들에 대응하는 변환 블록마다 판단될 수 있다. 즉, Y 변환 블록, Cb 변환 블록, Cr 변환 블록 중 어느 하나의 변환 블록이라도 본 명세서에서 설명하는 조건들을 만족하는 경우, lfnst_idx[x0][y0]는 파싱될 수 있다.
lfnstLastScanPosTh는 기 설정된 0 이상의 정수 값으로 인코더와 디코더가 모두 동일한 값을 사용할 수 있다. 예를 들어, lfnstLastScanPosTh는 1일 수 있다. 즉, lastScanPos가 1 이상인 경우, lfnstLastScanPos는 0으로 업데이트 될 수 있고, lfnst_idx[x0][y0]는 파싱될 수 있다. 이때, 임계 값(lfnstLastScanPosTh)은 정수 값이므로, lastScanPos가 1 이상인 경우는 lastScanPos가 0보다 큰 경우와 동일한 의미일 수 있다. 본 발명의 하나의 예시로, 임계 값이 1인 경우에 대해서 설명하였으나, 본 발명이 이에 한정되는 것은 아니다.
다시 말하면, lastScanPos에 기초하여 lfnst_idx[x0][y0]를 파싱 여부가 결정될 수 있다. 구체적으로, 상술한 바와 같이 2차 변환이 적용되는 경우, 스캔 순서 상 마지막 유효 계수(last significant coefficient)는 변환 블록의 첫번째 서브블록에만 존재할 수 있다. 따라서, 스캔 순서 상 마지막 유효 계수(last significant coefficient)를 포함하는(lastScanPos가 나타내는 인덱스가 위치하는) 서브 블록의 인덱스(lastSubBlock)는 0이고, 변환 블록의 너비가 4 이상이고 (log2TbWidth>=2), 변환 블록의 높이가 4 이상이고 (log2TbHeight>=2), transform_skip_flag[x0][y0]가 0이고(변환 스킵이 적용되지 않고), lastScanPos가 0보다 큰 경우(lastScanPos가 1 이상인 경우) lfnst_idx[x0][y0]는 파싱될 수 있다. 이를 수학식으로 나타내면 아래 수학식 3과 같이 표현할 수 있다.
한편, 상술한 제1 실시예에서는 numSigCoeff 카운터(counter)를 lfnst_idx[x0][y0] 파싱에 이용하지 않으므로, 유효 계수(significant coefficient)의 개수 (numSigCoeff)는 카운팅(counting)되지 않을 수 있다.
(제2 실시예)
도 20은 본 발명의 또 다른 실시예에 따른 residual_coding 신택스 구조를 나타낸 도면이다.
도 20은, residual_coding은 도 19에 추가적으로 treeType 변수를 입력받고, treeType에 따라 lastScanPos에 대한 임계 값을 설정하는 방법을 나타낸 도면이다.
변환 블록의 너비 및 높이가 4 이상이고, 변환 블록에 변환 스킵이 적용되지 않을 때, lfnstLastScanPos는 아래 수학식 4와 같이 설정될 수 있다. 다시 말하면 log2TbWidth>=2이고, log2TbHeight>=2이고, transform_skip_flag[x0][y0]가 0인 경우, lfnstLastScanPos는 아래 수학식 4와 같이 설정될 수 있다. 이때, transform_skip_flag[x0][y0]가 0이면 현재 변환 블록에 변환 스킵이 적용되지 않는 경우를 의미할 수 있다.
수학식 4에서 lfnstLastScanPosTh는 lastScanPos에 대한 임계 값을 의미하고, treeType에 따라 값이 설정될 수 있다. treeType이 SINGLE_TREE, DUAL_TREE_LUMA, DUAL_TREE_CHROMA인 경우, lfnstLastScanPosTh는 각각 val1, val2, val3으로 설정될 수 있다. 직전 lfnstLastScanPos가 1이고 lastScanPos가 lfnstLastScanPosTh보다 작은 경우, lfnstLastScanPos는 1로 업데이트될 수 있다. 한편 직전 lfnstLastScanPos가 0이거나, lastScanPos가 lfnstScanPosTh 이상인 경우, lfnstLastScanPos는 0으로 업데이트될 수 있다.
수학식 4는 결과적으로, 코딩 유닛이 포함하는 모든 변환 블록의 lastScanPos가 임계 값보다 작거나 모든 변환 블록의 계수가 모두 0인 경우, lfnstLastScanPos는 1로 결정될 수 있고, 도 18의 lfnst_idx[x0][y0] 파싱 조건에 따라, lfnst_idx[x0][y0]는 파싱되지 않고 0으로 설정될 수 있다. 이는 현재 블록에 2차 변환이 적용되지 않음을 나타낸다. 한편 코딩 유닛이 포함하는 변환 블록들 중 어느 하나라도 lastScanPos가 임계 값 이상일 경우, lfnstLastScanPos는 0으로 결정될 수 있고, 도 15에서 설명한 i), ii), iii), iv), v), vii)이 모두 만족되는 경우(모두 참인 경우), 디코더는 lfnst_idx[x0][y0]를 파싱할 수 있다. 디코더는 lfnst_idx[x0][y0]를 파싱하여 현재 블록에 2차 변환이 적용되는지 여부를 확인할 수 있고, 2차 변환이 적용되는 경우, 2차 변환에 사용되는 변환 커널을 확인/결정할 수 있다.
val1, val2, val3은 기 설정된 0 이상의 정수 값으로 인코더와 디코더가 모두 동일한 값을 사용할 수 있다. treeType이 SINGLE_TREE인 경우, 루마, 크로마 성분을 모두 포함하므로, lfnstLastScanPosTh의 값인 val1은 val2와 val3의 합으로 표현될 수도 있다.
제2 실시예에서는 numSigCoeff 카운터(counter)를 lfnst_idx[x0][y0] 파싱에 이용하지 않으므로, 유효 계수(significant coefficient)의 개수 (numSigCoeff)는 카운팅(counting)되지 않을 수 있다.
(제3 실시예)
도 21은 본 발명의 또 다른 실시예에 따른 코딩 유닛 레벨에서 2차 변환을 지시하는 방법을 나타낸 도면이다.
도 21에 따르면, numSigCoeff 카운터(counter) 대신, residual_coding에서 획득되는 스캔 순서 상 마지막 유효 계수(last significant coefficient)의 위치 정보를 활용하여 lfnst_idx[x0][y0]가 파싱될 수 있다.
numSigCoeff 카운터(counter)가 사용되지 않으므로, numSigCoeff는 초기화될 필요가 없고, 스캔 순서 상 마지막 유효 계수(last significant coefficient)의 위치와 관련된 변수인 lfnstLastScanPos는 0으로 초기화될 수 있다. 도 21의 lfnstLastScanPos 변수는 코딩 유닛이 포함하는 변환 블록들의 lastScanPos를 더한 값일 수 있다. 이때, lfnstLastScanPos가 임계 값보다 크고, 도 15에서 설명한 조건 i), ii), iii), iv), v), vii)이 모두 만족되는 경우(모두 참인 경우), 디코더는 lfnst_idx[x0][y0]를 파싱할 수 있다. 디코더는 lfnst_idx[x0][y0]를 파싱하여 현재 블록에 2차 변환이 적용되는지 여부를 확인할 수 있고, 2차 변환이 적용되는 경우, 2차 변환에 사용되는 변환 커널을 확인/결정할 수 있다. 반면, lfnstLastScanPos가 임계 값 이하인 경우, lfnst_idx[x0][y0]는 파싱되지 않고 0으로 설정될 수 있다. 이는 2차 변환이 적용되지 않음을 나타낸다.
임계 값은 treeType에 따라 설정될 수 있다. treeType이 SINGLE_TREE, DUAL_TREE_LUMA, DUAL_TREE_CHROMA인 경우, 임계 값은 각각 Th1, Th2, Th3로 설정될 수 있다. Th1, Th2, Th3은 기 설정된 0 이상의 정수 값으로 인코더와 디코더가 모두 동일한 값을 사용할 수 있다. treeType이 SINGLE_TREE인 경우, 루마, 크로마 성분을 모두 포함하므로, 임계 값인 Th1은 Th2와 Th3의 합으로 표현될 수도 있다.
도 22는 본 발명의 또 다른 실시예에 따른 residual_coding 신택스 구조를 나타낸 도면이다.
도 22는 상술한 도 21에 따른 residual_coding 신택스 구조를 나타낸 것으로, 변환 블록의 너비 및 높이가 4 이상이고, 변환 블록에 변환 스킵이 적용되지 않을 때, lfnstLastScanPos는 아래 수학식 5와 같이 설정될 수 있다. 다시 말하면 log2TbWidth>=2이고, log2TbHeight>=2이고, transform_skip_flag[x0][y0]가 0인 경우, lfnstLastScanPos는 아래 수학식 5와 같이 설정될 수 있다. 이때, transform_skip_flag[x0][y0]가 0이면 현재 변환 블록에 변환 스킵이 적용되지 않는 경우를 의미할 수 있다.
위 수학식 5에서 lfnstLastScanPos는 코딩 유닛이 포함하는 변환 블록들의 lastScanPos를 모두 더한 값으로, 도 21에서 설명한 바와 같이 lfnstLastScanPos와 임계 값을 비교하여 lfnst_idx[x0][y0]의 파싱 여부가 결정될 수 있다.
제3 실시예에서는 numSigCoeff 카운터(counter)를 lfnst_idx[x0][y0] 파싱에 이용하지 않으므로, 유효 계수(significant coefficient)의 개수(numSigCoeff)는 카운팅(counting)되지 않을 수 있다.
한편, 코딩 유닛은 코딩 유닛과 동일한 사이즈를 루트 노드로 하여 변환 트리(transform tree)에 의해 분할되는 변환 유닛을 포함할 수 있다. 이때, 변환 유닛은 각각의 컬러 성분에 대한 변환 블록을 포함할 수 있다. 2차 변환이 코딩 유닛 레벨에서 지시되는 경우, 코딩 유닛이 포함하는 모든 변환 블록에 대하여 레지듀얼 코딩(residual coding)이 수행된 후, 계수 정보에 기반하여 lfnst_idx[x0][y0]가 파싱될 수 있다. 다른 실시예로 2차 변환은 변환 유닛 레벨에서 지시될 수도 있다. 2차 변환이 변환 유닛 레벨에서 지시되는 경우, 코딩 유닛이 포함하는 각각의 변환 유닛은 각기 다른 lfnst_idx[x0][y0]를 사용할 수 있다. 따라서, 인코더는 각각의 변환 유닛에 최적화된 lfnst_idx[x0][y0]를 찾을 수 있고 부호화 효율을 더욱 향상시킬 수 있다. 또한, 2차 변환이 코딩 유닛 레벨에서 지시되고, 코딩 유닛이 4개의 변환 유닛을 포함하는 경우, lfnst_idx[x0][y0]가 파싱되기 위해서는 4개의 변환 유닛이 포함하는 모든 변환 블록에 대한 레지듀얼 코딩(residual coding)이 처리되어야 한다. 즉, 디코더가 첫 번째 변환 유닛에 대해 레지듀얼 코딩(residual coding)을 통한 변환 계수를 획득하더라도, lfnst_idx[x0][y0] 값을 획득하지 못했기 때문에, 디코더는 첫 번째 변환 유닛에 대한 역변환을 수행할 수 없다. 이는 디코더의 버퍼 사이즈를 증가시킬 뿐만 아니라, 디코더에서 과도한 지연 시간을 초래할 수 있다.
도 18 내지 도 22에서 기술한 제1 실시예 내지 제3 실시예는, 2차 변환이 변환 유닛 레벨에서 지시되는 경우에도 적용될 수 있다. 2차 변환이 코딩 유닛 레벨에서 지시되는 경우, 제1 실시예 내지 제3 실시예에 따라 코딩 유닛이 포함하는 변환 블록들의 스캔 순서 상 마지막 유효 계수(last significant coefficient)의 위치에 기반하여, lfnst_idx[x0][y0]의 파싱 여부가 결정될 수 있다. 또한, 2차 변환이 변환 유닛 레벨에서 지시되는 경우, 제1 실시예 내지 제3 실시예에 따라, 변환 유닛이 포함하는 변환 블록들의 스캔 순서 상 마지막 유효 계수(last significant coefficient)의 위치에 기반하여 lfnst_idx[x0][y0]의 파싱 여부가 결정될 수 있다.
이하 본 명세서에서는, 2차 변환이 변환 유닛 레벨에서 지시되는 구체적인 방법에 대해 설명한다.
도 23은 본 발명의 실시예에 따른 변환 유닛 레벨에서 2차 변환을 지시하는 방법을 나타낸 도면이다.
도 23에 따르면, numSigCoeff 카운터(counter)대신, residual_coding에서 획득되는 스캔 순서 상 마지막 유효 계수(last significant coefficient)의 위치 정보를 이용하여 lfnst_idx[x0][y0]는 파싱될 수 있다.
먼저, residual_coding 수행 전에 스캔 순서 상의 마지막 유효 계수 위치와 관련된 변수인 lfnstLastScanPos는 1로 초기화될 수 있다. lfnstLastScanPos 변수가 1일 경우, 변환 유닛이 포함하는 모든 변환 블록들에 대하여 스캔 순서 상 마지막 유효 계수(last significant coefficient)의 위치(스캔 인덱스)가 임계 값보다 작거나 블록 내의 변환 계수가 모두 0임을 나타내는 것일 수 있다. lfnstLastScanPos 변수가 0일 경우, 변환 유닛이 포함하는 하나 이상의 변환 블록들에 대하여 블록 내에 유효 계수(significant coefficient)가 하나 이상 존재하며, 스캔 순서 상 마지막 유효 계수(last significant coefficient)의 위치(스캔 인덱스)가 임계 값 이상임을 나타내는 것일 수 있다. 상술한 제1 실시예에 따르면, 변환 블록의 스캔 순서 상 마지막 유효 계수(last significant coefficient)의 위치에 기반하여 설정되는 lfnstLastScanPos가 0이고, 후술하는 조건 i), ii), iii), iv), v), vi)이 모두 만족되는 경우(모두 참인 경우), 디코더는 lfnst_idx[x0][y0]를 파싱할 수 있다.
lfnst_idx[x0][y0] 신택스 요소 파싱 조건
i) Min(lfnstWidth, lfnstHeight)>=4
먼저 첫 번째 조건은, 블록 크기(사이즈)와 관련된 것으로, 블록의 너비 및 높이가 각각 4픽셀 이상일 때, 디코더는 lfnst_idx[x0][y0] 신택스 요소를 파싱할 수 있다.
구체적으로, 디코더는 2차 변환을 적용할 수 있는 블록 사이즈 조건을 검사할 수 있다. 변수 SubWidthC, SubHeightC는 컬러 포맷에 따라 설정되는 것으로, 각각 픽쳐의 루마 성분의 너비, 높이 대비 크로마 성분의 너비, 높이의 비를 나타낼 수 있다. 예를 들어, 4:2:0 컬러 포맷 영상은, 루마 샘플 4개 당 이에 상응하는 크로마 샘플 1개를 포함하는 구조이므로 SubWidthC와 SubHeightC는 모두 2로 설정될 수 있다. 다른 예로, 4:4:4 컬러 포맷 영상은, 루마 샘플 1개 당 이에 상응하는 크로마 샘플 1개를 포함하는 구조이므로 SubWidthC와 SubHeightC는 모두 1로 설정될 수 있다. 현재 블록의 수평 방향 샘플 수인 lfnstWidth, 수직 방향 샘플 수인 lfnstHeight는 SubWidthC, SubHeightC에 기반하여 설정될 수 있다. treeType이 DUAL_TREE_CHROMA인 경우, 변환 유닛은 크로마 성분만을 포함하므로, 크로마 변환 블록의 수평 방향 샘플 수는 루마 변환 블록의 너비인 tbWidth를 SubWidthC로 나눈 값과 같다. 마찬가지로, 크로마 변환 블록의 수직 방향 샘플 수는 루마 변환 블록의 높이인 tbHeight를 SubHeightC로 나눈 값과 같다. treeType이 SINGLE_TREE이거나 DUAL_TREE_LUMA인 경우, 변환 유닛은 루마 성분을 포함하므로 lnfnstWidth, lfnstHeight은 각각 tbWidth, tbHeight로 설정될 수 있다. 2차 변환이 적용될 수 있는 블록의 최소 조건은 4x4이므로, Min(lfnstWidth, lfnstHeight)>=4를 만족할 경우, lfnst_idx[x0][y0]는 파싱될 수 있다.
ii) sps_lfnst_enabled_flag==1
두 번째 조건은, 2차 변환의 활성화 또는 적용 가능 여부를 지시하는 플래그 값에 관한 것으로, 2차 변환의 활성화 또는 적용 가능 여부를 지시하는 플래그(sps_lfnst_enabled_flag) 값이 1로 설정되었을 때, 디코더는 lfnst_idx[x0][y0]를 파싱할 수 있다.
구체적으로, 2차 변환은 상위 레벨 신택스 RBSP에서 지시될 수 있다. SPS, PPS, VPS, 타일 그룹 헤더, 슬라이스 헤더 중의 적어도 하나에 2차 변환의 활성화 또는 적용 가능 여부를 지시하는 1-bit 크기를 가지는 플래그가 포함될 수 있다. sps_lfnst_enabled_flag가 1일 경우, 변환 유닛 신택스 내에 lfnst_idx[x0][y0] 신택스 요소가 존재함을 나타낸다. sps_lfnst_enabled_flag가 0일 경우, 변환 유닛 신택스 내에 lfnst_idx[x0][y0] 신택스 요소가 존재하지 않는 것을 나타낸다.
iii) CuPredMode[x0][y0]==MODE_INTRA
세 번째 조건은, 예측 모드에 관한 것으로, 2차 변환은 인트라 예측된 블록에만 적용될 수 있다. 따라서, 현재 블록이 인트라 예측된 블록인 경우, 디코더는 lfnst_idx[x0][y0]를 파싱할 수 있다.
iv) IntraSubPartitionsSplitType==ISP_NO_SPLIT
네 번째 조건은, ISP 예측 방법이 적용되는지 여부와 관련된 것으로, 현재 블록에 ISP가 적용되지 않을 때, 디코더는 lfnst_idx[x0][y0] 신택스 요소를 파싱할 수 있다.
구체적으로, 도 11을 참고하여 설명한 바와 같이, 현재 CU에 대하여 CU 크기보다 작은 다수의 변환 유닛으로 분할되는 경우, 분할된 변환 유닛에는 2차 변환이 적용되지 않을 수 있다. 이때, 2차 변환과 관련된 신택스 요소인 lfnst_idx[x0][y0]는 파싱되지 않고 0으로 설정될 수 있다. 현재 CU에 대하여 변환 트리(transform tree)가 CU 크기보다 작은 다수의 변환 유닛으로 분할되는 경우는 ISP 예측이 현재 코딩 유닛에 적용되는 경우를 포함할 수 있다. ISP 예측 방법은 현재 코딩 유닛에 인트라 예측이 적용되는 경우, 기 설정된 분할 방법에 따라 변환 트리(transform tree)를 CU 크기보다 작은 다수의 변환 유닛으로 분할하는 예측 방법일 수 있다. 코딩 유닛 레벨에서 ISP 예측 모드가 지시될 수 있고, 이에 기반하여 IntraSubPartitionsSplitType 변수가 설정될 수 있다. 이때, IntraSubPartitionsSplitType이 ISP_NO_SPLIT인 경우, 현재 블록에 ISP가 적용되지 않음을 나타낸다. 변환 유닛 레벨에서 예측 샘플을 생성하는 인트라 예측의 특성 상, 변환 트리(transform tree)를 분할하여 다수의 변환 유닛으로 분할하였을 때가 분할하지 않았을 때보다 예측의 정확도가 높아질 수 있다. 따라서 분할된 다수의 변환 유닛에 2차 변환이 적용되지 않더라도, 잔차 신호의 에너지가 효율적으로 압축(compaction)될 가능성이 높다.
v) !intra_mip_flag[x0][y0]
다섯 번째 조건은, 인트라 예측 방법에 관한 것으로, 현재 코딩 유닛 예측에 MIP(Matrix based Intra Predicition)가 적용되지 않는 경우, 디코더는 lfnst_idx[x0][y0] 신택스 요소를 파싱할 수 있다.
구체적으로, 인트라 예측의 한 방법으로 MIP (Matrix based Intra Prediction)가 사용될 수 있고, MIP의 적용 여부는 코딩 유닛 레벨에서 intra_mip_flag[x0][y0]로 지시될 수 있다. Intra_mip_flag[x0][y0]가 1인 경우, MIP가 현재 코딩 유닛의 예측에 적용됨을 나타낼 수 있고, 현재 블록 주변의 복원된 샘플들과 기 설정된 행렬의 곱으로 예측이 수행될 수 있다. MIP가 적용되면, 방향성 또는 무방향성 예측을 수행하는 일반적인 인트라 예측과는 다른 잔차 신호의 성질을 보이므로, MIP가 적용될 때에는 변환 블록에 2차 변환은 적용되지 않을 수 있다.
vi) numZeroOutSigCoeff==0
여섯 번째 조건은, 특정 위치에 존재하는 유효 계수(significant coefficient)와 관련된 것이다.
구체적으로, 현재 블록에 2차 변환이 적용되는 경우, 디코더에서 양자화된 변환 계수는 특정 위치에서 항상 0일 수 있다. 따라서, 특정 위치에서 0이 아닌 양자화 계수가 존재하는 경우, 2차 변환이 적용되지 않은 것이므로, 특정 위치에서의 유효 계수(significant coefficient)의 개수에 따라 lfnst_idx[x0][y0]는 파싱될 수 있다. 예를 들어, numZeroOutSigCoeff가 0이 아니면, 특정 위치에 유효 계수(significant coefficient)가 존재하는 것을 의미하므로, lfnst_idx[x0][y0]는 파싱되지 않고 0으로 설정될 수 있다. 반면에, numZeroOutSigCoeff가 0이면, 특정 위치에 유효 계수(significant coefficient)가 존재하지 않는 것을 의미하므로, lfnst_idx[x0][y0]는 파싱될 수 있다.
상술한 제1 실시예에 기초하여 현재 블록에 2차 변환이 적용되는지 여부가 변환 유닛 레벨에서 지시되는 경우, 도 19에서 설명한 residual_coding 방법을 따를 수 있다. 도 19에서 설명한 lfnstLastScanPos를 결정하는 수학식 1에 따라 변환 유닛이 포함하는 모든 변환 블록들의 lastScanPos가 임계 값보다 작거나 모든 변환 블록의 계수가 모두 0이면 lfnstLastScanPos는 1로 결정되고, lfnst_idx[x0][y0]는 파싱되지 않고 0으로 설정될 수 있다. 이는 현재 블록에 2차 변환이 적용되지 않음을 나타낸다. 반면, 변환 유닛이 포함하는 변환 블록들 중 어느 하나라도 lastScanPos가 임계 값 이상일 경우, lfnstLastScanPos는 0으로 결정될 수 있고, 도 23에서 설명한 조건 i), ii), iii), iv), v), vi)이 모두 만족되는 경우(모두 참인 경우), 디코더는 lfnst_idx[x0][y0]를 파싱할 수 있다. 디코더는 lfnst_idx[x0][y0]를 파싱하여, 현재 블록에 2차 변환이 적용되는지 여부를 확인할 수 있고, 2차 변환이 적용되는 경우, 2차 변환에 사용되는 변환 커널을 확인/결정할 수 있다.
상술한 제2 실시예에 기초하여 2차 변환이 적용되는지 여부가 변환 유닛 레벨에서 지시되는 경우, 도 23에서 기술하는 변환 유닛 신택스 구조가 적용될 수 있으며, 도 20에서 설명한 residual_coding 방법이 사용될 수 있다. 도 20에서 설명한 lfnstLastScanPos를 결정하는 수학식 4에 따라 변환 유닛이 포함하는 모든 변환 블록들의 lastScanPos가 임계 값보다 작거나 모든 변환 블록의 계수가 모두 0인 경우, lfnstLastScanPos는 1로 결정될 수 있고, lfnst_idx[x0][y0]는 파싱되지 않고 0으로 설정될 수 있다. 이는 현재 블록에 2차 변환이 적용되지 않음을 나타낸다. 한편, 변환 유닛이 포함하는 변환 블록들 중 하나라도 lastScanPos가 임계 값 이상일 경우, lfnstLastScanPos는 0으로 결정될 수 있고, 도 23에서 설명한 조건 i), ii), iii), iv), v), vi)이 모두 만족되는 경우(모두 참인 경우), 디코더는 lfnst_idx[x0][y0]를 파싱할 수 있다. 디코더는, lfnst_idx[x0][y0]를 파싱하여 현재 블록에 2차 변환이 적용되는지 여부를 확인할 수 있고, 2차 변환이 적용되는 경우, 2차 변환에 사용되는 변환 커널을 확인/결정할 수 있다.
도 24는 본 발명의 또 다른 실시예에 따른 변환 유닛 레벨에서 2차 변환을 지시하는 방법을 나타낸 도면이다.
상술한 제3 실시예에 따르면, numSigCoeff 카운터(counter) 대신, residual_coding에서 획득하는 스캔 순서 상 마지막 유효 계수(last significant coefficient)의 위치 정보를 활용하여 lfnst_idx[x0][y0]가 파싱될 수 있다.
residual_coding 수행 전에 스캔 순서 상 마지막 유효 계수(last significant coefficient)의 위치와 관련된 변수인 lfnstLastScanPos은 0으로 초기화될 수 있다. 변수 lfnstLastScanPos는 변환 유닛이 포함하는 변환 블록들의 lastScanPos를 더한 값일 수 있다. 이때, lfnstLastScanPos가 임계 값보다 크고, 도 23에서 설명한 조건 i), ii), iii), iv), v), vi)이 모두 만족되는 경우(모두 참인 경우), 디코더는 lfnst_idx[x0][y0]를 파싱할 수 있다. 디코더는 lfnst_idx[x0][y0]를 파싱하여 현재 블록에 2차 변환이 적용되는지 여부를 확인할 수 있고, 2차 변환이 적용되는 경우, 2차 변환에 사용되는 변환 커널을 확인/결정할 수 있다. 반면, lfnstLastScanPos가 임계 값 이하인 경우, lfnst_idx[x0][y0]는 파싱되지 않고 0으로 설정될 수 있다. 이는 2차 변환이 적용되지 않음을 나타낸다.
임계 값은 treeType에 따라 설정될 수 있다. treeType이 SINGLE_TREE, DUAL_TREE_LUMA, DUAL_TREE_CHROMA인 경우, 임계 값은 각각 Th1, Th2, Th3로 설정될 수 있다. Th1, Th2, Th3은 기 설정된 0 이상의 정수 값으로 인코더와 디코더가 모두 동일한 값을 사용할 수 있다. treeType이 SINGLE_TREE인 경우, 루마, 크로마 성분을 모두 포함하므로, 임계 값인 Th1은 Th2와 Th3의 합으로 표현될 수도 있다.
상술한 제3 실시예에 기초하여 2차 변환이 적용되는지 여부가 변환 유닛 레벨에서 지시되는 경우, 도 22에서 설명한 residual_coding 방법이 사용될 수 있다. 도 22에서 설명한 lfnstLastScanPos를 결정하는 수학식 5에 따라 변수 lfnstLastScanPos는 변환 유닛이 포함하는 변환 블록들의 lastScanPos를 모두 더한 값으로 설정될 수 있다. 그리고, lfnstLastScanPos와 임계 값을 비교하여 lfnst_idx[x0][y0]의 파싱 여부가 결정될 수 있다.
한편, 변환 유닛 레벨에서 2차 변환이 지시되는 경우, 코딩 유닛이 포함하는 변환 유닛들 간에는 상관 관계가 높을 수 있다. 이는 예측의 방법이 코딩 유닛 레벨에서 결정되기 때문이다. 따라서, 코딩 유닛이 포함하는 첫 번째 변환 유닛에서만 lfnst_idx[x0][y0]가 시그널링되고, 시그널링된 lfnst_idx[x0][y0]는 나머지 변환 유닛들과 공유될 수 있다. 즉, 변환 유닛의 인덱스를 나타내는 subTuIndex가 0인 경우에만 상술한 제1 실시예 내지 제3 실시예를 사용하여 lfnst_idx[x0][y0]가 파싱될 수도 있다. subTuIndex가 0보다 큰 경우에 이에 해당하는 변환 유닛들은 lfnst_idx[x0][y0]를 파싱하지 않고, 공유되는 첫 번째 변환 유닛의 lfnst_idx[x0][y0]의 값을 이용할 수 있다.
한편, 유효 계수(significant coefficient)를 카운팅하기 위한 카운터가 사용될 수 있지만, 디코더가 lfnst_idx[x0][y0]를 파싱할 것인지 여부는 변환 블록의 좌-상단 서브 블록 내에 존재하는 유효 계수(significant coefficient)만을 고려하여 결정될 수 있다. 이는 연산량을 감소시키기 위함이다.
한편, 2차 변환이 변환 유닛 레벨에서 지시되는 경우, 코딩 유닛 레벨에서 지시되는 경우보다 디코더의 지연 시간은 감소될 수 있지만, 또 다른 지연 시간이 발생할 수 있다. 예를 들어, 2차 변환이 변환 유닛 레벨에서 지시되더라도, 루마 변환 계수, Cb 변환 계수, Cr 변환 계수의 코딩이 모두 완료된 후에 2차 변환이 지시된다. 따라서, 루마 변환 계수의 코딩(처리)이 모두 완료되더라도, Cb 변환 계수 및 Cr 변환 계수의 코딩(처리)가 완료된 후에 루마 변환 계수에 대한 역변환 처리가 이루어질 수 있다. 이는 디코더의 또 다른 지연 시간을 초래한다.
이하 본 명세서에서는, 디코더의 지연 시간을 최소화할 수 있는 2차 변환 지시방법에 대해 설명한다.
(제4 실시예)
디코더의 지연 시간을 최소화할 수 있는 2차 변환 지시 방법의 일 예로, 2차 변환은 변환 유닛 레벨에서 지시되지만, 루마 변환 계수 코딩 이전에 2차 변환과 관련된 신택스 요소인 lfnst_idx[x0][y0]를 파싱하는 방법이 있을 수 있다. 따라서, 디코더는, Cb 변환 계수 및 Cr 변환 계수 코딩을 기다리지 않고, 루마 변환 계수 코딩이 완료 후, 즉시 루마 변환 계수에 대한 역변환 프로세스를 진행할 수 있다. 마찬가지로, 디코더는 Cb 변환 계수 코딩이 완료된 후, Cr 변환 계수 코딩을 기다리지 않고 즉시 Cb 변환 계수에 대한 역변환 프로세스를 진행할 수 있다. 이러한 2차 변환 지시 방법은 디코더의 지연 시간을 최소화하며, 파이프라인 문제를 해결할 수 있다.
도 25는 본 발명의 실시예에 따른 코딩 유닛 신택스를 나타낸 도면이다.
도 25를 살펴보면, 2차 변환은 변환 유닛 레벨에서 지시되므로, 2차 변환과 관련된 신택스인 lfnst_idx[x0][y0]는 코딩 유닛 레벨에서 파싱되지 않고, transform_tree에 의해 분할되는 변환 유닛 레벨에서 파싱될 수 있다.
도 26은 본 발명의 또 다른 실시예에 따른 변환 유닛 레벨에서 2차 변환을 지시하는 방법을 나타낸 도면이다.
도 26을 살펴보면, 2차 변환 지시 방법은 변환 유닛 레벨에서 지시될 수 있으며, 루마 및 크로마 변환 계수 코딩(residual_coding) 이전에 2차 변환과 관련된 신택스 요소인 lfnst_idx[x0][y0]가 먼저 파싱될 수 있다. 예를 들어, lfnst_idx[x0][y0]가 변환 계수 획득 이전에 먼저 파싱되는 경우, 각각의 컬러 성분 Y, Cb, Cr에 대한 계수 코딩이 완료되는 즉시, Y, Cb, Cr 변환 계수에 대한 역변환이 처리될 수 있다. 예를 들어, Y 성분에 대한 변환 계수 코딩이 완료되는 즉시 루마(Y) 변환 계수에 대한 역변환이 수행될 수 있다. 마찬가지로, Cb 성분에 대한 변환 계수 코딩(residual_coding)이 완료되는 즉시 Cb 변환 계수에 대한 역변환이 수행될 수 있으며, Cr 성분에 대한 변환 계수 코딩(residual_coding)이 완료되는 즉시 Cr 변환 계수에 대한 역변환이 수행될 수 있다.
lfnst_idx[x0][y0]가 Y, Cb, Cr에 대한 변환 계수 코딩(residual_coding) 이후에 파싱 되는 경우, Y에 대한 변환 계수 코딩(residual_coding)이 완료되더라도, Cb, Cr에 대한 변환 계수 코딩(residual_coding)이 완료/처리되지 않으면, Y 변환 계수에 대한 역변환은 수행/처리될 수 없다. 따라서, Y에 대한 변환 계수 코딩(residual_coding)이 완료되더라도, 다른 성분(Cb, Cr) 변환 계수 코딩(residual_coding)이 완료될 때까지 디코더는, Y 변환 계수에 대한 역변환을 수행할 수 없어, 불필요한 지연 시간이 발생한다는 문제가 있었다. 그러나, 상술한 바와 같이, lfnst_idx[x0][y0]가 변환 계수 코딩(residual_coding) 이전에 먼저 파싱된다면, 컬러 성분(Y, Cb, Cr)에 각각에 대한 변환 계수 코딩(residual_coding)이 완료된 직후, 컬러 성분 각각의 변환 계수에 대한 역변환이 수행될 수 있으므로, 디코더의 지연 시간이 최소화되는 효과가 있다.
transform_unit() 신택스 구조에서는, tu_cbf_luma[x0][y0], tu_cbf_cb[x0][y0], tu_cbf_cr[x0][y0], transform_skip_flag[x0][y0] 등이 파싱될 수 있다.
구체적으로, tu_cbf_luma[x0][y0]는 현재 루마 변환 블록이 0이 아닌 변환 계수를 하나 이상 포함하는지 여부를 나타내는 요소이다. tu_cbf_luma[x0][y0]가 1이면, 현재 루마 변환 블록이 0이 아닌 변환 계수를 하나 이상 포함하는 것을 나타낼 수 있다. tu_cbf_luma[x0][y0]가 0이면, 현재 루마 변환 블록의 변환 계수가 모두 0임을 나타낼 수 있다. tu_cbf_cb[x0][y0]는 현재 크로마 Cb 변환 블록이 0이 아닌 변환 계수를 하나 이상 포함하는지를 나타내는 요소이다. tu_cbf_cb[x0][y0]가 1이면, 현재 크로마 Cb 변환 블록이 0이 아닌 변환 계수를 하나 이상 포함하는 것을 나타낼 수 있다. tu_cbf_cb[x0][y0]가 0이면, 현재 Cb 변환 블록의 변환 계수가 모두 0임을 나타낼 수 있다. tu_cbf_cr[x0][y0]는 현재 크로마 Cr 변환 블록이 0이 아닌 변환 계수를 하나 이상 포함하는지를 나타내는 요소이다. tu_cbf_cr[x0][y0]가 1이면, 현재 크로마 Cr 변환 블록이 0이 아닌 변환 계수를 하나 이상 포함하는 것을 나타낼 수 있다. tu_cbf_cr[x0][y0]이 0이면, 현재 크로마 Cr 변환 블록의 변환 계수가 모두 0임을 나타낼 수 있다. transform_skip_flag[x0][y0]는 변환 스킵과 관련된 신택스 요소이다. transform_skip_flag[x0][y0]가 1이면, 루마 변환 블록에 역변환이 적용되지 않음을 나타낼 수 있다. transform_skip_flag[x0][y0]가 0이면, 루마 변환 블록에 역변환이 적용되는지 여부는 다른 신택스 요소에 의해 결정되는 것임을 나타낼 수 있다.
도 26에 따른, 2차 변환 지시 방법의 일 실시예로 0이 아닌 변환 계수(significant coefficient)의 개수에 기반하는 것이 아닌, 스캔 순서 상 마지막 유효 계수(last significant coefficient)의 위치에 기반하여 2차 변환과 관련된 신택스 요소인 lfnst_idx[x0][y0]가 파싱될 수 있다.
먼저, lfnstLastScanPos 변수는 1로 초기화되어 설정될 수 있다. 변수 lfnstLastScanPos는, 도 23에서 설명한 바와 같이, 현재 변환 유닛이 포함하는 변환 블록의 스캔 순서 상 마지막 유효 계수(last significant coefficient)의 위치 정보를 나타낼 수 있다. 구체적으로, lfnstLastScanPos가 1일 경우, 변환 유닛이 포함하는 모든 변환 블록들에 대하여 스캔 순서 상 마지막 유효 계수(last significant coefficient)의 위치(스캔 인덱스)가 임계 값보다 작거나 블록 내의 변환 계수가 모두 0임을 나타낼 수 있다. lfnstLastScanPos가 0일 경우, 변환 유닛이 포함하는 하나 이상의 변환 블록들에 대하여 블록 내에 유효 계수(significant coefficient)가 하나 이상 존재하며, 스캔 순서 상 마지막 유효 계수(last significant coefficient)의 위치 (스캔 인덱스)가 임계 값 이상임을 나타낸다.
다음으로, 변수 numZeroOutSigCoeff는 0으로 초기화되어 설정될 수 있다. 변환 블록에 2차 변환이 적용되는 경우, 스캔 순서 상의 특정 위치에서는 유효 계수(significant coefficient)가 존재할 수 없다. 따라서, 변수 numZeroOutSigCoeff는 특정 위치에 유효 계수(significant coefficient)가 존재하는지를 나타내고, 이에 기초하여 2차 변환이 적용되는지 여부가 확인될 수 있다. 예를 들어, 변환 블록에 2차 변환이 적용될 때, 최대 16개의 유효 계수(significant coefficient)만이 허용된다고 가정한다. 4x4, 8x8 크기의 변환 블록에는 스캔 순서 상 인덱스 [0, 7] 영역에 유효 계수(significant coefficient)가 존재할 수 있다(최대 8개의 0이 아닌 변환 계수를 허용). 한편, 4x4, 8x8 이외의 크기를 가지는 변환 블록에는 스캔 순서 상 인덱스 [0, 15] 영역에 유효 계수(significant coefficient)가 존재할 수 있다(최대 16개의 0이 아닌 변환 계수를 허용). 따라서, 스캔 순서 상 마지막 유효 계수(last significant coefficient)의 위치(스캔 인덱스)가 상술한 유효 계수(significant coefficient)가 존재할 수 있는 영역 이외에 존재한다면, 디코더는, 현재 변환 블록에 2차 변환이 적용되지 않음을 자명하게 인식할 수 있다.
스캔 순서 상 마지막 유효 계수 (last significant coefficient)의 위치(스캔 인덱스)에 기반하여, 계수 코딩(residual_coding) 이전에 2차 변환과 관련된 신택스 요소인 lfnst_idx[x0][y0]의 파싱 여부가 결정될 수 있다. 따라서, 디코더는 계수 코딩(residual_coding) 이전에 스캔 순서 상 마지막 유효 계수(last significant coefficient)의 위치와 관련된 정보를 처리할 수 있다.
구체적으로, 현재 루마 변환 블록이 유효 계수(significant coefficient)를 하나 이상 포함하고(tu_cbf_luma[x0][y0] == 1), 현재 루마 변환 블록에 변환 스킵이 적용되지 않는 경우(transform_skip_flag[x0][y0] == 0 ), 루마의 스캔 순서 상 마지막 유효 계수(last significant coefficient)의 위치와 관련된 신택스 구조인 last_significant_pos가 처리될 수 있다.
tu_cbf_luma[x0][y0] 값이 0인 경우(tu_cbf_luma[x0][y0] == 0), 해당 변환 블록의 모든 계수가 0임을 나타내므로, 이는 계수 코딩(residual_coding)이 수행되지 않음을 나타낸다. 따라서, 스캔 순서 상 마지막 유효 계수(last significant coefficient)의 위치 정보에 대한 처리는 수행될 필요가 없다.
transform_skip_flag[x0][y0] 값이 1인 경우, 현재 루마 변환 블록에 역변환이 적용되지 않음을 나타낼 수 있다. 따라서, 계수 코딩(residual_coding)은 스캔 순서 상 마지막 유효 계수(last significant coefficient)의 위치 정보에 기반하지 않고 수행될 수 있다.
현재 크로마 Cb 변환 블록이 유효 계수(significant coefficient)를 하나 이상 포함하는 경우(tu_cbf_cb[x0][y0] == 1), 크로마 Cb 변환 블록의 스캔 순서 상 0이 아닌 마지막 계수(last significant coefficient)의 위치와 관련된 신택스 구조인 last_significant_pos가 처리될 수 있다. last_significant_pos 신택스 구조는 변환 블록의 좌-상단 좌표인 (x0, y0)와, 변환 블록의 너비에 밑이 2인 log 연산을 취한 값, 변환 블록의 높이에 밑이 2인 log 연산을 취한 값 및 변환 블록이 어떤 컬러 성분인지를 나타내는 변수인 cIdx를 입력으로 받을 수 있다. 예를 들어, cIdx가 0인 경우, 루마 Y 변환 블록을 나타낼 수 있으며, cIdx가 1인 경우 크로마 Cb 변환 블록, cIdx가 2인 경우 크로마 Cr 변환 블록을 나타낼 수 있다. tu_cbf_cb[x0][y0] 값이 0인 경우(tu_cbf_cb[x0][y0] == 0), 해당 변환 블록의 모든 계수가 0임을 나타낸다. 이는 계수 코딩(residual_coding)이 수행되지 않음을 의미하므로, 스캔 순서 상 0이 아닌 마지막 계수(last significant coefficient)의 위치 정보에 대한 처리는 수행될 필요가 없다.
한편, 현재 크로마 Cr 변환 블록이 유효 계수(significant coefficient)를 하나 이상 포함하는 경우 (tu_cbf_cr[x0][y0] == 1), last_significant_pos 처리 이전에 크로마 Cb와 Cr을 하나의 잔차 신호로 표현하는지 여부를 지시하는 신택스 요소인 tu_joint_cbcr_residual[x0][y0]가 파싱될 수 있다. 예를 들어, tu_joint_cbcr_residual[x0][y0]가 1인 경우, Cr에 대한 계수 코딩(residual_coding)은 처리되지 않고, Cr에 대한 잔차 신호는, Cb의 복원된 잔차 신호로부터 유도될 수 있다. 반면, tu_joint_cbcr_residual[x0][y0]가 0인 경우, tu_cbf_cr[x0][y0]의 값에 따라 Cr에 대한 계수 코딩(residual_coding)이 수행될 수 있다. 현재 크로마 Cr 변환 블록이 유효 계수(significant coefficient)를 하나 이상 포함하는 경우(tu_cbf_cr[x0][y0] == 1), 크로마 Cr의 스캔 순서 상 마지막 유효 계수(last significant coefficient)의 위치와 관련된 신택스 구조인 last_significant_pos가 처리될 수 있다. tu_cbf_cr[x0][y0] 값이 0인 경우(tu_cbf_cr[x0][y0] == 0), 크로마 Cr 변환 블록의 모든 계수가 0임을 나타낸다. 이는 계수 코딩(residual_coding)이 수행되지 않는다는 것을 의미하므로, 스캔 순서 상 0이 아닌 마지막 계수(last significant coefficient)의 위치 정보에 대한 처리는 수행될 필요가 없다.
각각의 컬러 성분에 대한 last_significant_pos의 처리가 수행됨에 따라, 각각의 컬러 성분에 대한 스캔 순서 상 마지막 유효 계수(last significant coefficient)의 위치 (스캔 인덱스)를 획득되고, 이에 기반하여 lfnstLastScanPos 및 numZeroOutSigCoeff 값은 업데이트 될 수 있다.
그리고, 후술하는 조건 i), ii), iii), iv), v), vi), vii)이 모두 만족되는 경우(모두 참인 경우), 디코더는 계수 코딩(residual_coding) 이전에 lfnst_idx[x0][y0]를 파싱할 수 있다.
계수 코딩(residual_coding) 이전 lfnst_idx[x0][y0] 신택스 요소 파싱 조건
i) Min(lfnstWidth, lfnstHeight)>=4
먼저 첫 번째 조건은, 블록 크기(사이즈)와 관련된 것으로, 블록의 너비 및 높이가 각각 4픽셀 이상일 때, 디코더는 lfnst_idx[x0][y0] 신택스 요소를 파싱할 수 있다.
구체적으로, 디코더는 2차 변환을 적용할 수 있는 블록 사이즈 조건을 검사할 수 있다. 변수 SubWidthC, SubHeightC는 컬러 포맷에 따라 설정되는 것으로, 각각 픽쳐의 루마 성분의 너비, 높이 대비 크로마 성분의 너비, 높이의 비를 나타낼 수 있다. 예를 들어, 4:2:0 컬러 포맷 영상은, 루마 샘플 4개 당 이에 상응하는 크로마 샘플 1개를 포함하는 구조이므로 SubWidthC와 SubHeightC는 모두 2로 설정될 수 있다. 다른 예로, 4:4:4 컬러 포맷 영상은, 루마 샘플 1개 당 이에 상응하는 크로마 샘플 1개를 포함하는 구조이므로 SubWidthC와 SubHeightC는 모두 1로 설정될 수 있다. 현재 블록의 수평 방향 샘플 수인 lfnstWidth, 수직 방향 샘플 수인 lfnstHeight는 SubWidthC, SubHeightC에 기반하여 설정될 수 있다. treeType이 DUAL_TREE_CHROMA인 경우, 변환 유닛은 크로마 성분만을 포함하므로, 크로마 변환 블록의 수평 방향 샘플 수는 루마 변환 블록의 너비인 tbWidth를 SubWidthC로 나눈 값과 같다. 마찬가지로, 크로마 변환 블록의 수직 방향 샘플 수는 루마 변환 블록의 높이인 tbHeight를 SubHeightC로 나눈 값과 같다. treeType이 SINGLE_TREE이거나 DUAL_TREE_LUMA인 경우, 변환 유닛은 루마 성분을 포함하므로 lnfnstWidth, lfnstHeight은 각각 tbWidth, tbHeight로 설정될 수 있다. 2차 변환이 적용될 수 있는 블록의 최소 조건은 4x4이므로, Min(lfnstWidth, lfnstHeight)>=4를 만족할 경우, lfnst_idx[x0][y0]는 파싱될 수 있다.
ii) sps_lfnst_enabled_flag==1
두 번째 조건은, 2차 변환의 활성화 또는 적용 가능 여부를 지시하는 플래그 값에 관한 것으로, 2차 변환의 활성화 또는 적용 가능 여부를 지시하는 플래그(
sps_lfnst_enabled_flag) 값이 1로 설정되었을 때, 디코더는 lfnst_idx[x0][y0]를 파싱할 수 있다.
구체적으로, 2차 변환은 상위 레벨 신택스 RBSP에서 지시될 수 있다. SPS, PPS, VPS, 타일 그룹 헤더, 슬라이스 헤더 중의 적어도 하나에 2차 변환의 활성화 또는 적용 가능 여부를 지시하는 1-bit 크기를 가지는 플래그가 포함될 수 있다. sps_lfnst_enabled_flag가 1일 경우, 변환 유닛 신택스 내에 lfnst_idx[x0][y0] 신택스 요소가 존재함을 나타낼 수 있고, sps_lfnst_enabled_flag가 0일 경우, 변환 유닛 신택스 내에 lfnst_idx[x0][y0] 신택스 요소가 존재하지 않음을 나타낼 수 있다.
iii) CuPredMode[x0][y0]==MODE_INTRA
세 번째 조건은, 예측 모드에 관한 것으로, 2차 변환은 인트라 예측된 블록에만 적용될 수 있다. 따라서, 현재 블록이 인트라 예측된 블록인 경우, 디코더는 lfnst_idx[x0][y0]를 파싱할 수 있다.
iv) IntraSubPartitionsSplitType==ISP_NO_SPLIT
네번째 조건은, ISP 예측 방법이 적용되는지 여부와 관련된 것으로, 현재 블록에 ISP가 적용되지 않을 때, 디코더는 lfnst_idx[x0][y0] 신택스 요소를 파싱할 수 있다.
구체적으로, 도 11을 참고하여 설명한 바와 같이, 현재 CU에 대하여 CU 크기보다 작은 다수의 변환 유닛으로 분할되는 경우, 분할된 변환 유닛에는 2차 변환이 적용되지 않을 수 있다. 이때, 2차 변환과 관련된 신택스 요소인 lfnst_idx[x0][y0]는 파싱되지 않고 0으로 설정될 수 있다. 현재 CU에 대하여 변환 트리(transform tree)가 CU 크기보다 작은 다수의 변환 유닛으로 분할되는 경우는 ISP 예측이 현재 코딩 유닛에 적용되는 경우를 포함할 수 있다. ISP 예측 방법은 현재 코딩 유닛에 인트라 예측이 적용되는 경우, 기 설정된 분할 방법에 따라 변환 트리(transform tree)를 CU 크기보다 작은 다수의 변환 유닛으로 분할하는 예측 방법일 수 있다. 코딩 유닛 레벨에서 ISP 예측 모드가 지시될 수 있고, 이에 기반하여 IntraSubPartitionsSplitType 변수가 설정될 수 있다. IntraSubPartitionsSplitType이 ISP_NO_SPLIT인 경우, 현재 블록에 ISP가 적용되지 않음을 나타낸다. 변환 유닛 레벨에서 예측 샘플을 생성하는 인트라 예측의 특성 상, 변환 트리(transform tree)를 분할하여 다수의 변환 유닛으로 분할하였을 때가 분할하지 않았을 때보다 예측의 정확도가 높아질 수 있다. 따라서, 분할된 다수의 변환 유닛에 2차 변환이 적용되지 않더라도, 잔차 신호의 에너지가 효율적으로 압축(compaction)될 가능성이 높다.
v) !intra_mip_flag[x0][y0]
다섯 번째 조건은, 인트라 예측 방법에 관한 것으로, 현재 코딩 유닛 예측에 MIP(Matrix based Intra Predicition)가 적용되지 않는 경우, 디코더는 lfnst_idx[x0][y0] 신택스 요소를 파싱할 수 있다.
구체적으로, 인트라 예측의 한 방법으로 MIP (Matrix based Intra Prediction)가 사용될 수 있고, MIP의 적용 여부는 코딩 유닛 레벨에서 intra_mip_flag[x0][y0]로 지시될 수 있다. Intra_mip_flag[x0][y0]가 1인 경우, MIP가 현재 코딩 유닛의 예측에 적용됨을 나타낼 수 있고, 현재 블록 주변의 복원된 샘플들과 기 설정된 행렬의 곱으로 예측이 수행될 수 있다. MIP가 적용되면, 방향성 또는 무방향성 예측을 수행하는 일반적인 인트라 예측과는 다른 잔차 신호의 성질을 보이므로, MIP가 적용될 때에는 변환 블록에 2차 변환이 적용되지 않을 수 있다.
vi) lfnstLastScanPos == 0
여섯 번째 조건은, 변환 블록의 스캔 순서 상 마지막 유효 계수(last significant coefficient)와 관련된 것이다.
구체적으로, 현재 변환 유닛이 포함하는 변환 블록의 스캔 순서 상 마지막 유효 계수(last significant coefficient)의 위치 정보 (스캔 인덱스)가 기 설정된 임계 값보다 작은 경우, 2차 변환으로 얻을 수 있는 부호화 효율 이득이 적을 가능성이 높다. 따라서 이러한 경우에는 인코더는 변환 블록에 2차 변환을 적용하지 않을 가능성이 높고(lfnst_idx[x0][y0]는 0), 따라서 인코더가 lfnst_idx[x0][y0]를 시그널링하는 것은 오버헤드가 크다고 볼 수 있다. 따라서, 변환 유닛이 포함하는 변환 블록 중 적어도 하나의 변환 블록에 대하여 스캔 순서 상 마지막 유효 계수(last significant coefficient)의 위치(스캔 인덱스)가 기 설정된 임계 값 이상인 경우에만 lfnst_idx[x0][y0]는 파싱될 수 있다.
다시 말하면, 상술한 바와 같이 임계 값은 0 이상의 정수 일 수 있다. 예를 들어, 임계 값이 1이라고 가정하면, 스캔 순서 상 마지막 유효 계수(last significant coefficient)의 위치(스캔 인덱스)가 임계 값 이상이라는 것은, 유효 계수가 블록의 좌상단(스캔 인덱스 0, DC)이외의 위치에 존재한다는 의미일 수 있다. 이때, 변환 블록의 스캔 순서 상 마지막 유효 계수(last significant coefficient)의 위치가 임계 값 이상이라는 것은, 'lfnstLastScanPos == 0'으로 표현될 수도 있다.
vii) numZeroOutSigCoeff == 0
일곱 번째 조건은, 특정 위치에 존재하는 유효 계수(significant coefficient)와 관련된 것이다.
구체적으로, 현재 블록에 2차 변환이 적용되는 경우, 스캔 위치 상 특정 위치에서는 유효 계수(significant coefficient)가 존재할 수 없다. 즉, numZeroOutSigCoeff 변수는 특정 위치에 0이 아닌 변환 계수가 존재하는지 여부를 나타낸다. 예를 들어, 현재 블록에 2차 변환이 적용될 때, 최대 16개의 유효 계수(significant coefficient)만이 허용된다고 가정한다. 4x4, 8x8 크기의 변환 블록에는 스캔 순서 상 인덱스 [0, 7] 영역에 유효 계수(significant coefficient)가 존재할 수 있다(최대 8개의 0이 아닌 변환 계수를 허용). 한편, 4x4, 8x8 이외의 크기를 가지는 변환 블록에는 스캔 순서 상 인덱스 [0, 15] 영역에 유효 계수(significant coefficient)가 존재할 수 있다(최대 16개의 0이 아닌 변환 계수를 허용). 따라서, 스캔 순서 상 마지막 유효 계수(last significant coefficient)의 위치(스캔 인덱스)가 상술한 유효 계수(significant coefficient)가 존재할 수 있는 영역 이외에 존재한다면, 디코더는, 현재 블록에 2차 변환이 적용되지 않음을 자명하게 인식할 수 있다. 따라서, numZeroOutSigCoeff > 0인 경우, 현재 블록에 2차 변환이 적용되지 않는 것이므로, lfnst_idx[x0][y0]는 파싱되지 않고, 0으로 설정될 수 있다.
다시 말하면, numZeroOutSigCoeff가 0이 아니면, 특정 위치에 유효 계수(significant coefficient)가 존재하는 것을 의미하므로, lfnst_idx[x0][y0]는 파싱되지 않고 0으로 설정될 수 있다. 반면에, numZeroOutSigCoeff가 0이면, 특정 위치에 유효 계수(significant coefficient)가 존재하지 않는 것을 의미하므로, lfnst_idx[x0][y0]는 파싱될 수 있다.
상술한 조건 i) 내지 vii)이 모두 참인 경우, lfnst_idx[x0][y0]는 파싱될 수 있고, 그렇지 않은 경우에는 lfnst_idx[x0][y0]를 파싱되지 않고 0으로 설정될 수 있다.
도 27은 본 발명의 실시 예에 따른 스캔 순서 상 마지막 유효 계수(last significant coefficient)의 위치와 관련된 신택스 구조를 나타낸다.
도 27을 살펴보면, last_significant_pos 신택스 구조는 각각의 컬러 성분 Y, Cb, Cr 변환 블록에 대한 스캔 순서 상 마지막 유효 계수(last significant coefficient)의 위치 정보를 포함하는 신택스 구조를 의미한다. 그리고, last_significant_pos 신택스 구조는 변환 블록의 좌-상단 좌표인 (x0, y0), 변환 블록의 너비에 밑이 2인 log를 취한 log2TbWidth, 변환 블록의 높이에 밑이 2인 log를 취한 log2TbHeight 및 변환 블록의 컬러 성분을 나타내는 cIdx를 입력으로 받을 수 있다. cIdx가 0인 경우, 루마 변환 블록을, cIdx가 1인 경우 크로마 Cb 변환 블록을, cIdx가 2인 경우 크로마 Cr 변환 블록을 나타낼 수 있다.
last_significant_pos 신택스 구조에서는 스캔 순서 상 마지막 유효 계수(last significant coefficient)의 위치 정보와 관련된 신택스 요소가 파싱될 수 있다. 구체적으로, 스캔 순서 상 마지막 유효 계수 (last significant coefficient)의 x좌표 값, y좌표 값과 관련된 신택스 요소가 파싱될 수 있다. 이때, 각각의 좌표 값은 프리픽스(prefix) 정보와 서픽스(suffix) 정보로 분할되어 지시될 수 있다. 디코더는 x좌표에 대한 프리픽스(prefix) 정보와 서픽스(suffix) 정보에 기반하여 스캔 순서 상 마지막 유효 계수(last significant coefficient)의 x좌표인 LastSignificantCoeffX 변수를 설정할 수 있다. 마찬가지로, 디코더는 y좌표에 대한 프리픽스(prefix) 정보와 서픽스(suffix) 정보에 기반하여 스캔 순서 상 마지막 유효 계수(last significant coefficient)의 y좌표인 LastSignificantCoeffY 변수를 설정할 수 있다. 디코더는 도 27에 나타난 바와 같이, do{ } while() 구조에서 LastSignificantCoeffX, LastSignificantCoeffY, DiagScanOrder에 기반하여 스캔 순서 상 마지막 유효 계수(last significant coefficient)의 스캔 인덱스인 lastScanPos를 설정할 수 있다. 또한, 디코더는 lastScanPos에 기반하여, 2차 변환과 관련된 신택스 요소인 lfnst_idx[x0][y0] 파싱 조건에 활용되는 변수인 numZeroOutSigCoeff와 lfnstLastScanPos를 업데이트할 수 있다.
현재 블록에 2차 변환이 적용되는 경우, 스캔 위치 상 특정 위치에서는 유효 계수가 존재할 수 없다. numZeroOutSigCoeff 변수는 이러한 위치에서 0이 아닌 변환 계수가 존재하는지를 나타낸다. 예를 들어, 현재 블록에 2차 변환이 적용될 때, 최대 16개의 유효 계수(significant coefficient)만이 허용된다고 가정한다. 4x4, 8x8 크기의 변환 블록에는 스캔 순서 상 인덱스 [0, 7] 영역에 유효 계수(significant coefficient)가 존재할 수 있다(최대 8개의 0이 아닌 변환 계수를 허용). 한편, 4x4, 8x8 이외의 크기를 가지는 변환 블록에는 스캔 순서 상 인덱스 [0, 15] 영역에 유효 계수(significant coefficient)가 존재할 수 있다(최대 16개의 0이 아닌 변환 계수를 허용). 따라서, 스캔 순서 상 마지막 유효 계수(last significant coefficient)의 위치(스캔 인덱스)가 상술한 유효 계수(significant coefficient)가 존재할 수 있는 영역 이외에 존재한다면, 디코더는, 현재 블록에 2차 변환이 적용되지 않음을 자명하게 인식할 수 있다. 2차 변환이 적용될 수 있는 블록의 최소 사이즈는 4x4이고, 변환 스킵이 적용되는 경우(transform_skip_flag[x0][y0]==1)에는 2차 변환이 적용되지 않을 수 있다. 따라서, 변환 블록의 너비가 4 이상이고(log2TbWidth>=2), 변환 블록의 높이가 4이상이며(log2TbHeight>=2) 변환 스킵이 적용되지 않는 (transform_skip_flag[x0][y0]==0) 변환 블록에 대하여 numZeroOutSigCoeff는 업데이트 될 수 있다. 2차 변환이 적용되는 경우, 4x4 8x8 크기의 변환 블록에 대해서는 스캔 순서 상 인덱스 [0, 7] 영역에서만 0이 아닌 변환 계수 (significant coefficient)가 존재할 수 있다. 따라서, 변환 블록이 4x4 또는 8x8이고, ((log2TbWidth==2||log2TbHeight==3)&&(log2TbWidth==log2TbHeight)), lastScanPos가 7보다 큰 경우(lastScanPos>7), numZeroOutSigCoeff는 1 증가할 수 있다. 2차 변환이 적용될 수 있는 4x4, 8x8 사이즈를 제외한 블록에 대해서는 스캔 순서 상 인덱스 [0, 15] 영역에서만 0이 아닌 변환 계수(significant coefficient)가 존재할 수 있다. 따라서, lastScanPos가 15보다 큰 경우(lastScanPos>15), numZeroOutSigCoeff는 1 증가할 수 있다.
디코더는 lastScanPos에 기반하여, lfnstLastScanPos를 결정할 수 있다. 구체적으로, 변환 블록의 너비 및 높이가 4 이상이고, 변환 블록에 변환 스킵이 적용되지 않을 때, lfnstLastScanPos는 아래 수학식 6과 같이 설정될 수 있다. 다시 말하면 log2TbWidth>=2이고, log2TbHeight>=2이고, transform_skip_flag[x0][y0]가 0인 경우, lfnstLastScanPos는 아래 수학식 1과 같이 설정될 수 있다. 이때, transform_skip_flag[x0][y0]가 0이면 현재 변환 블록에 변환 스킵이 적용되지 않는 경우를 의미할 수 있다.
상술한 바와 같이 lfnstLastScanPos의 초기화 값은 1로 설정될 수 있다.
수학식 6에서 cIdx는 상술한 바와 같이, 현재 변환 블록의 컬러 성분을 의미하는 변수를 나타낼 수 있다.
수학식 6에 따르면, 직전 lfnstLastScanPos가 1이고 lastScanPos가 lfnstLastScanPosTh[cIdx]보다 작은 경우, lfnstLastScanPos는 1로 업데이트될 수 있다. 한편, 직전 lfnstLastScanPos가 0이거나, lastScanPos가 lfnstScanPosTh[cIdx] 이상인 경우, lfnstLastScanPos는 0으로 업데이트될 수 있다.
다시 말하면, 변환 유닛이 포함하는 모든 변환 블록의 lastScanPos가 임계 값보다 작거나 모든 변환 블록의 계수가 모두 0인 경우, lfnstLastScanPos는 1로 결정될 수 있고, 도 26의 lfnst_idx[x0][y0] 파싱 조건에 따라, lfnst_idx[x0][y0]는 파싱되지 않고 0으로 설정될 수 있다. 이는 현재 블록에 2차 변환이 적용되지 않음을 나타낸다. 반면 변환 유닛이 포함하는 변환 블록들 중 어느 하나라도 lastScanPos가 임계 값 이상일 경우, lfnstLastScanPos는 0으로 결정될 수 있고, 도 26의 조건 i), ii), iii), iv), v), vii)이 모두 만족되는 경우(참인 경우), 디코더는 lfnst_idx[x0][y0]를 파싱할 수 있다. 디코더는 lfnst_idx[x0][y0]를 파싱하여 현재 블록에 2차 변환이 적용되는지 여부를 확인할 수 있고, 현재 블록에 2차 변환이 적용되는 경우, 2차 변환에 사용되는 변환 커널을 확인/결정할 수 있다.
수학식 6의 lfnstLastScanPosTh[cIdx]는 기 설정된 0 이상의 정수 값으로 인코더와 디코더가 모두 동일한 값을 사용할 수 있다. 또한, 모든 컬러 성분이 동일한 임계 값을 사용할 수도 있다. 이 경우, lfnstLastScanPos는 아래 수학식 7과 같이 설정될 수 있다.
lfnstLastScanPosTh는 기 설정된 0 이상의 정수 값으로 인코더와 디코더가 모두 동일한 값을 사용할 수 있다. 예를 들어, lfnstLastScanPosTh는 1일 수 있다. 즉, lastScanPos가 1 이상인 경우, lfnstLastScanPos는 0으로 업데이트 될 수 있고, lfnst_idx[x0][y0]는 파싱될 수 있다. 이 때, 임계 값(lfnstLastScanPosTh)는 정수 값이므로, lastScanPos가 1 이상인 경우는 lastScanPos가 0보다 큰 경우와 동일한 의미일 수 있다. 도 27에서는 모든 컬러 성분이 동일한 임계 값인 1인 경우에 대해서 설명하였으나, 본 발명이 이에 한정되는 것은 아니다.
도 28은 본 발명의 실시 예에 따른 residual_coding 신택스 구조를 도시한 도면이다.
도 28을 살펴보면, 스캔 순서 상 마지막 유효 계수(last significant coefficient)의 위치 정보는 계수 코딩(residual_coding) 이전에 지시될 수 있다. 따라서, 계수 코딩(residual_coding) 신택스 구조는 스캔 순서 상 마지막 유효 계수(last significant coefficient)의 위치 정보와 관련된 신택스 구조를 포함하지 않을 수 있다. 예를 들어, 스캔 순서 상 마지막 유효 계수(last significant coefficient)의 위치 정보는 스캔 순서 상 마지막 유효 계수(last significant coefficient)의 x좌표에 대한 프리픽스(prefix), 서픽스(suffix), y좌표에 대한 프리픽스(prefix), 서픽스(suffix)일 수 있다. 도 28에 따른 계수 코딩(residual_coding) 신택스 구조를 살펴보면, 계수 코딩(residual_coding) 이전에 결정된 스캔 순서 상 마지막 유효 계수(last significant coefficient)의 x좌표, y좌표인 LastSignificantCoeffX, LastSignificantCoeffY에 기반하여 계수 코딩(residual_coding)이 수행될 수 있다.
제4 실시예에 따른 2차 변환 지시 방법은 numSigCoeff 카운터를 사용하지 않는다. 따라서, (xC, yC) 위치의 계수가 유효 계수(significant coefficient)이더라도 (sig_coeff_flag[xC][yC]==1), numSigCoeff는 업데이트되지 않을 수 있다. 다시 말하면, 제4 실시예에 따른 2차 변환 지시 방법은, 유효 계수(significant coefficient)에 대한 카운터를 사용하지 않는 방법일 수 있다. 또한 제4 실시예에 따른 2차 변환 지시 방법에 의하면 lastScanPos에 기반하여 numZeroOutSigCoeff 변수가 설정될 수 있으므로, 계수 코딩(residual_coding)에서 sig_coeff_flag에 기반하는 카운터는 사용되지 않을 수 있다.
도 29는 본 발명의 실시 예에 따른 비디오 신호 처리 방법을 나타낸 순서도이다.
이하에서는 도 15 내지 도 28을 통해 설명한 실시예들에 기초한 비디오 신호 처리 방법 및 장치에 대해 설명한다.
비디오 신호 복호화 장치는, 도 29에서 설명하는 비디오 신호 처리 방법을 수행하는 프로세서를 포함할 수 있다.
먼저, 상기 프로세서는 코딩 유닛의 2차 변환과 관련된 신택스 요소가 포함된 비트스트림을 수신할 수 있다.
상기 프로세서는, 기 설정된 하나 이상의 조건들이 만족되는지 여부를 확인하여, 상기 기 설정된 하나 이상의 조건들이 만족되는 경우, 상기 코딩 유닛의 2차 변환과 관련된 신택스 요소를 파싱(parsing)할 수 있다(S2910, S2920). 한편, 프로세서는, 기 설정된 하나 이상의 조건들이 만족되지 못하는 경우, 상기 코딩 유닛의 2차 변환과 관련된 신택스 요소를 파싱하지 않을 수 있다(S2930). 이때, 2차 변환과 관련된 신택스 요소의 값은 0으로 설정될 수 있다.
도 29에서 설명하는 코딩 유닛의 2차 변환과 관련된 신택스 요소는 도 15 내지 도 28에서 설명한 현재 코딩 유닛에 포함되는 변환 블록 2차 변환이 적용되는지 여부를 나타내는 신택스 요소인 lfnst_idx[x0][y0]일 수 있다.
상기 프로세서는 S2920단계를 통해 코딩 유닛의 2차 변환과 관련된 신택스 요소를 파싱하고, 상기 파싱된 신택스 요소에 기초하여, 상기 코딩 유닛에 포함되는 변환 블록에 상기 2차 변환이 적용되는지 여부를 확인할 수 있다(S2940).
이때, 상기 변환 블록에 상기 2차 변환이 적용된 경우, 프로세서는 상기 변환 블록을 구성하는 하나 이상의 서브블록들 중 하나인 제1 서브블록의 하나 이상의 계수들에 기초한 2차 역변환을 수행하여, 상기 제1 서브블록에 대한 하나 이상의 역변환 계수들을 획득할 수 있다(S2950).
그리고, 상기 프로세서는 S2950단계에서 획득한 상기 하나 이상의 역변환 계수들에 기초한 1차 역변환을 수행하여, 상기 변환 블록에 대한 잔차 샘플을 획득할 수 있다(S2960).
상기 2차 변환은, 저대역 비-분리 변환(Low Frequency Non-Separable Transform, LFNST)일 수 있다. 그리고 상기 변환 블록은 수직 변환 및 수평 변환으로 각각 분리되어 수행되는 1차 변환이 적용된 블록일 수 있다. 이때, 상기 1차 역변환은 상기 1차 변환에 대한 역변환이고, 상기 2차 역변환은 상기 2차 변환에 대한 역변환을 의미하는 것일 수 있다.
상기 코딩 유닛의 2차 변환과 관련된 신택스 요소는, 상기 코딩 유닛에 상기 2차 변환이 적용되는지 여부를 지시하는 정보 및 상기 2차 변환에 사용되는 변환 커널을 지시하는 정보를 포함할 수 있다.
상기 제1 서브블록은 기 설정된 스캔 순서에 따른 첫 번째 서브블록일 수 있고, 이때, 상기 제1 서브블록의 인덱스는 0일 수 있다.
상기 기 설정된 하나 이상의 조건들 중 제1 조건은, 상기 제1 서브블록의 상기 하나 이상의 계수들 중 제1 계수의 위치를 나타내는 인덱스 값이 기 설정된 임계 값보다 큰 경우일 수 있다. 이때, 상기 제1 계수는 기 설정된 스캔 순서에 따른 마지막 유효 계수(last significant coefficient)이고, 상기 유효 계수는 0이 아닌(non-zero) 계수를 의미하는 것일 수 있다. 상기 기 설정된 임계 값은 0일 수 있다. 상기 기 설정된 스캔 순서는, 도 13, 14에서 설명한 우상측 대각 스캔 순서(up-right diagonal)일 수 있다.
상기 기 설정된 하나 이상의 조건들 중 제2 조건은, 상기 변환 블록의 너비(Width) 및 높이(Height)가 4픽셀 이상일 수 있다.
상기 기 설정된 하나 이상의 조건들 중 제3 조건은, 상기 비트스트림에 포함된 변환 스킵 플래그(flag) 값이 특정 값이 아닌 경우일 수 있다. 이때, 상기 변환 스킵 플래그 값이 상기 특정 값을 가지는 경우, 상기 변환 스킵 플래그는 상기 변환 블록에 상기 1차 변환 및 상기 2차 변환이 적용되지 않음을 지시하는 것일 수 있다.
상기 기 설정된 하나 이상의 조건들 중 제4 조건은, 상기 제1 서브블록의 상기 하나 이상의 계수들 중 적어도 하나의 계수는 0이 아니고, 상기 적어도 하나의 계수는 기 설정된 스캔 순서에 따른 첫 번째 위치를 제외한 곳에 존재하는 경우일 수 있다. 이때, 상기 기 설정된 스캔 순서에 따른 첫 번째 위치는 상술한 바와 같이 수평, 수직 좌표의 값이 (0, 0)인 위치를 의미하거나, 기 설정된 스캔 순서(예: 우상측 대각(up-right diagonal) 순서)에 따른 첫 번째 위치를 의미하는 것일 수 있다.
또한, 상기 코딩 유닛은 복수의 코딩 블록들로 구성될 수 있다. 이때, 상기 복수의 코딩 블록 각각에 대응하는 변환 블록들 중 적어도 어느 하나라도 상기 기 설정된 하나 이상의 조건들을 만족하는 경우 상기 2차 변환과 관련된 신택스 요소는 파싱될 수 있다.
한편, 2차 변환과 관련된 신택스 요소가 파싱되지 않거나 0으로 설정된 경우(S2930) 또는 S2940 단계에서 상기 코딩 유닛에 포함되는 변환 블록에 상기 2차 변환이 적용되지 않는 것으로 확인된 경우 프로세서는, 상기 변환 블록의 하나 이상 계수들에 기초한 1차 역변환을 수행하여 상기 변환 블록에 대한 잔차 샘플을 획득할 수 있다(S2970).
이때, 상술한 1차 역변환, 2차 역변환은 각각 1차 변환, 2차 변환에 대한 역변환일 수 있다.
도 29에서 설명한 비디오 신호 복호화 장치에서 수행되는 비디오 신호 처리 방법 또는 이와 유사한 방법이 비디오 신호 부호화 장치에서 수행될 수 있다.
비디오 신호 부호화 장치는, 비디오 신호를 부호화하는 프로세서를 포함할 수 있다.
이때, 상기 프로세서는, 코딩 유닛에 포함되는 블록의 잔차 샘플에 대한 1차 변환을 수행하여 상기 블록에 대한 복수 개의 1차 변환 계수들을 획득할 수 있다. 상기 복수 개의 1차 변환 계수들 중 하나 이상의 계수들에 기초한 2차 변환을 수행하여, 상기 블록을 구성하는 서브블록들 중 하나인 제1 서브블록에 대한 하나 이상의 2차 변환 계수들을 획득할 수 있다. 상기 하나 이상의 2차 변환 계수들에 대한 정보 및 상기 코딩 유닛의 2차 변환과 관련된 신택스 요소를 부호화하여 비트스트림(bitstream)을 획득할 수 있다.
상기 2차 변환은, 저대역 비-분리 변환(Low Frequency Non-Separable Transform, LFNST)이고, 상기 1차 변환은 수직 변환 및 수평 변환으로 각각 분리되어 수행 가능할 수 있다.
또한, 상기 2차 변환과 관련된 신택스 요소는 기 설정된 하나 이상의 조건들을 만족하는 경우 부호화될 수 있다. 상기 2차 변환과 관련된 신택스 요소는, 상기 코딩 유닛에 상기 2차 변환이 적용되는지 여부를 지시하는 정보 및 상기 2차 변환에 사용되는 변환 커널을 지시하는 정보를 포함할 수 있다. 이때, 상기 2차 변환과 관련된 신택스 요소는 도 15 내지 도 28에서 설명한 신택스 요소인 lfnst_idx[x0][y0]일 수 있다.
상기 제1 서브블록은 기 설정된 스캔 순서에 따른 첫 번째 서브블록일 수 있다. 이때, 상기 제1 서브블록의 인덱스는 0일 수 있다.
상기 기 설정된 하나 이상의 조건들 중 제1 조건은, 상기 하나 이상의 2차 변환 계수들 중 제1 계수의 위치를 나타내는 인덱스 값이 기 설정된 임계 값보다 큰 경우일 수 있다. 이때, 상기 제1 계수는 기 설정된 스캔 순서에 따른 마지막 유효 계수(last significant coefficient)이고, 상기 유효 계수는 0이 아닌(non-zero) 계수를 의미하는 것일 수 있다. 상기 기 설정된 임계 값은 0일 수 있다. 상기 기 설정된 스캔 순서는, 도 13, 14에서 설명한 우상측 대각 스캔 순서(up-right diagonal)일 수 있다.
상기 기 설정된 하나 이상의 조건들 중 제2 조건은, 상기 1차 변환 블록의 너비(Width) 및 높이(Height)는 4픽셀 이상일 수 있다.
상기 기 설정된 하나 이상의 조건들 중 제3 조건은, 상기 비트스트림에 포함된 변환 스킵 플래그(flag) 값이 특정 값이 아닌 경우일 수 있다. 이때, 상기 변환 스킵 플래그 값이 상기 특정 값을 가지는 경우, 상기 변환 스킵 플래그는 상기 블록에 상기 1차 변환 및 상기 2차 변환이 적용되지 않음을 지시하는 것일 수 있다.
상기 기 설정된 하나 이상의 조건들 중 제4 조건은, 상기 하나 이상의 2차 변환 계수들 중 적어도 하나의 계수는 0이 아니고, 상기 적어도 하나의 계수는 기 설정된 스캔 순서에 따른 첫 번째 위치를 제외한 곳에 존재하는 경우일 수 있다. 이때, 상기 기 설정된 스캔 순서에 따른 첫 번째 위치는 상술한 바와 같이 수평, 수직 좌표의 값이 (0, 0)인 위치를 의미하거나, 기 설정된 스캔 순서(예: 우상측 대각(up-right diagonal) 순서)에 따른 첫 번째 위치를 의미하는 것일 수 있다.
또한, 상기 코딩 유닛은 복수의 코딩 블록들로 구성될 수 있다. 이때, 상기 복수의 코딩 블록 각각에 대응하는 코딩 유닛에 포함되는 (변환) 블록들 중 적어도 어느 하나라도 상기 기 설정된 하나 이상의 조건들을 만족하는 경우 상기 2차 변환과 관련된 신택스 요소는 부호화 될 수 있다.
또한, 비디오 신호 부호화 장치는 도 29에서 설명한 비디오 신호 처리 방법을 수행하는 비디오 신호 복호화 프로세서를 포함할 수 있다.
상술한 바와 같이, 비트스트림에는 도 15 내지 도 29에서 설명한 코딩 유닛의 2차 변환과 관련된 신택스 요소가 포함될 수 있다. 이때, 상기 비트스트림은 비-일시적인(non-transitory) 컴퓨터 판독 가능 매체(computer-readable medium)에 저장될 수 있다. 한편, 비디오 신호 부호화 장치는 상술한 기 설정된 하나 이상의 조건들이 만족되지 못하는 경우, 2차 변환과 관련된 신택스 요소를 상기 비트스트림에 포함하지 않거나, 2차 변환과 관련된 신택스 요소를 0으로 설정할 수 있다. 비트스트림은, 도 29를 통해 설명한 비디오 신호 복호화 장치에 의해 복호화 되거나, 상술한 비디오 신호 부호화 장치에 의해 부호화 될 수 있다.
이러한 비트스트림을 부호화하는 방법은, 예를 들어, 코딩 유닛에 포함되는 블록의 잔차 샘플에 대한 1차 변환을 수행하여 상기 블록에 대한 복수 개의 1차 변환 계수들을 획득하고, 상기 복수 개의 1차 변환 계수들 중 하나 이상의 계수들에 기초한 2차 변환을 수행하여, 상기 블록을 구성하는 서브블록들 중 하나인 제1 서브블록에 대한 하나 이상의 2차 변환 계수들을 획득하고, 및 상기 하나 이상의 2차 변환 계수들에 대한 정보 및 상기 코딩 유닛의 2차 변환과 관련된 신택스 요소를 부호화하는 과정을 포함하는 부호화 방법일 수 있다.
본 명세서에서 설명하는 계수를 획득한다는 것은, 계수와 관련된 픽셀/블록을 획득한다는 의미일 수 있고, 잔차 샘플을 획득한다는 것은, 잔차 샘플과 관련된 잔차 신호/픽셀/블록을 획득한다는 의미일 수 있다.
상술한 본 발명의 실시예들은 다양한 수단을 통해 구현될 수 있다. 예를 들어, 본 발명의 실시예들은 하드웨어, 펌웨어(firmware), 소프트웨어 또는 그것들의 결합 등에 의해 구현될 수 있다.
하드웨어에 의한 구현의 경우, 본 발명의 실시예들에 따른 방법은 하나 또는 그 이상의 ASICs(Application Specific Integrated Circuits), DSPs(Digital Signal Processors), DSPDs(Digital Signal Processing Devices), PLDs(Programmable Logic Devices), FPGAs(Field Programmable Gate Arrays), 프로세서, 컨트롤러, 마이크로 컨트롤러, 마이크로 프로세서 등에 의해 구현될 수 있다.
펌웨어나 소프트웨어에 의한 구현의 경우, 본 발명의 실시예들에 따른 방법은 이상에서 설명된 기능 또는 동작들을 수행하는 모듈, 절차 또는 함수 등의 형태로 구현될 수 있다. 소프트웨어 코드는 메모리에 저장되어 프로세서에 의해 구동될 수 있다. 상기 메모리는 프로세서의 내부 또는 외부에 위치할 수 있으며, 이미 공지된 다양한 수단에 의해 프로세서와 데이터를 주고받을 수 있다.
일부 실시예는 컴퓨터에 의해 실행되는 프로그램 모듈과 같은 컴퓨터에 의해 실행가능한 명령어를 포함하는 기록 매체의 형태로도 구현될 수 있다. 컴퓨터 판독 가능 매체는 컴퓨터에 의해 액세스될 수 있는 임의의 가용 매체일 수 있고, 휘발성 및 비휘발성 매체, 분리형 및 비분리형 매체를 모두 포함한다. 또한, 컴퓨터 판독 가능 매체는 컴퓨터 저장 매체 및 통신 매체를 모두 포함할 수 있다. 컴퓨터 저장 매체는 컴퓨터 판독가능 명령어, 데이터 구조, 프로그램 모듈 또는 기타 데이터와 같은 정보의 저장을 위한 임의의 방법 또는 기술로 구현된 휘발성 및 비휘발성, 분리형 및 비분리형 매체를 모두 포함한다. 통신 매체는 전형적으로 컴퓨터 판독가능 명령어, 데이터 구조 또는 프로그램 모듈과 같은 변조된 데이터 신호의 기타 데이터, 또는 기타 전송 메커니즘을 포함하며, 임의의 정보 전달 매체를 포함한다.
전술한 본 발명의 설명은 예시를 위한 것이며, 본 발명이 속하는 기술분야의 통상의 지식을 가진 자는 본 발명의 기술적 사상이나 필수적인 특징을 변경하지 않고서 다른 구체적인 형태로 쉽게 변형이 가능하다는 것을 이해할 수 있을 것이다. 그러므로 이상에서 기술한 실시예들은 모든 면에서 예시적인 것이며 한정적인 것이 아는 것으로 해석해야 한다. 예를 들어, 단일형으로 설명되어 있는 각 구성 요소는 분산되어 실시될 수도 있으며, 마찬가지로 분산된 것으로 설명되어 있는 구성 요소들도 결합된 형태로 실시될 수 있다.
본 발명의 범위는 상기 상세한 설명보다는 후술하는 특허청구범위에 의하여 나타내어지며, 특허청구범위의 의미 및 범위 그리고 그 균등 개념으로부터 도출되는 모든 변경 또는 변형된 형태가 본 발명의 범위에 포함되는 것으로 해석되어야 한다.