KR20230002432A - 교차 성분 예측을 위한 사용 제한 - Google Patents

교차 성분 예측을 위한 사용 제한 Download PDF

Info

Publication number
KR20230002432A
KR20230002432A KR1020227036103A KR20227036103A KR20230002432A KR 20230002432 A KR20230002432 A KR 20230002432A KR 1020227036103 A KR1020227036103 A KR 1020227036103A KR 20227036103 A KR20227036103 A KR 20227036103A KR 20230002432 A KR20230002432 A KR 20230002432A
Authority
KR
South Korea
Prior art keywords
subwidthc
subheightc
video
samples
neighboring
Prior art date
Application number
KR1020227036103A
Other languages
English (en)
Inventor
양 왕
리 장
카이 장
홍빈 리우
위에 왕
Original Assignee
베이징 바이트댄스 네트워크 테크놀로지 컴퍼니, 리미티드
바이트댄스 아이엔씨
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by 베이징 바이트댄스 네트워크 테크놀로지 컴퍼니, 리미티드, 바이트댄스 아이엔씨 filed Critical 베이징 바이트댄스 네트워크 테크놀로지 컴퍼니, 리미티드
Publication of KR20230002432A publication Critical patent/KR20230002432A/ko

Links

Images

Classifications

    • HELECTRICITY
    • H04ELECTRIC COMMUNICATION TECHNIQUE
    • H04NPICTORIAL COMMUNICATION, e.g. TELEVISION
    • H04N19/00Methods or arrangements for coding, decoding, compressing or decompressing digital video signals
    • H04N19/10Methods or arrangements for coding, decoding, compressing or decompressing digital video signals using adaptive coding
    • H04N19/102Methods or arrangements for coding, decoding, compressing or decompressing digital video signals using adaptive coding characterised by the element, parameter or selection affected or controlled by the adaptive coding
    • H04N19/132Sampling, masking or truncation of coding units, e.g. adaptive resampling, frame skipping, frame interpolation or high-frequency transform coefficient masking
    • HELECTRICITY
    • H04ELECTRIC COMMUNICATION TECHNIQUE
    • H04NPICTORIAL COMMUNICATION, e.g. TELEVISION
    • H04N19/00Methods or arrangements for coding, decoding, compressing or decompressing digital video signals
    • H04N19/60Methods or arrangements for coding, decoding, compressing or decompressing digital video signals using transform coding
    • H04N19/61Methods or arrangements for coding, decoding, compressing or decompressing digital video signals using transform coding in combination with predictive coding
    • HELECTRICITY
    • H04ELECTRIC COMMUNICATION TECHNIQUE
    • H04NPICTORIAL COMMUNICATION, e.g. TELEVISION
    • H04N19/00Methods or arrangements for coding, decoding, compressing or decompressing digital video signals
    • H04N19/10Methods or arrangements for coding, decoding, compressing or decompressing digital video signals using adaptive coding
    • H04N19/102Methods or arrangements for coding, decoding, compressing or decompressing digital video signals using adaptive coding characterised by the element, parameter or selection affected or controlled by the adaptive coding
    • H04N19/103Selection of coding mode or of prediction mode
    • H04N19/105Selection of the reference unit for prediction within a chosen coding or prediction mode, e.g. adaptive choice of position and number of pixels used for prediction
    • HELECTRICITY
    • H04ELECTRIC COMMUNICATION TECHNIQUE
    • H04NPICTORIAL COMMUNICATION, e.g. TELEVISION
    • H04N19/00Methods or arrangements for coding, decoding, compressing or decompressing digital video signals
    • H04N19/10Methods or arrangements for coding, decoding, compressing or decompressing digital video signals using adaptive coding
    • H04N19/102Methods or arrangements for coding, decoding, compressing or decompressing digital video signals using adaptive coding characterised by the element, parameter or selection affected or controlled by the adaptive coding
    • H04N19/103Selection of coding mode or of prediction mode
    • H04N19/11Selection of coding mode or of prediction mode among a plurality of spatial predictive coding modes
    • HELECTRICITY
    • H04ELECTRIC COMMUNICATION TECHNIQUE
    • H04NPICTORIAL COMMUNICATION, e.g. TELEVISION
    • H04N19/00Methods or arrangements for coding, decoding, compressing or decompressing digital video signals
    • H04N19/10Methods or arrangements for coding, decoding, compressing or decompressing digital video signals using adaptive coding
    • H04N19/102Methods or arrangements for coding, decoding, compressing or decompressing digital video signals using adaptive coding characterised by the element, parameter or selection affected or controlled by the adaptive coding
    • H04N19/124Quantisation
    • HELECTRICITY
    • H04ELECTRIC COMMUNICATION TECHNIQUE
    • H04NPICTORIAL COMMUNICATION, e.g. TELEVISION
    • H04N19/00Methods or arrangements for coding, decoding, compressing or decompressing digital video signals
    • H04N19/10Methods or arrangements for coding, decoding, compressing or decompressing digital video signals using adaptive coding
    • H04N19/134Methods or arrangements for coding, decoding, compressing or decompressing digital video signals using adaptive coding characterised by the element, parameter or criterion affecting or controlling the adaptive coding
    • H04N19/136Incoming video signal characteristics or properties
    • HELECTRICITY
    • H04ELECTRIC COMMUNICATION TECHNIQUE
    • H04NPICTORIAL COMMUNICATION, e.g. TELEVISION
    • H04N19/00Methods or arrangements for coding, decoding, compressing or decompressing digital video signals
    • H04N19/10Methods or arrangements for coding, decoding, compressing or decompressing digital video signals using adaptive coding
    • H04N19/134Methods or arrangements for coding, decoding, compressing or decompressing digital video signals using adaptive coding characterised by the element, parameter or criterion affecting or controlling the adaptive coding
    • H04N19/157Assigned coding mode, i.e. the coding mode being predefined or preselected to be further used for selection of another element or parameter
    • H04N19/159Prediction type, e.g. intra-frame, inter-frame or bidirectional frame prediction
    • HELECTRICITY
    • H04ELECTRIC COMMUNICATION TECHNIQUE
    • H04NPICTORIAL COMMUNICATION, e.g. TELEVISION
    • H04N19/00Methods or arrangements for coding, decoding, compressing or decompressing digital video signals
    • H04N19/10Methods or arrangements for coding, decoding, compressing or decompressing digital video signals using adaptive coding
    • H04N19/169Methods or arrangements for coding, decoding, compressing or decompressing digital video signals using adaptive coding characterised by the coding unit, i.e. the structural portion or semantic portion of the video signal being the object or the subject of the adaptive coding
    • H04N19/17Methods or arrangements for coding, decoding, compressing or decompressing digital video signals using adaptive coding characterised by the coding unit, i.e. the structural portion or semantic portion of the video signal being the object or the subject of the adaptive coding the unit being an image region, e.g. an object
    • H04N19/176Methods or arrangements for coding, decoding, compressing or decompressing digital video signals using adaptive coding characterised by the coding unit, i.e. the structural portion or semantic portion of the video signal being the object or the subject of the adaptive coding the unit being an image region, e.g. an object the region being a block, e.g. a macroblock
    • HELECTRICITY
    • H04ELECTRIC COMMUNICATION TECHNIQUE
    • H04NPICTORIAL COMMUNICATION, e.g. TELEVISION
    • H04N19/00Methods or arrangements for coding, decoding, compressing or decompressing digital video signals
    • H04N19/10Methods or arrangements for coding, decoding, compressing or decompressing digital video signals using adaptive coding
    • H04N19/169Methods or arrangements for coding, decoding, compressing or decompressing digital video signals using adaptive coding characterised by the coding unit, i.e. the structural portion or semantic portion of the video signal being the object or the subject of the adaptive coding
    • H04N19/186Methods or arrangements for coding, decoding, compressing or decompressing digital video signals using adaptive coding characterised by the coding unit, i.e. the structural portion or semantic portion of the video signal being the object or the subject of the adaptive coding the unit being a colour or a chrominance component
    • HELECTRICITY
    • H04ELECTRIC COMMUNICATION TECHNIQUE
    • H04NPICTORIAL COMMUNICATION, e.g. TELEVISION
    • H04N19/00Methods or arrangements for coding, decoding, compressing or decompressing digital video signals
    • H04N19/46Embedding additional information in the video signal during the compression process
    • HELECTRICITY
    • H04ELECTRIC COMMUNICATION TECHNIQUE
    • H04NPICTORIAL COMMUNICATION, e.g. TELEVISION
    • H04N19/00Methods or arrangements for coding, decoding, compressing or decompressing digital video signals
    • H04N19/50Methods or arrangements for coding, decoding, compressing or decompressing digital video signals using predictive coding
    • H04N19/593Methods or arrangements for coding, decoding, compressing or decompressing digital video signals using predictive coding involving spatial prediction techniques
    • HELECTRICITY
    • H04ELECTRIC COMMUNICATION TECHNIQUE
    • H04NPICTORIAL COMMUNICATION, e.g. TELEVISION
    • H04N19/00Methods or arrangements for coding, decoding, compressing or decompressing digital video signals
    • H04N19/70Methods or arrangements for coding, decoding, compressing or decompressing digital video signals characterised by syntax aspects related to video coding, e.g. related to compression standards
    • HELECTRICITY
    • H04ELECTRIC COMMUNICATION TECHNIQUE
    • H04NPICTORIAL COMMUNICATION, e.g. TELEVISION
    • H04N19/00Methods or arrangements for coding, decoding, compressing or decompressing digital video signals
    • H04N19/80Details of filtering operations specially adapted for video compression, e.g. for pixel interpolation
    • HELECTRICITY
    • H04ELECTRIC COMMUNICATION TECHNIQUE
    • H04NPICTORIAL COMMUNICATION, e.g. TELEVISION
    • H04N19/00Methods or arrangements for coding, decoding, compressing or decompressing digital video signals
    • H04N19/85Methods or arrangements for coding, decoding, compressing or decompressing digital video signals using pre-processing or post-processing specially adapted for video compression
    • H04N19/86Methods or arrangements for coding, decoding, compressing or decompressing digital video signals using pre-processing or post-processing specially adapted for video compression involving reduction of coding artifacts, e.g. of blockiness

Landscapes

  • Engineering & Computer Science (AREA)
  • Multimedia (AREA)
  • Signal Processing (AREA)
  • Compression Or Coding Systems Of Tv Signals (AREA)
  • Color Television Systems (AREA)

Abstract

비디오 유닛을 포함하는 비디오와 상기 비디오의 비트스트림 간의 변환을 위해 제1 코딩 툴이 규칙에 따라 인에이블되었는지 여부를 결정하는 단계, 여기서 상기 규칙은 제1 코딩 툴과 제2 코딩 툴이 서로 배타적으로 인에이블됨을 명시하고, 상기 제1 코딩 툴 또는 상기 제2 코딩 툴은 부호 데이터 은닉 툴(sign data hiding tool)을 포함하며, 및 상기 판단에 따라 변환을 수행하는 단계를 포함하는 비디오 처리 방법이 제공된다.

Description

교차 성분 예측을 위한 사용 제한
관련 출원들과의 상호 참조
파리 조약에 따라 적용 가능한 특허법 및/또는 법규 하에서, 본원은 2020년 4월 18일자로 출원된 국제특허출원 제 PCT/CN2020/085484 호에 대한 우선권을 적시에 주장한다. 법에 따른 모든 목적들을 위해, 전술한 출원의 전체 개시사항은 본원의 개시사항의 일부로서 포함된다.
본 발명은 비디오(video) 및 화상(image) 코딩 기술에 관한 것이다.
디지털 비디오는 인터넷 및 다른 디지털 통신망들 상의 최대 밴드폭 사용을 차지한다. 비디오를 수신 및 화상 표시할 수 있는 연결된 사용자 단말기(user device)의 수가 증가함에 따라, 디지털 비디오 사용에 대한 밴드폭 요구가 계속 성장할 것으로 기대된다.
개시된 기법들은 교차 성분 선형 모델(cross-component linear model) 예측을 사용하여 인코딩 또는 디코딩을 수행하는 비디오 또는 화상 디코더 또는 인코더 실시예들에 사용될 수 있다.
하나의 예시적 측면(aspect)에서, 비디오를 처리하는 방법이 개시된다. 이 방법은 비디오의 크로마 블록(chroma block)과 상기 비디오의 코딩 표현(coded representation) 간의 변환을 위해, 다운샘플링(downsampling) 필터를 사용하여 동치(collocated) 루마 블록(luma block)의 N개 위의 라인(line)들에서 생성된 다운샘플링된(downsampled) 동치 상측(top) 루마 샘플들을 사용함으로써 교차 성분 선형 모델의 파라미터들을 유도하는(derive) 단계와, - 여기서 N은 양의 정수임-; 및 상기 교차 성분 선형 모델을 사용하여 생성된, 예측된 크로마 블록을 사용하여 변환을 수행하는 단계를 포함한다.
다른 예시적 측면에서, 비디오를 처리하는 방법이 개시된다. 이 방법은 4:2:2 칼라 포맷(color format)을 갖는 비디오의 비디오 블록과 상기 비디오의 비트스트림(bitstream) 간의 변환을 위해, 비디오 블록을 위한 교차 성분 선형 모델의 파라미터들을 규칙에 따라 결정하는 단계와; 및 상기 결정에 기반하여 변환을 수행하는 단계를 포함하되, 여기서 신택스 요소(syntax element)가 비디오의 크로마 샘플들이 비디오의 루마 샘플들에 대해 수직으로 천이(shift)되었는지 여부를 표시하고, 상기 규칙은 파라미터가 상기 신택스 요소의 값과 독립적으로 결정된다는 것을 명시한다.
또 다른 예시적 측면에서, 비디오를 처리하는 방법이 개시된다. 방법은 규칙에 따라 비디오와 상기 비디오의 비트스트림 간의 변환을 수행하는 단계를 포함하되, 여기서 포맷 규칙은 크로마 샘플 위치들이 대응 루마 샘플 위치들에 대해 수직으로 천이되었는지 여부를 표시하는 필드(field)는 비디오가 4:2:2 또는 4:4:4 칼라 포맷을 가짐에 따라 디폴트값(default value)과 같게 설정됨을 명시한다.
또 다른 예시적 측면에서, 비디오를 처리하는 방법이 개시된다. 방법은 비디오의 비디오 블록과 상기 비디오의 비트스트림 간의 변환을 위해 규칙에 따라 상기 비디오 블록의 교차 성분 선형 모델(cross-component linear model; CCLM)의 파라미터를 결정하는 단계와; 상기 결정에 기반하여 변환을 수행하는 단계를 포함하되, 여기서 상기 규칙은 이웃 루마 샘플을 나타내는 변수가 어떤 값을 가질 경우에만 CCLM의 파라미터의 결정에 상기 변수를 사용하도록 명시한다.
또 다른 예시적 측면에서, 비디오를 처리하는 방법이 개시된다. 이 방법은 비디오 유닛을 포함하는 비디오와 상기 비디오의 비트스트림 간의 변환을 위해 제1 코딩 툴이 상기 비디오 유닛에 대해 인에이블(enabled)되었는지 여부를 결정하는 단계와, - 여기서 규칙에 의해 제1 코딩 툴이 상기 비디오 유닛을 위해 인에이블되고, 상기 규칙은 상기 제1 코딩 툴과 제2 코딩 툴이 서로 배타적으로 인에이블됨을 명시하고, 상기 제1 코딩 툴 또는 상기 제2 코딩 툴은 부호 데이터 은닉 툴(sign data hiding tool)을 포함함 -; 및 상기 결정에 따라 변환을 수행하는 단계를 포함한다.
또 다른 예시적 측면에서, 비디오를 처리하는 방법이 개시된다. 방법은 비디오 유닛을 포함하는 비디오와 상기 비디오의 비트스트림 간의 변환을 위해 제1 코딩 툴이 상기 비디오 유닛에 대해 인에이블되었는지 여부를 결정하는 단계로, - 여기서 규칙에 의해 제1 코딩 툴이 상기 비디오 유닛을 위해 인에이블되고, 상기 규칙은 상기 제1 코딩 툴과 제2 코딩 툴이 서로 배타적으로 인에이블됨을 명시하고, 상기 제1 코딩 툴 또는 상기 제2 코딩 툴은 종속 양자화 툴(dependent quantization tool)을 포함함 - : 상기 결정에 따라 변환을 수행하는 단계를 포함한다.
또 다른 예시적 측면에서, 비디오를 처리하는 방법이 개시된다. 방법은 하나 이상의 슬라이스(slice)들을 갖는 하나 이상의 픽처(picture)들을 포함하는 비디오와 상기 비디오의 비트스트림 간의 변환을 규칙에 따라 수행하는 단계를 포함하되, 여기서 상기 규칙은 슬라이스의 슬라이스 종류가 그 슬라이스에 대한 참조 픽처 리스트(reference picture list)의 참조 픽처 엔트리(entry)들에 좌우된다는 것을 명시한다.
또 다른 예시적 측면에서, 비디오를 처리하는 방법이 개시된다. 방법은 하나 이상의 슬라이스들을 갖는 하나 이상의 픽처들을 포함하는 비디오와 상기 비디오의 비트스트림 간의 변환을 규칙에 따라 수행하는 단계를 포함하되, 여기서 상기 규칙은 적응 파라미터 집합(adaptation parameter set; APS)들 내의 허용된 필터들의 수 또는 APS들의 수가 비디오의 코딩된 정보에 종속됨을 명시한다.
또 다른 예시적 측면에서, 전술한 방법은 프로세서를 구비하는 비디오 인코더 장치로 구현될 수 있다.
또 다른 예시적 측면에서, 이 방법들은 프로세서 실행 가능한(processor-executable) 명령들의 형태로 구현되어 컴퓨터 독출 가능한(computer-readable) 프로그램 매체 상에 저장될 수 있다.
이들 및 다른 측면들이 이 명세서에서 더 설명된다.
도 1a는 픽처 내의 루마 및 크로마 샘플들의 기본적인 수직 및 수평 위치들을 보인다.
도 1b는 비디오 인코더의 예를 보인다.
도 2는 67개의 인트라 예측 모드들을 보인다.
도 3은 수평 및 수직 횡단 주사의 예들을 보인다.
도 4는 α 및 β의 유도에 사용된 샘플들의 위치들의 예를 보인다.
도 5는 4x8 샘플들의 블록을 2개의 독립적으로 디코딩 가능한 영역들로 분할하는 예를 보인다.
도 6은 4xN 블록들에 대한 스루풋을 최대화시키기 위한 화소들의 행들의 수직 예측자에 의한 처리의 예시적 순서를 보인다.
도 7은 저주파 비분리 변환(low-Frequency Non-Separable Transform; LFNST) 프로세스의 예를 보인다.
도 8은 4:2:2 비디오들에 대한 CCLM 파라미터들의 유도에 사용되는 이웃 크로마 샘플들과 다운샘플링된 이웃 루마 샘플들의 예를 보인다.
도 9는 비디오 처리 장치의 예를 보인다.
도 10은 비디오 인코더의 블록도이다.
도 11은 비디오 처리 방법의 예의 흐름도이다.
도 12는 비디오 처리 시스템의 예의 블록도이다.
도 13은 현재 블록의 샘플들과 사용될 상좌 샘플들의 예이다.
도 14는 예시적 비디오 코딩 시스템을 도시한 블록도이다.
도 15는 본 발명(개시된 기술)의 일부 실시예에 따른 인코더를 도시하는 블록도이다.
도 16은 본 발명의 일부 실시예에 따른 디코더를 도시하는 블록도이다.
도 17a 및 17b는 본 발명의 일부 실시예에 따른 비디오 처리의 예시적 방법의 흐름도들이다.
도 18은 본 발명의 일부 실시예에 따른 비디오 처리의 예시적 방법의 흐름도이다.
도 19a 내지 19d는 본 발명의 일부 실시예에 따른 비디오 처리의 예시적 방법의 흐름도들이다.
본 발명은 압축해제 또는 디코딩된 비디오 또는 화상의 품질을 향상시킬 수 있도록 화상 또는 비디오 비트스트림의 디코더에 사용될 수 있는 여러 가지 기법들을 제공한다. 명확성을 위해 정의하면, 이 명세서에 사용된 "비디오(video)"라는 용어는 픽처들의 시퀀스(전통적으로 비디오로 지칭)와 개별 픽처들 양자 모두를 포함한다. 뿐만 아니라, 비디오 인코더 역시 추가적 인코딩을 위해 디코딩된 프레임들을 재현하기 위한 인코딩 프로세스 동안 이 기법들을 구현할 수 있다.
이 명세서에 사용된 섹션 표제들은 이해의 편의를 위한 것이며 실시예와 기법들을 해당 섹션들로 한정하는 것은 아니다. 이에 따라, 한 섹션으로부터의 실시예들은 다른 섹션들로부터의 실시예들과 조합될 수 있다.
1. 요약(Brief Summary)
본 발명은 비디오 코딩 기술들에 관련된다. 구체적으로, 이는 화상/비디오 코딩에서의 교차 성분 선형 모델(cross-component linear model) 예측 및 다른 코딩 툴들에 관련된다. 이는 HEVC 또는 (조만간) 최종화될 참조(다용도 비디오 코딩; Versatile Video Coding) 등 기존의 비디오 코딩 표준들에 적용될 수 있다. 이는 또한 미래의 비디오 코딩 표준 또는 비디오 코덱들에도 적용 가능하다.
2. 배경(Background)
비디오 코딩 표준들은 주로 잘 알려진 ITU-T 및 ISO/IEC 표준들의 발전을 통해 발전되어 왔다. ITU-T는 H.261 및 H.263을 산출했고, ISO/IEC는 MPEG-1 및 MPEG-4 Visual을 산출했으며, 두 기관들은 협동하여 H.262/MPEG-2 Video와 H.264/MPEG-4 Advanced Video Coding (AVC) 및 H.265/HEVC 표준들을 산출했다. 비디오 코딩 표준인 H.262는 시간적 예측(temporal prediction)에 더하여 변환 코딩(transform coding)이 활용되는 하이브리드 비디오 코딩 구조에 기반한다. HEVC 너머의 미래 비디오 코딩 기술들을 탐구하기 위해, 2015년 VCEG 및 MPEG에 의해 합동으로 협동 비디오 탐구 팀(Joint Video Exploration Team; JVET)이 설립되었다. 그 이후 많은 새로운 방법들이 JVET에 의해 채택되어 합동 탐구 모델(Joint Exploration Model; JEM)로 명명된 참조 소프트웨어에 반영되었다. 2018년 4월, VCEG(Q6/16)와 ISO/IEC JTC1 SC29/WG11(MPEG) 간의 합동 비디오 전문가 팀(Joint Video Expert Team; JVET)이 창립되어 HEVC와 비교하여 50% 비트속도 감축(bitrate reduction)을 목표하는 VVC 표준에 대해 작업했다.
VVC 초안(draft)의 최신 버전, 즉 다용도 비디오 코딩(Versatile Video Coding)(Draft 7)은 다음에서 발견할 수 있고: http://phenix.it-sudparis.eu/jvet/doc_end_user/documents/16_Geneva/wg11/JVET-P2001-v9.zip
VTM으로 명명된 VVC의 최신 참조 소프트웨어는 다음에서 발견할 수 있다: https://vcgit.hhi.fraunhofer.de/jvet/VVCSoftware_VTM/-/tags/VTM-6.0
2.1. 색 공간 및 크로마 서브샘플링(Color space and chroma subsampling)
색 모델(또는 색 시스템)로도 알려진 색 공간(color space)은 색들의 범위를 숫자들의 투플(tuple)들, 전형적으로 3 또는 4개의 값들 또는 (예를 들어 RGB 등의) 색 성분(color component)들로 간단히 기술하는 추상적 수학 모델이다. 기본적으로 말해, 색 공간은 좌표계와 부분 공간(sub-space)의 합작(elaboration)이다.
비디오 압축에 있어, 가장 흔히 사용되어온 색 공간은 YCbCr와 RGB이다.
YCbCr, Y'CbCr, 또는 YCBCR 또는 Y'CBCR로도 표현되는 Y Pb/Cb Pr/Cr은 비디오 및 디지털 사진 시스템에서 칼라 화상 파이프라인(pipeline)의 일부로 사용되는 색 공간의 패밀리이다. Y는 루마 성분(luma component)이고 CB 및 CR은  청색차(blue-difference) 및 적색차(red-difference) 크로마 성분(chroma component)들이다. (프라임을 갖는) Y'는 Y와 구별되는데, 이는 휘도(luminance)로, 광도(light intensity)가 감마 보정된(gamma corrected) RGB 원색들(RGB primaries)에 기반하여 비선형적으로 인코딩된다는 것을 의미한다.
크로마 서브샘플링(chroma subsampling)은 인간 시각 시스템의 휘도보다 색차에 더 낮은 시력을 이용하여 루마 정보에 대해서보다 크로마 정보에 대해 더 낮은 해상도를 시행함으로써 화상을 인코딩하는 관행(practice)이다.
2.1.1. 4:4:4
3개의 Y'CbCr 성분들의 각각이 동일한 샘플 레이트(sample rate)를 가지므로 크로마 서브샘플링이 존재하지 않는다. 이 체계(scheme)는 때로 하이엔드(high-end) 필름 스캐너와 영화 사후 제작에 사용된다.
2.1.2. 4:2:2
2개의 크로마 성분들이 루마의 샘플 레이트의 절반으로 샘플링되는데: 수직 크로마 해상도는 변화 없는 반면 수평 크로마 해상도는 절반이다. 이는 시각 차이는 거의 없이(little to no) 비압축 비디오 신호의 밴드폭(bandwidth)을 1/3으로 감소시킨다. VVC 작업 초안(working draft)의 4:2:2 칼라 포맷의 명목상(nominal) 수직 및 수평 위치들의 예가 도 1a에 도시되어 있다.
2.1.3. 4:2:0
4:2:0에서는, 4:1:1에 비해 수평 샘플링이 2배가 되지만, 이 체계에서는 Cb 및 Cr 채널(channel)들이 한 라인 걸러서(on each alternate line)만 샘플링되므로 수직 해상도가 절반이 된다. 이에 따라 데이터 속도는 동일해진다. Cb 및 Cr는 각각 수평 및 수직 양자로 2의 비(factor)로 서브샘플링된다(sub-sampled). 4:2:) 체계에는 다른 수평 및 수직 위치(siting)를 갖는 3가지 변형들이 존재한다.
- MPEG-2에서는, Cb 및 Cr가 수평으로 동일 위치가 된다(cosited). Cb 및 Cr은 수직 방향으로 화소들 사이에 위치한다(삽입되어(interstitially) 위치한다).
- JPEG/JFIF, H.261, 및 MPEG-1에서는, Cb 및 Cr이 교번적인(alternate) 루마 샘플들 사이의 중간에 삽입되어 위치한다.
- 4:2:0 DV에서는, Cb 및 Cr이 수평 방향으로 동일 위치가 된다. 수직 방향으로는 이들이 한 라인씩 걸러 동일 위치가 된다.
표 2-1. chroma_format_idc and separate_colour_plane_flag으로부터 유도된 SubWidthC 및 SubHeightC 값들
Figure pct00001
2.2. 전형적 비디오 코덱의 코딩 흐름(Coding flow of a typical video codec)
도 1b는 VVC의 인코더 블록도의 예를 보이는데, 이는 3개의 인루프(in-loop) 필터링 블록들: 디블록킹 필터(deblocking filter; DF), 샘플 적응적 오프셋(sample adaptive offset; SAO), 및 ALF를 포함한다. 사전 정의된 필터들을 사용하는 DF와 달리, SAO 및 ALF는 현재 픽처의 원래 샘플들을 활용하여, 오프셋을 가산하고 오프셋과 필터 계수들을 시그널링(signalling)하는 코딩된(coded) 부가 정보(side information)를 갖는 유한 임펄스 응답(finite impulse response; FIR) 필터를 각각 적용함으로써 원래 샘플들과 재현된(reconstructed) 샘플들 간의 평균 제곱 오차(mean square error)들을 저감시킨다. ALF는 각 픽처의 마지막 처리 스테이지에 위치하고, 이전 스테이지들에서 생성된 아티팩트(artifact)들을 포착(catch) 및 수정(fix)하려 노력하는 툴로 간주될 수 있다.
2.3. 67개의 인트라 예측 모드들을 사용한 인트라 모드 코딩(Intra mode coding with 67 intra prediction modes)
자연 비디오에 존재하는 임의의 모서리 방향들을 포착하기 위해, 방향성 인트라 모드(directional intra mode)들의 수가 HEVC에 사용되는 33개로부터 65개로 확장되었다. 추가적인 방향성 모드들은 도 2에서 붉은 점선 화살표로 묘사되고, 평면(planar) 및 DC 모드들은 동일하게 유지된다. 이 더 조밀한 방향성 인트라 예측 모드들은 모든 블록 크기들과 루마 및 크로마 인트라 예측 양자 모두에 적용된다.
통상적인 각 인트라 예측 방향들은 도 2에 도시된 바와 같이 시계방향으로 45도로부터 -135도로 정의된다. VTM에서, 몇 가지 통상적인 각 인트라 예측 모드들이 정사각형이 아닌(non-square) 블록들에 대해 광각(wide-angle) 인트라 예측 모드로 적응적으로 치환된다(adaptively replaced). 치환된 모드들은 원래의 방법으로 시그널링되고 파싱(parsing)된 후 광각 모드들의 인덱스(index)들로 다시 매핑된다(remapped). 인트라 예측 모드들의 전체 수는 불변, 즉 67개이고 인트라 모드 코딩이 변화가 없다.
HEVC에서는, 모든 인트라 코딩된(intra-coded) 블록은 정사각형 형상을 가지고, 각 측변의 길이는 2의 거듭제곱(power)이다. 이에 따라 DC 모드를 사용하여 인트라 예측자(intra-predictor)를 생성하는 데 분할 연산(division operation)들이 요구되지 않는다. VVC에서는, 블록들이 일반적인 경우 블록 당 분할 연산을 필요로 하는 사각형 형상을 갖는다. DC 예측에 대한 분할 연산을 피하기 위해, 더 긴 측변만이 정사각형이 아닌 블록들에 대한 평균을 연산하는 데 사용된다. 도 2는 67개의 인트라 예측 모드들의 예를 보인다.
2.4. 인터 예측(Inter prediction)
각 인터 예측된 CU에 대해, 움직임 벡터들(motion vectors)로 구성된 움직임 파라미터들, 참조 픽처 인덱스들과 참조 픽처 리스트 사용 인덱스와 VVC의 새로운 코딩 특징에 필요한 추가적 정보들이 인터 예측된 샘플 생성에 사용된다. 움직임 파라미터는 명시적 또는 암묵적 방식으로 시그널링될 수 있다. CU가 스킵 모드(skip mode)로 코딩되면, CU는 하나의 PU에 연계되어 중요 잔차 계수(significant residual coefficient)를 갖지 않고 움직임 벡터 델타 또는 참조 픽처 인덱스를 갖지 않는다. 머지 모드(merge mode)가 명시됨으로써 공간 및 시간 후보(candidate)들을 포함하여 현재 CU에 대한 움직임 파라미터들이 이웃 CU들로부터 얻어지고 추가적 스케줄들이 VVC에 도입된다. 머지 모드는 스킵 모드뿐 아니라 모든 인터 예측된 CU에 적용될 수 있다. 머지 모드에 대한 대안은 움직임 파라미터들의 명시적 전송인데, 여기서 각 참조 픽처 리스트과 참조 픽처 리스트 사용 플래그(flag)에 대응하는 참조 픽처 인덱스와 다른 필요 정보가 각 CU 당 명시적으로 시그널링된다.
2.5. 인트라 블록 복사(Intra block copy; IBC)
인트라 블록 복사(IBC)는 SCC에 대한 HEVC 확장에서 채택된 툴이다. 이는 픽처 콘텐츠 소재(screen content material)들의 코딩 효율을 현저히 향상시키는 것으로 잘 알려져 있다. IBC 모드는 블록 레벨의 코딩 모드로 구현되므로, 각 CU에 대한 최적 블록 벡터(또는 움직임 벡터)를 파악하기 위해 블록 정합(block matching; BM)이 인코더에서 수행된다. 여기서 블록 벡터는 현재 블록으로부터 참조 블록으로의 변위를 표시하는 데 사용되는데, 이는 현재 픽처 내부에 이미 재현되어 있다. IBC 코딩된 CU의 루마 블록 벡터는 정수 정밀도(integer precision)를 갖는다. 크로마 블록 벡터 역시 정수 정밀도로 반올림된다. AMVR과 조합되면, IBC 모드는 1 펠(pel) 내지 4 펠의 움직임 벡터 정밀도 간에 전환될 수 있다. IBC 코딩된 CU는 인트라 또는 인터 예측 모드들이 아닌 제3의 예측 모드로 간주된다. IBC 모드는 64 루마 샘플 이하의(smaller than or equal) 폭 및 높이 양자에 적용될 수 있다.
인코더 측에서, IBC에 대해 해쉬 기반(hash-based) 움직임 예측(motion estimation)이 수행된다. 인코더는 16 루마 샘플 이하(no larger than)의 폭 또는 높이의 어느 것을 갖는 블록들에 대해 RD 검사(RD check)를 수행한다. 비머지 모드(non-merge mode)에 대해서는, 해쉬 기반 검색을 먼저 사용하여 블록 벡터 검색이 수행된다. 해쉬 검색이 유효한 후보를 산출하지 않으면 블록 정합 기반(block matching based)의 로컬 검색(local search)이 수행될 것이다.
해쉬 기반 검색에서, 현재 블록과 참조 블록 간의 해쉬 키 정합(hash key matching)(32-bit CRC)이 모든 허용된 블록 크기들로 확장된다. 현재 픽처의 모든 위치에서의 해쉬 키 연산은 4x4 하부블록(sub-block)들에 기반한다. 더 큰 크기의 현재 블록에 대해, 해쉬 키는 모든 4x4 하부블록들의 해쉬 키들이 대응 참조 위치들에서의 해쉬 키들과 정합될 때 참조 블록의 해쉬 키와 정합되도록 결정된다. 복수의 참조 블록들의 해쉬 키들이 현재 블록의 해쉬 키와 정합됨이 파악되면, 각 정합된 기의 블록 벡터 비용(cost)이 연산되어, 최소 비용을 갖는 것이 선택된다.
블록 정합 검색에서, 검색 범위는 이전 및 현재 CU 양자를 포괄하도록 설정된다.
CU 레벨에서, IBC 모드가 플래그와 함께 시그널링되는데, 이는 다음과 같이 IBC AMVP 모드 또는 IBC 스킵/머지 모드로 시그널링될 수 있다:
- IBC 스킵/머지 모드: 이웃 후보 IBC 코딩된 블록들로부터의 리스트의 블록 벡터들의 어느 것이 현재 블록을 예측하는 데 사용될지를 표시하는 데 머지 후보 인덱스가 사용된다. 머지 리스트는 공간(spatial), HMVP, 및 쌍대(pairwise) 후보들로 구성된다.
- IBC AMVP 모드: 블록 벡터 차이가 움직임 벡터 차이와 동일한 방식으로 코딩된다. 블록 벡터 예측 모드는 2개의 후보들을 예측자로 사용하는데, (IBC 코딩되었다면) 하나는 좌측 이웃, 하나는 상측 이웃으로부터이다. 어느 이웃도 사용이 불가능하면, 디폴트 블록 벡터가 예측자로 사용될 것이다. 플래그가 시그널링되어 블록 벡터 예측자 인덱스를 표시한다.
2.6. 팔레트 모드(Palette mode)
팔레트 모드(palette mode) 시그널링(signalling)을 위해, 팔레트 모드가 코딩 유닛(coding unit)을 위한 예측 모드로 코딩, 즉 코딩 유닛에 대한 예측 모드가 MODE_INTRA, MODE_INTER, MODE_IBC 및 MODE_PLT가 될 수 있다. 팔레트 모드가 활용되면, CU 내의 화소값들이 대표적 색 값들의 작은 집합으로 표현된다. 이 집합이 팔레트로 지칭된다. 팔레트 색상들에 가까운 값들을 갖는 화소들에 대해, 팔레트 인덱스들이 시그널링된다. 팔레트 밖의 값들을 갖는 화소들에 대해, 화소는 이스케이프 심볼(escape symbol)로 표기되고 양자화된 화소값들이 직접 시그널링된다.
팔레트 인코딩된 블록을 디코딩하기 위해, 디코더는 팔레트 색상과 인덱스들을 디코딩할 필요가 있다. 팔레트 색상들은 팔레트 테이블로 기술되고 팔레트 테이블 코딩 툴에 의해 인코딩된다. 현재 CU에 이스케이프 심볼들이 존재하면 이를 표시하도록 각 CU에 대해 이스케이프 플래그가 시그널링된다. 이스케이프 심볼들이 존재하면, 팔레트 테이블이 1만큼 증가되고 마지막 인덱스가 이스케이프 모드에 할당된다. CU의 모든 화소들의 팔레트 인덱스들이 팔레트 인덱스 맵을 형성하고 팔레트 인덱스 맵 코딩 툴로 인코딩된다.
팔레트 테이블의 코딩을 위해, 팔레트 예측자가 유지된다. 예측자는 예측자가 0으로 리셋(reset)되는 각 슬라이스(slice)의 시작에서 초기화된다. 팔레트 예측자의 각 엔트리에 대해, 이것이 현재 팔레트의 일부인지 여부를 표시하도록 재사용 플래그(reuse flag)가 시그널링된다. 재사용 플래그들은 0(zero)들의 런-길이 코딩(run-length coding)을 사용하여 전송된다. 그 다음, 새로운 팔레트 엔트리들의 수가 0차(order)의 지수 골롬 코드(exponential Golomb code)를 사용하여 시그널링된다. 현재 CU의 인코딩 후, 팔레트 예측자가 현재 팔레트를 사용하여 갱신되고, 현재 팔레트에서 재사용되지 않는 이전 팔레트 예측자로부터의 엔트리들은 허용된 최대 크기에 도달할 때까지 새로운 팔레트 예측자의 종단에 추가된다(팔레트 채움; palette stuffing)
팔레트 인덱스 맵의 코딩을 위해, 인덱스들은 도 3에 도시된 바와 같이 수평 및 수직 횡단 주사(traverse scan)들을 사용하여 코딩된다. 이 주사 순서는 비트스트림 내에 palette_transpose_flag을 사용하여 명시적으로 시그널링된다.
도 3은 수평 및 수직 횡단 주사들의 예들을 보인다.
팔레트 인덱스들은 2개의 주(main) 팔레트 샘플 모드: 'INDEX' 및 'COPY_ABOVE'를 사용하여 코딩된다. 이 모드는 수평 주사가 사용될 때 최상측 행(top row)을 제외하고, 수직 주사가 사용되거나 이전 모드가 'COPY_ABOVE'일 때 제1 열(column)에 플래그를 사용하여 시그널링된다. 'COPY_ABOVE' 모드에서는, 위쪽 행(row above)의 샘플의 팔레트 인덱스가 복사된다. 'INDEX' 모드에서는, 팔레트 인덱스가 명시적으로 시그널링된다. 'INDEX' 및 'COPY_ABOVE' 모드 양자에 대해, 실행값(run value)이 시그널링되어 같은 모드를 사용하여 코딩된 화소들의 수를 명시한다.
인덱스 맵(index map)의 인코딩 순서는 다음과 같다: 먼저 CU에 대한 인덱스 값들의 수가 시그널링된다. 이에 이어 절사 2진 코딩(truncated binary coding)을 사용하여 전체 CU에 대한 실제 인덱스 값들을 시그널링한다. 인덱스들의 수뿐 아니라 인덱스 값들도 바이패스 모드(bypass mode)로 코딩된다. 이는 인덱스 관련 바이패스 빈(bin)들을 함께 묶는다. 이어서 팔레트 모드(INDEX 또는 COPY_ABOVE)와 실행(run)이 인터리브(interleaved) 방식으로 시그널링된다. 마지막으로, 전체 CU에 대한 이스케이프 샘플들에 해당하는 성분 이스케이프 값들이 함께 묶여 바이패스 모드로 코딩된다. 추가적인 신택스 요소, last_run_type_flag이 인덱스 값들의 시그널링 이후에 시그널링된다. 이 신택스 요소는 인덱스들의 수와 연계하여 블록의 마지막 런(last run)에 해당하는 런 값을 시그널링할 필요를 제거한다.
VTM에서는, 이중 트리(dual tree)가 루마(Luma)와 크로마(Chroma)를 구획하도록 코딩 유닛을 분리하는 I 슬라이스에 대해 인에이블된다(enabled). 이에 따라 이 제안에서는 팔레트가 루마(Y 성분)와 크로마(Cb 및 Cr 성분들)에 별도로 적용된다. 이중 트리가 디스에이블되면(disabled) 팔레트는 HEVC 팔레트에서와 같이 Y, Cb, Cr 성분들에 공통으로 적용될 것이다.
2.7. 교차 성분 선형 모델 예측(Cross-component linear model prediction)
교차 성분 선형 모델(cross-component linear model; CCLM) 예측 모드가 VVC에서 사용되는데, 여기서 크로마 샘플들이 선형 모델을 사용하여 동일한 CU에서 재현된 루마 샘플들에 기반하여 다음과 같이 예측된다:
Figure pct00002
여기서 predc(i,j)는 CU 내의 예측된 크로마 샘플들을 나타내고 recL(i,j)는 동일한 CU의 다운샘플링된 재현 루마 샘플들을 나타낸다.
도 4는 좌 및 상 샘플들의 위치와 LM 모드에 관련된 현재 블록의 샘플의 예를 보인다.
도 4는 α 및 β의 유도에 사용된 샘플들의 위치들의 예를 보인다.
상측 템플릿(above template)과 좌측 템플릿(left template)이 LM 모드에서 함께 선형 모델 계수를 연산하는 데 사용될 수 있을 뿐 아니라, 이들은 다른 2개의 LM 모드들에 치환적으로 사용될 수 있어서 LM_A, 및 LM_L 모드들로 지칭된다. LM_A 모드에서는, 상측 템플릿만이 선형 모델 계수의 연산에 사용된다. 더 많은 샘플들을 얻기 위해, 상측 템플릿은 (W+H)로 확장된다. LM_L 모드에서는, 좌측 템플릿만이 선형 모델 계수의 연산에 사용된다. 더 많은 샘플들을 얻기 위해, 좌측 템플릿은 (H+W)로 확장된다. 정사각형이 아닌(non-square block)블록에 대해서는, 상측 템플릿이 W+W로 확장되고, 좌측 템플릿이 H+H로 확장된다.
CCLM 파라미터들(α 및 β)들은 최대 4개의 이웃 크로마 샘플들과 다운샘플링된 그 대응 루마 샘플들로 유도된다. 현재 크로마 블록 크기를 WxH로 가정하면, W' 및 H'들은 다음과 같이 설정된다.
- LM 모드가 적용될 때 W'=W, H'=H;
- LM-A 모드가 적용될 때 W'=W+H;
- LM-L 모드가 적용될 때 H'=H+W;
위쪽 이웃 위치들은 S[0, -1]... S[W'-1, -1]로 표기되고 좌측 이웃 위치들은 S[-1, 0]... S[-1, H'-1]로 표기된다. 그러면 4개의 샘플들은 다음과 같이 선택되는데
- LM 모드가 적용되고 상측 및 좌측 이웃 샘플들이 모두 사용 가능할 때 S[W'/4, -1], S[3W'/4, -1], S[-1, H'/4], S[-1, 3H'/4];
- LM-A 모드가 적용되거나 상측 이웃 샘플만이 사용 가능할 때 S[W'/8, -1], S[3W'/8, -1], S[5W'/8, -1], S[7W'/8, -1];
- LM-L 모드가 적용되거나 좌측 이웃 샘플만이 사용 가능할 때 S[-1, H'/8], S[-1, 3H'/8], S[-1, 5H'/8], S[-1, 7H'/8];
선택된 위치들에서의 4개의 이웃 루마 샘플들이 다운샘플링되고 2개의 더 작은 값들: x 0 A x 1 A 과 2개의 더 큰 값들: x 0 B x 1 B 를 파악하도록 4회 비교된다. 이들의 대응 크로마 샘플값들은 y 0 A , y 1 A , y 0 B , 및 y 1 B .로 표기된다. 그러면 x A , x B , y A , 및 y B 들은 다음과 같이 유도된다:
Figure pct00003
마지막으로, 선형 모델 파라미터(α 및 β)들이 다음 식들에 따라 얻어진다.
Figure pct00004
파라미터 α를 연산하는 나눗셈 연산은 룩업 테이블(look-up table)로 구현된다. 이 테이블의 저장에 요구되는 메모리의 절감을 위해 diff 값(최대 및 최소값 간의 차이)과 파라미터 α가 지수 표기로 표현된다. 예를 들어, diff 가 4-bit의 유효 부분(significant part)과 지수로 근사된다. 결과적으로, 1/diff에 대한 테이블이 유효숫자(significand)의 16개의 값에 대해 다음과 같은 16 요소들로 축소되는데:
Figure pct00005
이는 연산의 복잡성뿐 아니라 필요한 테이블을 저장하는 데 필요한 메모리 크기도 축소하는 이점이 있다.
4:2:0 비디오 시퀀스들에 대한 크로마 샘플 위치들을 정합시키기 위해, 2가지 종류의 다운샘플링 필터가 루마 샘플들에 적용되어 수평 및 수직 양방향에 2 대 1 다운샘플링 비를 달성한다. 다운샘플링 필터의 선택은 SPS 레벨 필터로 명시된다. 이 2가지 다운샘플링 필터들은 다음과 같은데, 이들은 각각 "type-0" 및 "type-2" 콘텐츠(content)에 대응한다.
Figure pct00006
위쪽(upper) 참조 라인이 CTU 경계에 있을 때 단지 하나의 루마 라인(인트라 예측에서의 일반 라인 버퍼(general line buffer))이 다운샘플링된 루마 샘플들을 구성하는 데 사용된다.
이 파라미터 연산은 단순히 인코더 검색 연산이 아닌 디코딩 프로세스의 일부로 수행된다. 결과적으로 α 및 β 값들을 디코더에 전달하는 데 신택스가 사용되지 않는다.
크로마 인트라 모드 코딩을 위해, 전체 8개의 인트라 모드들이 크로마 인트라 모드 코딩에 허용된다. 이 모드들은 5개의 전통적 인트라 모드들과 3개의 교차 성분 선형 모델 모드(LM, LM_A, 및 LM_L)들을 포함한다. 크로마 모드 시그널링과 유도 프로세스는 표 2-2에 보인다. 크로마 모드 코딩은 대응 루마 블록의 인트라 예측 모드에 직접 좌우된다. 루마 및 크로마 성분들에 대한 별도의 블록 구획 구조가 I개의 슬라이스들에서 인에이블되는데, 하나의 크로마 블록이 복수의 루마 블록들에 대응할 수 있다. 이에 따라 Chroma DM 모드에 대해, 현재 크로마 블록의 중심 위치를 포괄하는 대응 루마 블록의 인트라 예측 모드가 직접 승계된다(inherited).
표 2-2. cclm_is가 인에이블되었을 때 루마 모드로부터의 크로마 예측 모드의 유도
Figure pct00007
JVET-Q2001-vE에서의 INTRA_LT_CCLM, INTRA_L_CCLM 및 INTRA_T_CCLM 인트라 예측 모드의 사양
8.4.5.2.13
이 프로세스에 대한 입력들은:
- 인트라 예측 모드 predModeIntra,
- 현재 픽처의 상-좌 샘플에 대한 현재 변환 블록의 상좌 샘플의 샘플 위치(xTbC, yTbC),
- 변환 블록 폭을 명시하는 변수 nTbW,
- 변환 블록 높이를 명시하는 변수 nTbH,
- 현재 블록의 색상 성분을 명시하는 변수 cIdx,
- 크로마 이웃 샘플들 p[x][y], 여기서 x = -1, y = 0... 2 * nTbH - 1 및 x = 0... 2 * nTbW - 1, y = -1.
이 프로세스의 출력은 예측된 샘플들 predSamples[x][y]인데, 여기서 x = 0... nTbW - 1, y = 0... nTbH - 1.
현재 루마 위치(xTbY, yTbY)는 다음과 같이 유도된다:
Figure pct00008
변수 availL, availT, 및 availTL들은 다음과 같이 유도된다:
- 6.4.4 절(clause)에 명시된 바와 같은 인접 블록 사용 가능성(availability)에 대한 유도 프로세스는, (xTbY, yTbY)로 설정된 현재 루마 위치(xCurr, yCurr), 이웃 루마 위치 (xTbY - 1, yTbY), FALSE로 설정된 checkPredModeY, 및 cIdx를 입력으로 하여 실행되어지고, 출력은 availL 로 할당된다.
- 6.4.4 절에 명시된 바와 같은 인접 블록 사용 가능성(availability)에 대한 유도 프로세스는, (xTbY, yTbY)로 설정된 현재 루마 위치(xCurr, yCurr), 이웃 루마 위치 (xTbY, yTbY - 1), FALSE로 설정된 checkPredModeY, 및 cIdx를 입력으로 하여 실행되어지고, 출력은 availT 로 할당된다.
- 변수 availTL은 다음과 같이 유도된다:
Figure pct00009
- 사용 가능한 상-우 이웃 크로마 샘플들의 수는 다음과 같이 유도된다:
- 변수 numTopRight가 0과 같게 설정되고 availTR이 TRUE와 같게 설정된다.
- predModeIntra가 INTRA_T_CCLM과 같을 때, availTR이 FALSE이거나 x가 2 * nTbW - 1이 될 때까지 다음이 x = nTbW... 2 * nTbW - 1에 적용된다:
- 6.4.4 절에 명시된 바와 같은 인접 블록 사용 가능성(availability)에 대한 유도 프로세스는, (xTbY, yTbY)로 설정된 현재 루마 위치(xCurr, yCurr), 이웃 루마 위치(xTbY + x, yTbY - 1), FALSE로 설정된 checkPredModeY, 및 cIdx를 입력으로 하여 실행되어지고, 출력은 availTR 로 할당된다.
- availTR이 TRUE일 때, numTopRight가 1만큼 증분된다.
- 사용 가능한 좌-하(left-below) 이웃 크로마 샘플들의 수 numLeftBelow는 다음과 같이 유도된다:
- 변수 numLeftBelow가 0과 같게 설정되고 availLB가 TRUE와 같게 설정된다.
- predModeIntra가 INTRA_L_CCLM일 때, availLB가 FALSE이거나 y가 2 * nTbH - 1이 될 때까지 ekdmaa이 y = nTbH... 2 * nTbH - 1에 적용되고:
- 6.4.4 절에 명시된 바와 같은 인접 블록 사용 가능성(availability)에 대한 유도 프로세스는, (xTbY, yTbY)로 설정된 현재 루마 위치(xCurr, yCurr), 이웃 루마 위치 (xTbY - 1, yTbY + y), FALSE로 설정된 checkPredModeY, 및 cIdx를 입력으로 하여 실행되어지고, 출력은 availLB 로 할당된다.
- availLB가 TRUE일 때, numLeftBelow가 1만큼 증분된다.
상측 및 상-우측 상의 사용 가능한 이웃 크로마 샘플들의 수 numSampT와 좌측 및 좌-하측 상의 사용 가능한 이웃 크로마 샘플들의 수 numSampL은 다음과 같이 유도된다:
- predModeIntra가 INTRA_LT_CCLM이면, 다음이 적용된다:
Figure pct00010
- 그렇지 않으면 다음이 적용된다:
Figure pct00011
변수 bCTUboundary는 다음과 같이 유도된다:
Figure pct00012
변수 cntN와 N이 L 및 T로 치환된 행렬(array) pickPosN은 다음과 같이 유도되는데 :
- 변수 numIs4N은 다음과 같이 유도된다:
Figure pct00013
- 변수 startPosN이 numSampN >> (2 + numIs4N)과 같게 설정된다.
- 변수 pickStepN 이 Max(1, numSampN >> (1 + numIs4N))과 같게 설정된다.
- availN이 TRUE이고 predModeIntra가 INTRA_LT_CCLM 또는 INTRA_N_CCLM이면, 다음 할당이 이뤄지는데:
- cntN이 Min(numSampN, (1 + numIs4N) << 1)와 같게 설정된다.
- pickPosN[pos]가 (startPosN = pos * pickStepN)와 같게 설정되는데, 여기서 pos = 0... cntN - 1.
- 그렇지 않으면 cntN이 0과 같게 설정된다.
예측 샘플 predSamples[x][y](여기서 x= 0... nTbW - 1, y = 0... nTbH - 1)들은 다음과 같이 유도된다:
- numSampL 및 numSampT 모두 0이면 다음이 적용된다:
Figure pct00014
- 그렇지 않으면 다음 순서의 단계들이 적용된다:
1. 동치(collocated) 루마 샘플 pY[x][y](여기서 x = 0... nTbW * SubWidthC - 1, y = 0... nTbH * SubHeightC - 1)들은 위치(xTbY + x, yTbY + y)들에서의 디블록킹 필터 처리에 앞서 재현된 루마 샘플들과 같게 설정된다.
2. 이웃 루마 샘플 pY[x][y]들은 다음과 같이 유도된다:
- numSampL이 0보다 크면, 이웃 좌측 루마 샘플 pY[x][y](여기서 x = -1... -3, y = 0... SubHeightC*numSampL - 1)들은 위치(xTbY + x, yTbY +y)들에서의 디블록킹 필터 처리 전에 재현 루마 샘플들과 같게 설정된다.
- availT가 FALSE이면, 이웃 상측 루마 샘플 pY[x][y](여기서 x = -1... SubWidthC * numSampT - 1, y = -1... -2)들은 루마 샘플 pY[x][0]들과 같게 설정된다.
- availL이 FALSE이면, 이웃 좌측 루마 샘플 pY[x][y](여기서 x = -1... -3, y = -1... SubHeightC * numSampL - 1)들은 루마 샘플 pY[0][y]들과 같게 설정된다.
- numSampT가 0보다 크면, 이웃 상측 루마 샘플 pY[x][y](여기서 x = 0... SubWidthC * numSampT - 1, y = -1, -2)들은 위치(xTbY + x, yTbY + y)에서의 디블록킹 필터 처리 전에 재현 루마 샘플들과 같게 설정된다.
- availTL이 TRUE이면, 이웃 상-좌 루마 샘플 pY[x][y](여기서 x = -1, y = -1, -2)들은 위치(xTbY + x, yTbY + y)에서의 디블록킹 필터 처리 이전의 재현 루마 샘플들과 같게 설정된다.
3. 다운샘플링된 동치 루마 샘플 pDsY[x][y](여기서 x = 0... nTbW - 1, y = 0... nTbH - 1)들은 다음과 같이 유도된다:
- SubWidthC 및 SubHeightC 양자 모두 1이면, 다음이 적용된다:
- pDsY[x][y](여기서 x = 1... nTbW - 1, y = 1... nTbH - 1)는 다음과 같이 유도된다:
Figure pct00015
- 그렇지 않으면 다음이 적용된다:
- 1차원 필터계수 행렬 F1 및 F2와 2차원 필터 계수 행렬 F3 및 F4는 다음과 같이 명시된다:
Figure pct00016
- SubWidthC 및 SubHeightC 양자 모두 2이면, 다음이 적용된다:
Figure pct00017
- 그렇지 않으면 다음이 적용된다:
Figure pct00018
- sps_chroma_vertical_collocated_flag이 1이면, 다음이 적용된다:
- pDsY[x][y](여기서 x = 0... nTbW - 1, y = 0... nTbH - 1)는 다음과 같이 유도된다:
Figure pct00019
- 그렇지 않으면(sps_chroma_vertical_collocated_flag이 0이면), 다음이 적용된다:
- pDsY[x][y](여기서 x = 0... nTbW - 1, y = 0... nTbH - 1)는 다음과 같이 유도된다:
Figure pct00020
4. numSampL가 0보다 크면, 선택된 좌측 크로마 샘플 pSelC[idx]들은 p[-1][pickPosL[idx]](여기서 idx = 0... cntL = 1)와 같게 설정되고, 선택된 다운샘플링된 이웃 좌측 루마 샘플 pSelDsY[idx](여기서 idx = 0... cntL - 1)들은 다음과 같이 유도된다:
- 변수 y가 pickPosL[idx]와 같게 설정된다.
- SubWidthC 및 SubHeightC 양자 모두 1이면, 다음이 적용된다:
Figure pct00021
- 그렇지 않으면 다음이 적용된다:
- sps_chroma_vertical_collocated_flag이 1이면 다음이 적용된다:
Figure pct00022
- 그렇지 않으면(sps_chroma_vertical_collocated_flag이 0이면) 다음이 적용된다:
Figure pct00023
5. numSampT가 0보다 크면, 선택된 이웃 상측 크로마 샘플 pSelC[idx]들은 p[pickPosT[idx - cntL]][-1](여기서 idx = cntL... cntL + cntT - 1)과 같게 설정되고, 다운샘플링된 이웃 상측 루마 샘플 pSelDsY[idx](여기서 idx = 0... cntL + cntT - 1)들은 다음과 같이 명시되는데:
- 변수 x는 pickPosT[idx - cntL]와 같게 설정된다.
- SubWidthC 및 SubHeightC 양자 모두 1이면. 다음이 적용된다:
Figure pct00024
- 그렇지 않으면 다음이 적용된다:
- sps_chroma_vertical_collocated_flag이 1이면, 다음이 적용된다:
- bCTUboundary가 FALSE이면, 다음이 적용된다:
Figure pct00025
- 그렇지 않으면(bCTUboundary가 TRUE이면), 다음이 적용된다:
Figure pct00026
- 그렇지 않으면(sps_chroma_vertical_collocated_flag이 0이면), 다음이 적용된다:
- bCTUboundary가 FALSE이면, 다음이 적용된다:
Figure pct00027
- 그렇지 않으면(bCTUboundary가 TRUE이면), 다음이 적용된다:
Figure pct00028
6. cntT + cntL이 0이 아니면, 변수 minY, maxY, minC, 및 maxC들이 다음과 같이 유도된다:
- cntT + cntL가 2이면, pSelComp[3]이 pSelComp[0]와 같게 설정되고, pSelComp[2]가 pSelComp[1]와 같게 설정되며, pSelComp[0]이 pSelComp[1]와 같게 설정되고, 그리고 pSelComp[1]가 pSelComp[3]와 같게 설정되는데 여기서 Comp는 DsY 및 C로 치환된다.
- 행렬 minGrpIdx 및 maxGrpIdx들은 다음과 같이 유도된다:
Figure pct00029
- pSelDsY[minGrpIdx[0]]이 pSelDsY[minGrpIdx[1]]보다 크면, minGrpIdx[0]과 minGrpIdx[1]들이 다음과 같이 스왑된다(swapped):
Figure pct00030
- pSelDsY[maxGrpIdx[0]]이 pSelDsY[maxGrpIdx[1]]보다 크면, maxGrpIdx[0]과 maxGrpIdx[1]들이 다음과 같이 스왑된다:
Figure pct00031
- pSelDsY[minGrpIdx[0]]이 pSelDsY[maxGrpIdx[1]]보다 크면, 행렬 minGrpIdx와 maxGrpIdx들이 다음과 같이 스왑된다:
Figure pct00032
- pSelDsY[minGrpIdx[1]]이 pSelDsY[maxGrpIdx[0]]보다 크면, minGrpIdx[1]와 maxGrpIdx[0]들이 다음과 같이 스왑된다:
Figure pct00033
- 변수 maxY, maxC, minY, 및 minC들은 다음과 같이 유도된다:
Figure pct00034
7. 변수 a, b, 및 k들은 다음과 같이 유도된다:
- numSampL이 0이고, numSampT가 0이면 다음이 적용된다:
Figure pct00035
- 그렇지 않으면 다음이 적용된다:
Figure pct00036
- diff가 0이 아니면, 다음이 적용된다:
Figure pct00037
여기서 divSigTable[ ]은 다음과 같이 명시된다:
Figure pct00038
- 그렇지 않으면(diff가 0이면), 다음이 적용된다:
Figure pct00039
8. 예측 샘플 predSamples[x][y](여기서 x = 0... nTbW - 1, y = 0... nTbH - 1)들은 다음과 같이 유도된다:
Figure pct00040
참고(NOTE) - 이 프로세스는 sps_chroma_vertical_collocated_flag을 사용한다. 그러니 구현을 간략화하기 위해 sps_chroma_horizontal_collocated_flag을 사용하지 않는다.
2.8. 블록 차분 펄스 코드 변조 코딩(Block differential pulse-code modulation coding; BDPCM)
BDPCM은 JVET-M0057에 제안되었다. 현재 화소의 예측에 좌측 (A)(또는 상측 (B)) 화소를 사용하는 수평(또는 수직) 예측자의 형태 때문에, 블록을 처리할 가장 스루풋 효율적인 방법(throughput-efficient way)은 하나의 열(또는 라인)의 모든 화소들을 평행으로 처리하고, 이 열(또는 라인)들을 순차적으로 처리하는 것이다. 스루풋의 향상을 위해, 다음 프로세스를 도입하는데: 이 블록 상에 선택된 예측자가 수직이면 폭 4의 블록이 수평 경계(horizontal frontier)를 갖는 2개의 반부들(two halves)로 분할되고, 이 블록 상에 선택된 예측자가 수평이면 높이 4의 블록이 수직 경계를 갖는 2개의 반부들로 분할된다.
블록이 분할되면, 한 영역의 샘플들은 예측의 연산에 다른 영역의 화소의 사용이 허용되지 않는데; 이 상황이 발생되면 예측 화소는 예측 방향의 참조 화소로 치환된다. 이는 수직으로 예측된 4x8 블록에서 현재 화소(X)의 다른 위치들에 대해 도 5에 보인다.
도 5는 4x8 샘플들의 블록을 2개의 독립적으로 디코딩 가능한(decodable) 영역들로 분할하는 예를 보인다.
이 특성 덕분에, 도 6에 보인 바와 같이 이제 4x4 블록을 2사이클에, 4x8 또는 8x4 블록을 4사이클로 등등 처리하는 것이 가능해졌다.
도 6은 수직 예측자를 갖는 4xN 블록들의 스루풋을 최대화하기 위해 화소들의 행들을 처리하는 예시적 순서를 보인다.
표 2-3은 블록의 처리에 요구되는 사이클들의 수를 요약한다. 8 이상의 크기를 갖는 어떤 블록이 사이클 당 8 화소 이상으로 처리될 수 있음을 보이는 것은 사소한 일이다.
표 2-3. Worst case throughput for blocks of size 4xN, Nx4 크기의 블록들에 대한 최악의 경우의 스루풋
Figure pct00041
2.9. 양자화 잔차 도메인 BDPCM(Quantized residual domain BDPCM)
JVET-N0413에서는, 양자화 잔차 도메인 BDPCM(quantized residual domain BDPCM)(이하 RBDPCM으로 표기함)이 제안된다. 상기 인트라 예측은 인트라 예측과 유사하게 예측 방향(수평 또는 수직 예측)으로의 샘플 복사에 의해 전체 블록에 대해 수행된다. 잔차가 양자화되고 양자화된 잔차와 그 예측자(수평 또는 수직) 양자화 값들 사이의 델타(delta)가 코딩된다.
크기 M(행) x N(열)의 블록에 대해
Figure pct00042
을 상측 또는 좌측 블록 경계 샘플들로부터의 필터링되지 않은(unfiltered) 샘플들을 사용하여 수평으로(왼쪽 이웃 화소값을 예측 블록에 걸쳐 라인별로 복사) 또는 수직으로(위쪽 이웃 라인을 예측 블록의 각 라인에 복사) 인트라 예측을 수행한 이후의 예측 잔차라고 하자.
Figure pct00043
잔차 r i,j ()의 양자화된 버전을 표기한다고 하는데, 여기서 잔차는 원래의 블록과 예측 블록 값들 간의 차이이다. 이어서 블록 DPCM이 양자화된 잔차 샘플에 적용되어, 요소
Figure pct00044
들을 갖는 수정된 M x N 행렬
Figure pct00045
로 결과된다. 수직 BDPCM이 시그널링되면:
Figure pct00046
수평 예측에 대해 유사한 규칙이 적용되어 잔차 양자화 샘플들은 다음으로 얻어진다.
Figure pct00047
잔차 양자화 샘플
Figure pct00048
들이 디코더로 전송된다.
디코더 측에서는, 위 연산들이 반전되어
Figure pct00049
을 산출한다. 수직 예측 경우에 대해,
Figure pct00050
수평 예측 경우에 대해,
Figure pct00051
역(inverse) 양자화 잔차
Figure pct00052
이 인트라 블록 예측값에 가산되어 재현된 샘플값들을 산출한다.
이 체계의 주된 이점은 반전 DPCM이 계수 파싱(coefficient parsing) 동안 계수들의 파싱에 따라 단순히 예측자를 가산하거나 파싱 후에 수행할 수 있어 편리하게(on the fly) 수행될 수 있다는 것이다.
변환 스킵은 양자화 잔차 도메인 BDPCM에 항상 사용된다.
2.10. VVC에서의 다중 변환 집합(Multiple Transform Set; MTS)
VTM에서는 65x64까지의 큰 블록 크기 변환이 인에이블되는데, 이는 주로 예를 들어 1080p 또는 4K 시퀀스 등의 고해상도 비디오에 유용하다. 고주파 변환 계수들은 64의 크기(폭 또는 높이, 또는 폭 및 높이 모두)를 갖는 블록들을 변환하기 위해 삭감되어(zeroed out) 저주파 계수들만이 유지된다. 예를 들어, M x N 변환 블록(여기서 M은 블록 폭, N은 블록 높이)에 대해, M이 64이면 변환 계수들의 좌측 32개의 열들만이 유지된다. 마찬가지로 N이 64이면, 변환 계수들의 상측 32행만이 유지된다. 변환 스킵 모드가 큰 블록에 사용되면, 전체 블록이 어떤 값들을 삭감하지 않고 사용된다. VTM 역시 SPS에서 설정 가능한(configurable) 최대 변환 크기를 지원하여, 인코더는 특정한 구현예의 요구에 따라 16 길이(length), 32 길이, 또는 64 길이까지의 변환 크기를 선택할 수 있는 유연성을 갖는다.
HEVC에 채택된 DCT-II에 추가하여 다중 변환 선택(Multiple Transform Selection MTS) 체계가 인터 및 인트라 코딩된 블록 모두의 잔차 코딩에 사용된다. 이는 DCT8/DST7로부터 다중으로 선택된 변환들을 사용한다. 새롭게 도입된 변환 행렬(matrix)들은 DST-VII 및 DCT-VIII이다. 표 2-4는 선택된 DST/DCT의 기저함수(basis function)들을 보인다.
표 2-4. N 점 입력에 대한 DCT-II/ VIII 및 DSTVII의 변환 기저함수들
Figure pct00053
변환 행렬의 직교성(orthogonality)를 유지하기 위해, 변환 행렬은 HEVC의 변환 행렬보다 더 정교하게 양자화된다. 변환 계수들의 중간 값들을 16 비트 범위 내에 유지하기 위해, 수평 변환과 수직 변환 이후 모든 계수들은 10 비트를 갖게 된다.
MTS 체계를 제어하기 위해, 별도의 인에이블링 플래그(enabling flag)들이 SPS레벨에서 인트라 및 인터에 대해 명시된다. MTS가 SPS에서 인에이블링되었을 때 CU 레벨 플래그가 시그널링되어 MTS가 적용될지 여부를 표시한다. 여기사 MTS는 루마에 대해서만 적용된다. MTS CU 레벨 플래그은 다음 조건들이 충족될 경우 시그널링된다.
- 폭과 높이모두 32보다 작거나 같다.
- CBF 플래그가 1이다.
MTS CU 플래그가 0이면, DCT2가 양 방향에 적용된다, 그러나 MTS CU 플래그가 1이면, 2개의 다른 플래그들이 추가적으로 시그널링되어 수평 및 수직 방향에 대한 변환 종류를 각각 표시한다. 변환 및 시그널링 매핑 테이블을 표 2-5에 보인다. ISP에 대한 변환 선택과 암묵적 MTS의 통합이 인트라 모드와 블록 형상 의존성을 제거함으로써 사용된다. 현재 블록이 ISP 모드이거나 현재 블록이 인트라 블록이고 인트라 및 인터 명시적 MTS가 on이면, DST7만이 수평 및 수직 변환 코어(transform core)들 양자에 사용된다. 변환 행렬 정밀도에 대해서는 8 비트 주(primary) 변환 코어들이 사용된다. 이에 따라 4점(4-point) DCT-2 및 DST-7, 8-point, 16점 및 32점 DCT-2를 포함하여 HEVC에 사용되는 모든 변환 코어들이 동일하게 유지된다. 또한 4점 DCT-2, 4점 DCT-8, 8점, 16점, 32점 DST-7 및 DCT-8을 포함한 다른 변환 코어들은 8 비트 주 변환 코어들을 사용한다.
표 2-5. 변환 및 시그널링 매핑 테이블
Figure pct00054
큰 크기의 DST-7 및 DCT-8의 복잡성을 감소시키기 위해, 고주파 변환 계수들이 32의 크기(폭 또는 높이, 또는 폭과 높이 모두)를 갖는 DST-7 및 DCT-8에 대해 삭감된다. 16x16 저주파 영역 내의 계수들만이 유지된다.
HEVC에서와 같이, 블록의 잔차는 변환 스킵 모드로 코딩될 수 있다. 신택스 코딩의 중복(redundancy)을 피하기 위해 CU 레벨 MTS_CU_flag이 0이 아닐 때는 변환 스킵 플래그가 시그널링되지 않는다. 변환 스킵에 대한 블록 크기 제한은 JEM4에서의 MTS에 대한 것과 같은데, 이는 폭과 높이 모두가 32 이하일 때 변환 스킵이 CU에 적용될 수 있음을 표시한다. LFNST 또는 MIP가 현재 CU에 대해 활성화될(activates) 때 암묵적 MTS 변환이 DCT2와 같게 설정됨에 참고(NOTE) 바란다. 또한 MTS가 인터 코딩된 블록들에 대해 인에이블될 때 암묵적 MTS가 여전히 인에이블될 수 있다.
2.11. 저주파 비분리 변환(Low-Frequency Non-Separable Transform; LFNST)
VVC에서는, 축소된 이차변환(reduced secondary transform)으로 알려진 LFNST(저주파 비분리 변환; low-frequency non-separable transform)이 도 7에 도시된 바와 같이 (인코더 측에서) 순방향(forward) 주 변환과 양자화 사이와 (디코더 측에서) 역 양자화(de-quantization) 및 역방향 주 변환(inverse primary transform) 사이에 적용된다. LFNST에서는, 블록 크기에 따라 4x4 비분리 변환 또는 8x8 비분리 변환이 적용된다. 예를 들어, 작은 블록들(즉 min(폭, 높이) < 8)에는 4x4 LFNST가 적용되고 큰 블록(즉 min(폭, 높이) > 4)에는 8x8 LFNST가 적용된다.
도 7은 저주파 비분리 변환(LFNST) 프로세스의 예를 보인다.
LFNST에서 사용되고 있는 비분리 변환의 적용은 예를 들어 입력을 사용하여 다음과 같이 기술된다. 4x4 LFNST을 적용하기 위해 4x4 입력 블록 X
Figure pct00055
는 먼저 벡터
Figure pct00056
로 표현된다:
Figure pct00057
비분리 변환은
Figure pct00058
로 연산되는데, 여기서
Figure pct00059
는 변환 계수 벡터이고 T 는 16x16 변환 행렬이다. 16x1 c계수 벡터
Figure pct00060
는 그 블록에 대한 주사 순서(수평. 수직, 대각)를 사용하여 4x4 블록들로 순차적으로 개편된다(re-organized). 더 작은 인덱스를 갖는 계수는 4x4 계수 블록에서 더 작은 주사 인덱스와 함께 배치될 것이다.
2.11.1. 축소 비분리 변환(Reduced Non-separable transform)
LFNST(저주파 비분리 변환)은 비분리 변환의 적용을 위한 직접 행렬 곱셈 접근방법에 기반하여 복수회의 반복(iteration) 없이 단일한 패스(pass)로 구현된다. 그러나 연산의 복잡성과 변환 계수를 저장할 메모리 공간의 최소화를 위해 비분리 변환 행렬의 크기(dimension)를 축소할 필요가 있다. 이에 따라 축소 비분리 변환(reduced non-separable transform; RST) 방법이 LFNST에 사용된다. 축소 비분리 변환의 주된 개념은 N(8x8 NSST에 대해 N은 대개 64)차 벡터를 다른 공간의 R차 벡터로 매핑하는 것인데, 여기서 N/R (R < N)이 축소계수(reduction factor)이다. 이에 따라 NxN 행렬 대신 RST 행렬은 다음과 같이 RxN 행렬이 되는데:
Figure pct00061
여기서 변환의 R개의 행들은 N차 공간의 R개의 베이스(base)들이다. RT에 대한 역 변환 행렬은 그 순방향 변환의 전치행렬(transpose)이다. 8x8 LFNST에 대해 4의 축소 계수가 적용되는데, 전통적인 8x8 비분리 행렬 크기인 64x64 직접 행렬(direct matrix)이 16x48 직접 행렬로 축소된다. 이에 따라 48x16 역 RST 행렬이 디코더 측에 사용되어 8x8 산-좌 영역들에 코어(주) 변환 계수들을 생성한다. 동일한 변환 집합 구성에 16x64 대신 16x48 행렬들이 적용되면, 그 각각은 산-좌 8x8 블록으로부터 우-하 4x4 블록을 제외하고 3개의 4x4 블록들로부터 48개의 입력 데이터를 취한다. 축소된 크기의 도움으로, 모든 LFNST 행렬들을 저장할 메모리 사용이 적절한 성능 저하와 함께 10KB로부터 8KB로 축소된다. 복잡성의 축소를 위해, LFNST는 제1 계수 하부그룹(sub-group) 외부의 모든 계수들이 유의미하지 않은(non-significant) 경우에만 적용 가능한 것으로 제한된다. 이에 따라, LFNST가 적용되면 모든 주 만의(primary-only) 변환 계수들이 0이 되어야 한다. 이는 최하위(last-significant) 위치에서의 LFNST 인덱스 시그널링의 조절(conditioning)을 가능하게 하여, 현재 LFNST 설계에서 특정한 위치들에서만 유의미한 계수들의 검사에 필요한 추가적인(extra) 계수 주사를 방지한다. (화소 당 곱셈들의 관점에서) LFNST의 최악의 경우의 취급은 4x4 및 8x8 블록들의 각각 8x16 및 8x48 변환으로의 비분리 변환을 제한한다. 이 경우들에, LFNST가 적용되면 최하위 주사 위치는 8 미만이어야 하고, 다른 크기들에 대해서는 16 미만이어야 한다. 4xN 및 Nx4 및 N > 8인 형태를 갖는 블록들에 대해, 제안된 제한은 LFNST가 이제 한 번만 적용되고 상-좌 4x4 영역에만 적용된다는 것을 의미한다. LFNST가 적용되면 모든 주 만의 계수들이 0이므로, 주 변환에 요구되는 연산의 수는 이러한 경우들에 감소된다. 인코더 관점에서, LFNST 변환이 시험될 때 계수들의 양자화가 현저히 간단해진다. 부호율 왜곡(rate-distortion)이 최적화된 양자화가 (주사 순서로) 첫 16개의 계수들에 대해 최대로 수행되어야 하고, 나머지 계수들은 강제로 0이 된다.
2.11.2. LFNST 변환 선택(LFNST transform selection)
전체 4개의 변환 집합들들이 존재하고 LFNST에서는 변환 집합 당 2개의 비분리 변환 행렬(커널; kernel)들이 사용된다. 인트라 예측 모드로부터 변환 집합으로의 매핑은 표 2-6에 보인 바와 같이 사전 정의되어 있다. 3개의 CCLM 모드(INTRA_LT_CCLM, INTRA_T_CCLM 또는 INTRA_L_CCLM)들 중의 하나가 현재 블록(81 <= predModeIntra <= 83)에 사용된다면 변환 집합 0이 현재 크로마 블록에 대해 선택된다. 각 변환 집합에 대해, 선택된 비분리 이차 변환 후보는 명시적으로 시그널링되는 LFNST 인덱스로 더 명시된다. 이 인덱스는 인트라 CU 당 한번 비트스트림의 변환 계수들 다음에 시그널링된다.
표 2-6. 변환 선택 테이블
Figure pct00062
2.11.3. LFNST 인덱스 시그널링 및 다른 툴들과의 상호작용(LFNST index Signalling and interaction with other tools)
제1 계수 하부그룹 외부의 모든 계수들이 유의미하지 않은 경우에만 적용 가능한 것으로 LFNST가 제한되므로, LFNST 인덱스 코딩은 최하위(last significant) 계수에 좌우된다. 또한 LFNST 인덱스는 컨텍스트(context) 코딩되지만 인트라 예측 모드에 좌우되지 않고 단지 제1 빈(bin)만 컨텍스트 코딩된다. 뿐만 아니라, LFNST는 인트라 및 인터 슬라이스들 양자에서 그리고 Luma 및 Chroma 양자에 대해 인트라 CU에 적용된다. 이중 트리가 인에이블되면, Luma 및 Chroma에 대한 LFNST 인덱스들이 별도로 시그널링된다. 인터 슬라이스(이중 트리가 디스에이블)에 대해서는, 단일한 LFNST 인덱스가 시그널링되어 Luma 및 Chroma 양자에 대해 사용된다.
ISP 모드가 선택되면, RSI가 모든 가능한(feasible) 구획 블록에 적용되더라도 성능 향상이 미미(marginal)하므로 LFNST가 디스에이블되고 RST 인덱스가 시그널링되지 않는다. 뿐KS 아니라, ISP 예측된 잔차에 대한 RST를 디스에이블시키면 인코딩 복잡성을 저감시킬 수 있다. MIP 모드가 선택되면 LFNST가 역시 디스에이블되어 인덱스가 시그널링되지 않는다.
64x64보다 더 큰, 큰 CU가 기존의 최대 변환 크기 제한(64x64) 때문에 암묵적으로 분할(TU 틸팅(tilting))되는 것을 고려하면, LFNST 인덱스 검색은 어떤 수의 디코드 파이프라인 스테이지(decode pipeline stage)들에 개해 데이터 버퍼링을 4배로 증가시킬 수 있다. 이에 따라, LFNST가 허용되는 최대 크기는 64x64로 제한된다. LFNST가 DCT2만으로 인에이블되는 것에 참고(NOTE)해야 한다.
2.12. 크로마에 대한 변환 스킵(Transform skip for chroma)
크로마 변환 스킵(transform skip; TS)이 VVC에 도입되었다. 그 동기는 transform_skip_flag 및 mts_idx을 residual_coding 부분으로 재배치함으로써 루마와 크로마 간의 TS 및 MS 시그널링을 통합하는 것이다. 하나의 컨텍스트 모델이 크로마 TS에 대해 추가된다. mts_idx에 대해서는 컨텍스트 모델이 추가되지 않고 2진화(binarization)도 변경되지 않는다. 또한, 크로마 TS가 사용되면 TS 잔차 코딩 역시 적용된다.
시맨틱스(Semantics)
transform_skip_flag[x0][y0][cIdx]가 변환이 연계된 루마 변환 블록에 적용될지 여부를 명시한다. 행렬 인덱스 x0, y0이 픽처의 상-좌 샘플에 대한 고려중인 변환 블록의 상-좌 루마 샘플의 위치(x0, y0)를 명시한다. 1과 동일한 transform_skip_flag[x0][y0][cIdx]이 현재 루마 변환 블록에 변환이 적용되지 않을 것을 명시한다. 행렬 인덱스 cIdx가 색 성분(colour component)에 대한 지표(indicator)를 명시하는데; 이는 루마에 대해 0이고, Cb에 대해 1이며 Cr에 대해 2이다. 0인 transform_skip_flag[x0][y0][cIdx]은 변환이 현재 변환 블록에 적용될지 여부가 다른 신택스 요소들에 좌우된다는 것을 명시한다. transform_skip_flag[x0][y0][cIdx]가 존재하지 않으면, 이는 0으로 추론된다.
2.13. 크로마에 대한 BDPCM(BDPCM for chroma)
크로마 TS 지원에 추가하여, BDPCM이 크로마 성분들에 추가된다. sps_bdpcm_enable_flag이 1이면, 추가적 신택스 요소 sps_bdpcm_chroma_enable_flag이 SPS에 추가된다. 이 플래그들은 표 2-7에 표시된 바와 같이 다음 행위(behaviour)를 갖는다.
표 2-7. 루마 및 크로마 BDPCM에 대한 sps 플래그들
Figure pct00063
BDPCM이 루마에만 사용 가능하면 현재 행위(behaviour)는 불변이다. BDPCM이 크로마에도 사용 가능하면 bdpcm_chroma_flag이 각 크로마 블록에 대해 전송된다. 이는 BDPCM이 크로마 블록들에 사용될지 여부를 표시한다. 이것이 on이면, BDPCM이 양 크로마 성분들에 사용되고, 추가적인 bdpcm_dir_chroma 플래그가 코딩되어 양 크로마 성분들에 사용된 예측 방향을 표시한다.
블록들의 어느 것도, 일반적으로 블로킹 아티팩트(blocking artifact)들의 원인이 되는 변환 스테이지들을 사용하지 않으므로 디블록킹 필터(deblocking filter)는 2개의 Block-DPCM 블록들 사이의 경계(border) 상에 비활성화된다(de-activated). 이 비활성화는 루마 및 크로마 성분들에 대해 독립적으로 이뤄진다.
3. 본 발명 해법들로 해결되는 기술적 문제들의 예(Examples of technical problems solved by the disclosed solutions)
CCLM 및 TS에서의 선형 파라미터들의 유도의 현재 설계는 다음 문제들을 갖는다:
1. 4:4:4가 아닌(non-4:4:4) 칼라 포맷에 대해, CCLM의 선형 파라미터들의 유도는 이웃 크로마 샘플들과 다운샘플링된 동치(collocated) 이웃 루마 샘플들을 수반한다. 도 8에 보인 바와 같이, 현재 VVC에서 가장 가까운 행(line)이 CTU 경계에 없으면 다운샘플링된 동치 이웃 상측(top) 루마 샘플들은 4:2:2 비디오들에 대해 현재 블록 위의 두 번째 행을 사용하여 유도된다. 그러나 4:2:2 비디오들에 대해 수직 해상도는 불변이다. 이에 따라 다운샘플링된 동치 이웃 상측 루마 샘플들과 이웃 크로마 샘플들 간에 위상 천이(phase shift)가 존재한다.
도 8은 4:2:2 비디오들에 대한 CCLM 파라미터들의 유도에 사용된 이웃 크로마 샘플들과 다운샘플링된 동치 이웃 루마 샘플들의 예를 보인다.
2. 현재 VVC에서, 동일한 최대 블록 크기가 루마 변환 스킵 플래그의 시그널링과 크로마 변환 스킵 플래그의 시그널링에 대한 조건 점검(condition check)에 사용된다. 이러한 설계는 바람작하지 못한 칼라 포맷을 고려하지 않는다.
a. 유사한 문제가 루마 BDPCM 플래그의 시그널링과 크로마 BDPCM 플래그의 시그널링에도 존재하는데, 여기서 동일한 최대 블록 크기가 조건 점검에 사용된다.
3. JVET-Q2001-vE에 명시된 바와 같은 VVC에서는, 상측 이웃 샘플들에 앞서 좌측 이웃 샘플들이 선택된 이웃 샘플 리스트에 추가된다. 그러나 좌측 이웃 샘플들에 앞서 상측 이웃 샘플들을 추가하는 것이 더 나을 수 있다.
4. JVET-Q2001-vE에 명시된 바와 같은 VVC에서는, 이웃 루마 샘플들의 2개의 행들이 할당된다. 그러나 sps_chroma_vertical_collocated_flag이 1이면, 이웃 루마 샘플들의 3개의 행들이 요구된다.
5. JVET-Q2001-vE에 명시된 바와 같은 VVC에서는, 좌측 이웃 루마 샘플들이 사용 불가능하면, 현재 블록의 좌단(left-most) 샘플들을 사용하여 좌측 이웃 루마 샘플들이 패딩되고(padded), 상측 이웃 루마 샘플들을 사용하여 상-좌 이웃 루마 샘플들이 패딩된다. 그러나 상측 아웃 루마 샘플들은 도시되지 않았다. 예를 들어 JVET-Q2001-vE에서.
"- availL이 FALSE이면, 이웃 좌측 샘플 pY[x][y](여기서 x = -1... -3, y = -1... SubHeightC * numSampL - 1)들은 루마 샘플 pY[0][y]들과 같게 설정된다.
- numSampT가 0보다 크면, 이웃 상측 루마 샘플 pY[x][y](여기서 x = 0... SubWidthC * numSampT - 1, y = -1, -2)들은 위치(xTbY+ x, yTbY + y)들에서의 디블록킹 필터 프로세스 이전의 재현 루마 샘플들과 같게 설정된다."
6. JVET-Q2001-vE에 명시된 바와 같은 VVC에서는, 상측(및/또는 좌측) 이웃 루마 샘플들은 이들이 사용 불가능하면 잘못 유도된다. 예를 들어, JVET-Q2001-vE에서, "availT가 FALSE이면, 이웃 상측 루마 샘플 pY[x][y](여기서 x = -1... SubWidthC * numSampT - 1, y = -1... -2)들은 루마 샘플 pY[x][0]들과 같게 설정된다"가 이들이 사용 불가능할 때 상측 이웃 루마 샘플들의 유도에 사용된다. 그러나 상측 이웃 루마 샘플들이 사용 불가능할 때 numSampT이 0과 같게 설정되었다.
7. 현재 VVC에서, 상측 및 좌측 이웃 루마 샘플들이 사용 불가능하면 상-좌 이웃 루마 샘플들이 CCLM 파라미터들의 유도에 사용되지만, 이들이 다른 슬라이스에 있으면, 예를 들어 래스터 슬라이스(raster-slice) 경우에는 상-좌 이웃 루마 샘플들이 사용 불가능하다.
4. 실시예들과 기법들의 리스트(A listing of embodiments and techniques)
아래 리스트는 일반적 개념을 설명하는 예들로 간주해야 한다. 이 항목들은 협의로 해석해서는 안 된다. 뿐만 아니라, 이 항목들은 어떤 방식으로도 조합될 수 있다.
이 명세서에서 'CCLM'이라는 용어는 현제 생성분에 대한 샘플/잔차를 예측하거나 현재 색 성분에 샘플들의 재현(reconstruction)을 유도하기 위해 교차 색 성분 정보를 활용하는 코딩 툴을 나타낸다. 이는 VVC에 기술된 CCLM 기술들로 한정되지 않는다.
CCLM에서의 선형 파라미터들의 유도(Derivation of linear parameters in CCLM)
1. 크로마 블록에 대한 CCLM 파라미터들을 유도할 때, 그 동치 루마 블록의 하나 또는 복수의 위쪽 이웃 라인들이 그 다운샘플링된 동치 이웃 상측 루마 샘플들의 유도에 사용될 수 있다.
a. 하나의 예에서, 현재 크로마 블록이 상측 CTU 경계에 있지 않으면, 위쪽 두 번째 행 대신 동치 루마 블록의 상측 가장 가까운 행이 다운샘플링된 동치 이웃 상측 루마 샘플들의 유도에 사용될 수 있다.
i. 하나의 예에서, 동일한 하나의 다운샘플링 필터가 다운샘플링된 동치 이웃 상측 루마 샘플들과 다운샘플링된 동치 이웃 좌측 루마 샘플들의 유도에 사용될 수 있다.
1) 예를 들어, [1 2 1] 필터가 사용될 수 있다. 더 구체적으로 pDsY[x] = (pY[2*x - 1][-1] + 2 * pY[2 * x][-1] + pY[2 * x + 1][-1] + 2) >> 2(여기서 pY[2*x][-1], pY[2*x - 1][-1], pY[2*x + 1][-1])들은 가장 가까운 위쪽이웃 라인들로부터의 루마 샘플들이고 pDstY[x]는 다운샘플링된 동치 이웃 상측 루마 샘플들을 나타낸다.
ii. 하나의 예에서, (예를 들어 다른 필터 탭/다른 필터 계수를 갖는) 다른 다운샘플링 필터들이 다운샘플링된 동치 이웃 상측 루마 샘플들과 다운샘플링된 동치 이웃 좌측 루마 샘플들의 유도에 사용될 수 있다.
iii. 하나의 예에서, 크로마 블록의 위치와 무관하게(예를 들어, 크로마 블록이 상측 CTU 경계에 있건 없건) 하나의 동일한 다운샘플링 필터가 다운샘플링된 동치 이웃 상측 루마 샘플들의 유도에 사용될 수 있다.
iv. 하나의 예에서, 전술한 방법들은 4:2:2 포맷의 화상/비디오들에만 적용된다.
b. 하나의 예에서, 현재 크로마 블록이 상측 CTU 경계에 있지 않을 때, 동치 루마 블록의 위쪽 가장 가까운 행을 포함하지만 위쪽 두 번째 행을 제외한 상측 이웃 루마 샘플들이 다운샘플링된 동치 이웃 상측 루마 샘플들의 유도에 사용될 수 있다.
c. 하나의 예에서, 다운샘플링된 동치 이웃 상측 루마 샘플들의 유도는 복수의 라인들에 위치한 샘플들에 좌우될 수 있다.
i. 하나의 예에서, 이는 동치 루마 블록 위의 두 번째 가까운 행과 가장 가까운 행 양자에 좌우될 수 있다.
ii. 하나의 예에서, 다운샘플링된 동치 이웃 상측 루마 샘플들은 (예를 들어 4:2:0 및 4:2:2 등) 다른 칼라 포맷들에 대해 하나의 동일한 다운샘플랑 필터를 사용하여 유도될 수 있다.
1) 하나의 예에서, 6-탭 필터(예를 들어 [1 2 1; 1 2 1])가 활용될 수 있다.
a) 하나의 예에서, 다운샘플링된 동치 이웃 상측 루마 샘플들은 다음과 같이 유도될 수 있다: pDsY[x] = (pY[2*x - 1][-2] + 2 * pY[2 * x][-2] + pY[2 * x + 1][-2] + pY[2*x - 1][-1] + 2 * pY[2 * x][-1] + pY[2 * x + 1][-1] + 4) >> 3, 여기서 pY는 해당 루마 샘플들이고 pDstY[x]는 다운샘플링된 동치 이웃 상측 루마 샘플들을 나타낸다.
b) 이와는 달리, 추가적으로 위 방법은 sps_cclm_colocated_chroma_flag이 0일 때 적용될 수 있다.
2) 하나의 예에서, 5-탭 필터(예를 들어 [0 1 0; 1 4 1; 0 1 0])가 활용될 수 있다.
a) 하나의 예에서, 다운샘플링된 동치 이웃 상측 루마 샘플들은 다음과 같이 유도될 수 있다: pDsY[x] = (pY[2 * x][-2] + pY[2 * x - 1][-1] + 4 * pY[2 * x][-1] + pY[2 * x + 1][-1] + pY[2 * x][0] + 4) >> 3, 여기서 pY는 해당 루마 샘플들이고 pDstY[x]는 다운샘플링된 동치 이웃 상측 루마 샘플들을 나타낸다.
b) 이와는 달리, 추가적으로 위 방법은 sps_cclm_colocated_chroma_flag이 1일 때 적용될 수 있다.
iii. 하나의 예에서, 위 방법들은 4:2:2 포맷의 화상/비디오들에만 적용될 수 있다.
변환 스킵 코딩된 블록들의 최대 블록 크기(예를 들어 1인 transform_skip_flag을 가지거나, BDPCM 또는 바이패스 변환 처리/아이덴티티 변환(identity transform)을 사용하는 다른 모드들)
2. 변환 스킵 코딩된 블록들의 최대 블록 크기는 색 성분에 좌우될 수 있다. 루마 및 크로마에 대한 변환 스킵 코딩된 블록들의 최대 블록 크기를 각각 MaxTsSizeY 및 MaxTsSizeC로 표기한다.
a. 하나의 예에서, 루마 및 크로마 성분들에 대한 최대 블록 크기가 다를 수 있다.
b. 하나의 예에서, 2개의 크로마 성분들에 대한 최대 블록 크기가 다를 수 있다.
c. 하나의 예에서, 루마 및 크로마 성분들에 대한 또는 각 색 성분에 대한 최대 블록 크기가 별도로 시그널링될 수 있다.
i. 하나의 예에서, MaxTsSizeC/MaxTsSizeY가 시퀀스 헤더(sequence header)/픽처 헤더/SPS/VPS/DPS/PPS/APS/슬라이스 헤더/타일 그룹 헤더 등의 시퀀스 레벨/픽처 레벨/슬라이스 레벨/ 타일 그룹 레벨로 시그널링될 수 있다.
ii. 하나의 예에서, MaxTsSizeY가, 변환 스킵이 인에이블되었는지 여부/BDPCM이 인에이블되었는지 여부에 따르는 등 조건부로 시그널링된다.
iii. 하나의 예에서, MaxTsSizeC가, 칼라 포맷/변환 스킵이 인에이블되었는지 여부/BDPCM이 인에이블되었는지 여부에 따르는 등 조건부로 시그널링된다.
iv. 이와는 달리, 루마 및 크로마 성분들에 대한 최대 블록 크기들 간의 예측 코딩이 활용될 수 있다.
d. 하나의 예에서, MaxTsSizeC는 MaxTsSizeY에 좌우될 수 있다.
i. 하나의 예에서, MaxTsSizeC는 MaxTsSizeY와 같게 설정될 수 있다.
ii. 하나의 예에서, MaxTsSizeC는 MaxTsSizeY/N(N은 정수)과 같게 설정될 수 있다. 예를 들어, N = 2.
e. 하나의 예에서, MaxTsSizeC는 크로마 서브샘플링 비에 따라 설정될 수 있다.
i. 하나의 예에서, MaxTsSizeC는 MaxTsSizeY >> SubWidthC와 같게 설정되는데, 여기서 SubWidthC는 표 2-1에 정의되어 있다.
ii. 하나의 예에서, MaxTsSizeC는 MaxTsSizeY >> SubHeightC와 같게 설정되는데, 여기서 SubHeightC는 표 2-1에 정의되어 있다.
iii. 하나의 예에서, MaxTsSizeC는 MaxTsSizeY >> max(SubWidthC, SubHeightC)와 같게 설정된다.
iv. 하나의 예에서, MaxTsSizeC는 MaxTsSizeY >> min(SubWidthC, SubHeightC)와 같게 설정된다.
3. 변환 코딩된 블록에 대한 최대 허용 블록 크기 폭 및 높이는 달리 정의될 수 있다.
a. 하나의 예에서, 최대 허용 블록 크기 폭 및 높이는 별도로 시그널링될 수 있다.
b. 하나의 예에서, 크로마 변환 코딩된 블록에 대한 최대 허용 블록 크기 폭 및 높이는 각각 MaxTsSizeWC 및 MaxTsSizeHC로 표기될 수 있다. MaxTsSizeWC는 MaxTsSizeY >> SubWidthC와 같게 설정될 수 있고 MaxTsSizeHC는 MaxTsSizeY >> SubHeightC와 같게 설정될 수 있다.
i. 하나의 예에서, MaxTsSizeY는 불릿(bullet) 2에 정의된 것이다.
4. 크로마 블록에 대한 변환 스킵을 시그널링(예를 들어 transform_skip_flag[x0][y0][1] 및/또는 transform_skip_flag[x0][y0][2])할지 여부는 크로마 변환 스킵 코딩된 블록들에 대한 최대 허용 크기에 좌우된다.
a. 하나의 예에서, 크로마 변환 스킵 플래그은 다음 조건들에 따라 조건부로 시그널링될 수 있다:
i. 하나의 예에서, 이 조건들은: tbW가 MaxTsSizeC 이하이고 tbH가 MaxTsSizeC 이하인 것인데, 여기서 tbW 및 tbH들은 현재 크로마 블록의 폭 및 높이이다.
1) 하나의 예에서, MaxTsSizeC는 불릿 2-3에서 정의된 것이 될 수 있다.
ii. 하나의 예에서, 이 조건들은: tbW가 MaxTsSizeWC 이하이고 tbH거 MaxTsSizeHC 이하인 것인데, 여기서 tbW 및 tbH들은 현재 크로마 블록의 폭 및 높이, MaxTsSizeWC 및 MaxTsSizeHC는 각각 크로마 변환 스킵 코딩된 블록들에 대한 최대 허용 블록 크기 폭 및 높이를 나타낸다.
1) 하나의 예에서, MaxTsSizeWC 및/또는 MaxTsSizeHC는 불릿 3에 정의된 것일 수 있다.
b. 하나의 예에서, 위 방법들은 'transform skip'을 'BDPCM'으로 치환함으로써 크로마 BDPCM 플래그들(예를 들어 intra_bdpcm_chroma_flag)의 코딩에 적용 가능할 수 있다.
5. 2개의 크로마 색 성분에 대해 2개의 TS 플래그들을 코딩하는 대신, 2개의 색 성분들에 대래 TS의 사용을 표시하는 하나의 신택스를 사용할 것이 제안된다.
a. 하나의 예에서, transform_skip_flag[x0][y0][1] 및/또는 transform_skip_flag[x0][y0][2])을 코딩하는 대신, 단일한 신택스 요소(예를 들어 TS_chroma_flag)가 코딩될 수 있다.
i. 하나의 예에서, 단일한 신택스 요소의 값은 이진 값이다.
1) 이와는 달리, 추가적으로 2개의 크로마 성분 블록들은 단일한 신택스 요소에 따라 TS 모드의 동일한 on/off 제어를 공유한다.
a) 하나의 예에서, 단일한 신택스 요소의 값이 0이면 TS가 양자에 대해 디스에이블된 것을 표시한다.
b) 하나의 예에서, 단일한 신택스 요소의 값이 1이면 TS가 양자에 대해 인에이블된 것을 표시한다.
2) 이와는 달리, 추가적으로 단일한 신택스 요소의 값이 K(예를 들어 K = 1)인지 여부에 기반하여 제2 신택스 요소가 더 시그널링될 수 있다.
a) 하나의 예에서, 단일한 신택스 요소의 값이 0이면 TS가 양자에 대해 디스에이블된 것을 표시하고; 단일한 신택스 요소의 값이 1이면 TS가 2개의 크로마 성분들 중의 적어도 하나에 대해 인에이블된 것을 표시한다.
b) TS가 2개의 크로마 성분들 중 어느 것에 적용되는지 및/또는 TS가 양자 모두에 적용되는지 표시하는 데 제2 신택스 요소가 사용될 수 있다.
ii. 하나의 예에서, 단일한 신택스 요소의 값이 이진이 아닌 값이 될 수 있다.
1) 하나의 예에서, 단일한 신택스 요소의 값이 KO이면 TS가 양자에 대해 디스에이블된 것을 표시한다.
2) 하나의 예에서, 단일한 신택스 요소의 값이 K1이면 TS가 제1 크로마 색 성분에 대해 인에이블되고 제2 색 성분에 대해 디스에이블된 것을 표시한다.
3) 하나의 예에서, 단일한 신택스 요소의 값이 K2이면 TS가 제1 크로마 색 성분에 대해 디스에이블되고 제2 색 성분에 대해 인에이블된 것을 표시한다.
4) 하나의 예에서, 단일한 신택스 요소의 값이 K3이면 TS가 양자에 대해 인에이블된 것을 표시한다.
5) 하나의 예에서, 단일한 신택스 요소는 고정된 길이, 단항(unary), 절사 단항(truncated unary), k차(k-th order) EG 이진화(binarization) 방법들로 코딩될 수 있다.
iii. 하나의 예에서, 단일한 신택스 요소 및/또는 제2 신택스 요소는 컨텍스트 코딩 또는 바이패스 코딩될 수 있다.
일반적 클레임들(General claims)
6. 위 본 발명 방법을 적용할지 및/또는 어떻게 적용할지가 시퀀스 헤더/픽처 헤더/SPS/VPS/DPS/PPS/APS/슬라이스 헤더/타일 그룹 헤더 등의 시퀀스 레벨/픽처 레벨/슬라이스 레벨/타일 그룹 레벨로 시그널링될 수 있다.
7. 위 본 발명 방법을 적용할지 및/또는 어떻게 적용할지는 칼라 포맷, 싱글/듀얼 트리 구획 등의 코딩된 정보에 좌우될 수 있다.
CCLM에 대한 추가적 클레임들(Additional claims on CCLM)
8. CCLM 파라미터 유도 프로세스에서, 위쪽 이웃 샘플들이 좌측 이웃 샘플들 이전에 선택된 이웃 샘플 리스트에 추가되고 선택된 이웃 샘플 리스트이 (2개의 더 큰 것들의 평균을 내고 2개의 더 작은 것들의 평균을 내어, 2개의 평균값들이 선형 파라미터의 유도에 사용되는 4점 유도 방법을 사용하여) CCLM 파라미터들을 유도하는 데 사용된다. 하나의 예를 실시예 5에 보인다.
9. CCLM 파라미터 유도 프로세스에서, 다운샘플링된 위쪽 이웃 루마 샘플들을 pSelDsY[idx]로 표기하면, 인덱스 값 idx는 cntL 내지 cntL + cntT - 1의 범위에 있어야 하는데, 여기서 cntL 및 cntT은 각각 CCLM 파라미터들의 유도에 사용된 좌측 이웃 크로마 샘플들과 위쪽 이웃 크로마 샘플들의 수를 나타낸다.
a. 하나의 예를 실시예 5에 보인다.
b. 이와는 달리, 추가적으로 좌측 이웃 샘플들이 위쪽 이웃 샘플들 이전에 선택된 이웃 샘플 리스트에 추가된다.
10. CCLM 파라미터 유도 프로세스에서, 위쪽 이웃 루마 샘플들의 3개의 행들이 할당된다. 하나의 예를 실시예 6에 보인다.
11. CCLM 파라미터 유도 프로세스에서, 상-좌 이웃 루마 샘플들의 T1개의 행들과 T2개의 열들이 할당된다.
a. 하나의 예에서, T1 = 2이고 T2 = 2이다. 하나의 예를 실시예 12에 보인다.
b. 하나의 예에서, T1 = 3이고 T2 = 3이다.
12. CCLM 파라미터 유도 프로세스에서, 할당될 위쪽 루마 이웃 샘플들의 행들의 수는, 크로마 샘플 위치들이 대응 루마 샘플 위치들에 대해 수직으로 천이되지 않는지 여부를 지시하는 JVET-Q2001-vE의 sps_chroma_vertical_collocated_flag 등의 변수 또는 신택스 요소에 좌우된다.
a. 하나의 예에서, sps_chroma_vertical_collocated_flag이 1이면 위쪽 이웃 루마 샘플들의 3개의 행들이 할당된다. 그렇지 않으면, 위쪽 이웃 루마 샘플들의 2개의 행들이 할당된다. 그 예를 실시예 7에 보인다.
13 위 예들에서, 이웃 루마 샘플들은 다운샘플링 이전 또는 다운샘플링 이후의 것이 될 수 있다.
14. CCLM 파라미터 유도 프로세스에서, 상-좌 이웃 샘플들을 패딩할지 및/또는 어떻게 패딩(pad)할지는 좌측 이웃 샘플들 및/또는 위쪽 이웃 샘플들의 사용 가능성 대신 상-좌 이웃 샘플들 중의 적어도 하나의 사용 가능성에 좌우된다.
a. 하나의 예에서, 상-좌 이웃 샘플들 중의 적어도 하나의 사용 가능성은 상-좌 이웃 샘플들 중의 적어도 하나와 현재 블록 내의 샘플들이 동일한 슬라이스에 있는지 다른 슬라이스들에 있는지에 좌우될 수 있다.
i. 뿐만 아니라, 전술한 슬라이스는 사각형 또는 사각형이 아닌 슬라이스가 될 수 있다.
b. 하나의 예에서, 상-좌 이웃 샘플들 중의 적어도 하나와 현재 블록 내의 샘플들이 다른 슬라이스들에 있으면 상-좌 이웃 샘플들이 패딩된다.
c. 하나의 예에서, 상-좌 이웃 샘플들 중의 적어도 하나의 사용 가능성이 거짓이면 상-좌 이웃 샘플들이 패딩된다.
15. CCLM 파라미터 유도 프로세스에서, 상-좌 이웃 샘플들은 이들이 "사용 불가능(unavailable)"한 경우 사용되지 않을 수 있다.
a. 하나의 예에서, 현재 픽처, 또는 현재 부분픽처(sub-picture), 또는 현재 타일, 또는 현재 슬라이스, 또는 현재 브릭(brick), 또는 현재 CTU, 또는 현재 처리 유닛, 또는 어떤 다른 현재 비디오 유닛 외부에 있으면, 이웃 샘플은 "사용 불가능"하다.
i. 하나의 예에서, 도 13에 도시된 사각형이 아닌 슬라이스 경우에 대해, 현재 블록과 다른 슬라이스에 있는 상-좌 루마 샘플들은 "사용 불가능"하다.
b. 하나의 예에서, CCLM의 프로세스에서 상-좌 이웃 루마 샘플들을 사용할지 여부는 이들이 현재 블록과 동일한 픽처/부분픽처/타일/슬라이스/브릭/CTU/처리 유닛/다른 비디오 유닛에 있는지 여부에 좌우될 수 있다.
i. 하나의 예에서, 현재 블록과 다른 래스터 슬라이스(raster-slice)에 있으면 상-좌 이웃 루마 샘플들이 CCLM의 프로세스에 사용되지 않을 수 있다.
1) 하나의 예를 실시예 10에 보인다.
ii. 하나의 예에서, 현재 블록과 동일한 픽처/부분픽처/타일/슬라이스/브릭/CTU/처리 유닛/다른 비디오 유닛에 있더라도 상-좌 이웃 루마 샘플들이 CCLM의 프로세스에 사용되지 않을 수 있다.
c. CCLM 파라미터 유도 프로세스에서, 상-좌 이웃 루마 샘플들이 "사용 불가능"하면, 상-좌 이웃 루마 샘플들의 생성에 반복적 패딩(repetitive padding)이 사용될 수 있다. 현재 블록의 상-좌 샘플 위치를 (x, y)로 표기하다. 디블록킹 필터 프로세스 이전의 재현 루마 샘플들을 pY[i][j]로 표기한다. 패딩된 상-좌 루마 샘플들을 m = x-1... x-M, n = y-1... y-N에서 pD[m][n]으로 표기하는데, 여기서 M 및 N은 예를 들어 1 과 같은 정수들이다.
i. 하나의 예에서, 좌측 및/또는 상측 이웃 루마 샘플들이 사용 가능할 때 반복적 패딩 방법이 사용될 수 있다.
ii. 하나의 예에서, 상측 이웃 루마 샘플들이 사용 가능할 때 상-좌 이웃 루마 샘플들이 상측 이웃 루마 샘플들로부터 패딩될 수 있다.
2) 하나의 예에서, pD[m][n] = pY[x][n].
iii. 하나의 예에서, 좌측 이웃 루마 샘플들이 사용 가능할 때 상-좌 이웃 루마 샘플들이 좌측 이웃 루마 샘플들로부터 패딩될 수 있다.
3) 하나의 예에서, pD[m][n] = pY[m][y].
iv. 하나의 예에서, 상측 이웃 루마 샘플들이 사용 가능하고 좌측 이웃 루마 샘플들이 사용 가능할 때 상-좌 이웃 루마 샘플들이 상측 이웃 루마 샘플들로부터 패딩될 수 있다.
4) 하나의 예에서, pD[m][n] = pY[x][n].
v. 이와는 달리, 상측 이웃 루마 샘플들이 사용 가능하고 좌측 이웃 루마 샘플들이 사용 가능할 때 상-좌 이웃 루마 샘플들이 좌측 이웃 루마 샘플들로부터 패딩될 수 있다.
5) 하나의 예에서, pD[m][n] = pY[m][y].
vi. 하나의 예에서, M = 2, N = 2, or M = 3, N = 3.
d. 이와는 달리, 상-좌 이웃 루마 샘플들이 "사용 불가능"할 때, 이들은 소정값으로 치환될 수 있다.
i. 하나의 예에서, 소정값들은 예를 들어 128 등 상수 값일 수 있다.
ii. 하나의 예에서, 소정값들은 좌측 및/또는 상측 이웃 루마 샘플들을 사용하여 유도될 수 있다.
6) 하나의 예에서, 소정값들은 좌측 및/또는 상측 이웃 루마 샘플들의 평균값이 될 수 있다.
iii. 하나의 예에서, 소정값들은 샘플들의 비트심도(bit-depth)에 좌우될 수 있다. 예를 들어, 소정값들은 1<<(BD-1)이 될 수 있는데, 여기서 BD는 샘플들의 비트심도를 나타낸다.
e. 이와는 달리, 상-좌 이웃 루마 샘플들이 "사용 가능(available)"하더라도, 불릿 14.c의 위 패딩 방법 및 불릿 14.d의 소정값들이 사용 가능한 상-좌 이웃 루마 샘플들을 치환하여 사용될 수 있다.
i. 하나의 예를 실시예 11에 보인다.
f. 하나의 예에서, 상-좌 이웃 루마 샘플들의 사용 가능성을 점검할지 여부는 좌측 이웃 루마 샘플들이 사용 가능한지 및/또는 상측 이웃 루마 샘플들이 사용 가능한지의 여부에 좌우될 수 있다.
i. 하나의 예에서, 좌측 및 상측 이웃 루마 샘플들이 모두 사용 가능한 경우에만 상-좌 이웃 루마 샘플들의 사용 가능성을 점검한다. 하나의 실시예를 실시예 17에 보인다.
g. 하나의 예에서, 상-좌 이웃 루마 샘플들을 사용할지 및/또는 어떻게 사용할지 및/또는 패딩할지 여부는 상-좌, 및/또는 좌측, 및/또는 상측 이웃 루마 샘플들의 사용 가능성에 좌우될 수 있다.
i. 하나의 예에서, 상-좌 이웃 루마 샘플들이 사용 가능한 경우에만 상-좌 이웃 루마 샘플들이 사용될 수 있다.
ii. 하나의 예에서, 상-좌, 좌측, 및 상측 이웃 루마 샘플들이 사용 가능함 경우에만 상-좌 이웃 루마 샘플들이 사용될 수 있다. 하나의 예를 실시예 18에 보인다.
iii. 하나의 예에서, 좌측 및/또는 상측 이웃 루마 샘플들이 사용 가능하면 상-좌 이웃 루마 샘플들이 패딩될 수 있다.
1) 하나의 예에서, 좌측 또는 상측 이웃 루마 샘플들이 사용 가능하고 상-좌 이웃 루마 샘플들이 사용 불가능한 경우에만 상-좌 이웃 루마 샘플들이 패딩될 수 있다.
2) 하나의 예에서, 좌측 및 상측 이웃 루마 샘플들이 사용 가능하고 상-좌 이웃 루마 샘플들이 사용 불가능한 경우에만 상-좌 이웃 루마 샘플들이 패딩될 수 있다.
3) 하나의 예에서, 상-좌 이웃 루마 샘플들이 상측 이웃 루마 샘플들을 사용하여 패딩될 수 있다. 상-좌 이웃 루마 샘플 pY[x][y](여기서 x = -1, -2, y = -1, -2)들은 루마 샘플 pY[0][y]들과 같게 설정된다. 하나의 예를 실시예 18에 보인다.
4) 하나의 예에서, 상-좌 이웃 루마 샘플들이 상측 이웃 루마 샘플들을 사용하여 패딩될 수 있다. 상-좌 이웃 루마 샘플 pY[x][y](여기서 x = -1, -2, y = -1, -2)들은 루마 샘플 pY[0][y]들과 같게 설정된다. 하나의 예를 실시예 19에 보인다.
5) 하나의 예에서, 상-좌 이웃 루마 샘플들이 상측 및 좌측 이웃 루마 샘플들을 사용하여 패딩될 수 있다.
h. 하나의 예에서, 상-좌 이웃 루마 샘플들의 사용 가능성을 점검할지, 및/또는 상-좌 이웃 루마 샘플들을 사용할지, 및/또는 상-좌 이웃 루마 샘플들을 패딩할지 여부는 크로마 칼라 포맷에 좌우될 수 있다.
i. 하나의 예에서, 4:4:4 칼라 포맷이 사용되면 상-좌 이웃 루마 샘플들의 사용 가능성을 점검하거나, 및/또는 상-좌 이웃 루마 샘플들을 사용하거나, 및/또는 상-좌 이웃 루마 샘플들을 패딩할 필요가 없다. 하나의 예를 실시예 20에 보인다.
i. 하나의 예에서, 상-좌 이웃 루마 샘플들을 패딩할지, 및/또는 어느 샘플들이 패딩될 필요가 있는지는, JVET-Q2001-vE에서의 sps_chroma_vertical_collocated_flag 등 크로마 샘플 위치들이 대응 루마 샘플 위치들에 대해 수직으로 천이되었는지 여부를 표시하는 변수 또는 신택스 요소에 좌우될 수 있다.
i. 하나의 예에서, sps_chroma_vertical_collocated_flag이 1이면 상-좌 이웃 루마 샘플들이 패딩된다. 그렇지 않으면 상-좌 이웃 루마 샘플들이 패딩되지 않는다. 하나의 예를 실시예 14에 보인다.
16. CCLM의 프로세스 동안, 상측(및/또는 좌측) 이웃 루마 샘플들이 사용 불가능하면 현재 블록의 상단(top-most)(및/또는 좌단(left-most)) 샘플들을 사용하여 상측(및/또는 좌측) 이웃 루마 샘플들을 유도할 것이 제안된다. 그러면 상-좌 아웃 샘플들이 좌측(및/또는 상측) 사용 가능한 이웃 루마 샘플들을 사용하여 유도될 수 있다.
a. 하나의 예에서, 상측 이웃 루마 샘플들이 사용 불가능하면 현재 블록의 상단 샘플들과 좌측 이웃 루마 샘플들을 사용하여 상측 및 상-좌 이웃 루마 샘플들이 유도된다.
i. 하나의 예에서, 상측 이웃 루마 샘플들 pY[x][y](여기서 x = 0... SubWidthC * nTbW - 1, y = -1... -2)들은 루마 샘플 pY[x][0]들과 같게 설정된다. 그리고 상-좌 이웃 루마 샘플들 pY[x][y](여기서 x = -1, y = -1... -2)들은 루마 샘플 pY[x][0]들과 같게 설정되는데, 여기서 pY[0][0]은 현재 블록의 상-좌 샘플을 표기하고 nTbW는 현재 블록의 폭을 표시하며, SubWidthC는 2.1에 정의되어 있다.
ii. 하나의 예에서, 상측 이웃 샘플 pY[x][y](여기서 x = 0... SubWidthC * nTbW - 1, y = -1... -2)들은 루마 샘플 pY[x][0]들과 같게 설정된다. 그리고 상-좌 이웃 루마 샘플들 pY[x][y](여기서 x = -M... -1, y = -1... -N)들은 루마 샘플 pY[x][0]들과 같게 설정되는데, 여기서 pY[0][0]은 현재 블록의 상-좌 샘플을 표기하고 nTbW는 현재 블록의 폭을 표시하며, SubWidthC는 2.1에 정의되어 있다. 하나의 예를 실시예 13에 보인다.
1) 하나의 예에서, M 및 N은 M=2 및 N=3 등의 정수들이다.
2) 하나의 예에서, M은 M = SubWidthC 등의 크로마 칼라 포맷에 좌우되는데, 이는 2.1에 정의되어 있다.
3) 하나의 예에서, 최대(at most) T개의 상-좌 이웃 루마 샘플들이 패딩되는데, 여기서 T는 예를 들어 1 과 같은 정수이다.
a) 하나의 예에서, pY[-M][-1] = pY[-M][0]인데, 여기서 M = 1 또는 M = SubWidthC이다.
b. 하나의 예에서, 좌측 이웃 루마 샘플들이 사용 불가능하면, 현재 블록의 좌단 샘플들과 상측 이웃 루마 샘플들을 사용하여 좌측 및 상-좌 이웃 루마 샘플들이 유도될 수 있다.
i. 하나의 예에서, 좌측 이웃 루마 샘플들 pY[x][y](여기서 x = 0... -3, y = -1... SubHeightC * nTbH - 1)들은 루마 샘플 pY[0][y]들과 같게 설정된다. 그리고 상-좌 이웃 루마 샘플들 pY[x][y](여기서 x = 0... -3, y = -1)들은 루마 샘플 pY[0][y]들과 같게 설정되는데, pY[0][0]은 현재 블록의 상-좌 샘플을 표기하고 nTbH는 현재 블록의 높이를 표시하며, SubHeightC는 2.1에 정의되어 있다.
ii. 하나의 예에서, 좌측 이웃 루마 샘플들 pY[x][y](여기서 x = -1... -M, y = 0... SubHeightC * nTbH - 1)들은 루마 샘플 pY[0][y]들과 같게 설정된다. 그리고 상-좌 이웃 루마 샘플들 pY[x][y](여기서 x = -1... -M, y = -1... -N)들은 루마 샘플 pY[0][y]들과 같게 설정되는데, pY[0][0]은 현재 블록의 상-좌 샘플을 표기하고 nTbH는 현재 블록의 높이를 표시하며, SubHeightC는 2.1에 정의되어 있다. r, 예를 실시예 15에 보인다.
1) 하나의 예에서, M 및 N은 M = 1, N = 3 등의 정수들이다.
2) 하나의 예에서, N은 N = SubHeightC 등의 크로마 칼라 포맷에 좌우되는데, 이는 2.1에 정의되어 있다.
3) 하나의 예에서, 최대 T개의 상-좌 이웃 루마 샘플들이 패딩되는데, 여기서 T는 1 등의 정수이다.
a) 하나의 예에서, pY[-1][-N] = pY[0][-N]인데, 여기서 N =1 또는 N = SubHeightC이다.
b) 이와는 달리, T는 2이다. pY[-1][-1] = pY[0][-1], pY[-1][-2] = pY[0][-2].
iii. 하나의 예에서, 상-좌 루마 이웃 샘플들은 상측 이웃 루마 샘플들의 유도 이후에 패딩될 수 있다. 하나의 예를 실시예 16에 보인다.
c. 하나의 예에서, 불릿 13에서 유도된 상-좌 이웃 루마 샘플들은 상측(및/또는 좌측) 이웃 루마 샘플들의 패딩 프로세스 동안 사용될 수 있다.
d. 하나의 예에서, 상측(및/또는 좌측) 이웃 루마(크로마) 샘플들을 패딩할지 및/또는 어는 이웃 샘플들이 패딩에 필요할지는 크로마 칼라 포맷에 좌우될 수 있다.
i. 하나의 예에서, 4:4:4 칼라 포맷이 사용되면 상측(및/또는 좌측) 이웃 루마 샘플들을 패딩할 필요가 없다. 하나의 예를 실시예 21에 보인다.
e. 하나의 예에서, 상측(및/또는 좌측) 이웃 루마 샘플들을 패딩할 때, 15.c 등의 15의 방법을 사용하여 상-좌 이웃 루마 샘플들이 패딩된다. 하나의 예를 실시예 22에 보인다.
17. CCLM 예측 프로세스에서, 상측 이웃 샘플들, 좌측 이웃 샘플등, 및 상-좌 이웃 샘플들의 패딩은 고정된 순서로 수행될 수 있다. 이웃 셈플들은 루마 샘플들 또는 크로마 샘플들이 될 수 있다
a. 예를 들어, 이 순서는 상측 이웃 샘플들 패딩, 좌측 이웃 샘플들 패딩, 및 상-좌 이웃 샘플들 패딩이 될 수 있다.
b. 예를 들어, 이 순서는 좌측 이웃 샘플들 패딩, 상측 이웃 샘플들 패딩, 및 상-좌 이웃 샘플들 패딩이 될 수 있다.
c. 예를 들어, 이 순서는 상-좌 이웃 샘플들 패딩, 상측 이웃 샘플들 패딩, 및 좌측 이웃 샘플들 패딩이 될 수 있다.
d. 예를 들어, 이 순서는 상-좌 이웃 샘플들 패딩, 좌측 이웃 샘플들 패딩, 및 상측 이웃 샘플들 패딩이 될 수 있다.
18. 4:2:2 칼라 포맷 비디오에 대한 CCLM에서의 다운샘플링 프로세스는 크로마 샘플 위치들이 대응 루마 샘플 위치들에 대해 수직으로 천이되었는지 여부를 표시하는 (예를 들어 JVET-Q2001-vE에서의 sps_chroma_vertical_collocated_flag 등의) 신택스 요소 또는 변수로부터 분리될(decoupled) 수 있다.
a. 하나의 예에서, 다운샘플링 프로세스는 이웃 위쪽 루마 샘플들의 다운샘플링, 및/또는 이웃 좌측 루마 샘플들의 다운샘플링, 및/또는 현재 루마 블록의 샘플들의 다운샘플링을 지칭할 수 있다.
b. 하나의 예에서, sps_chroma_vertical_collocated_flag이 1 또는 0인지와 무관하게, (계수 [1/4, 2/4, 1/4] 또는 [2/8, 4/8, 2/8]을 갖는 3탭 수평 필터 등의) 고정 필터가 4:2:2 칼라 포맷을 위한 CCLM의 다운샘플링 프로세스에 사용될 수 있다. 하나의 예를 실시예 27 및 실시예 28에 보인다.
19. 하나의 예에서, 4:2:2 또는 4:4:4 칼라 포맷들에 대해 크로마 샘플 위치들이 대응 루마 샘플 위치들에 대해 수직으로 천이되었는지를 표시하는 (예를 들어 JVET-Q2001-vE에서의 sps_chroma_vertical_collocated_flag 등의) 변수 또는 신택스 요소들이 0 또는 1 등의 디폴트값과 같게 설정될 수 있다.
a. 하나의 예에서, sps_chroma_vertical_collocated_flag이 존재하지 않으면, 이는 1인 것으로 추론될 수 있다.
b. 하나의 예에서, sps_chroma_vertical_collocated_flag이 존재하지 않으면, 이는 0인 것으로 추론될 수 있다.
20. 유효값과 같게 설정된 경우에만 이웃 루마 샘플들을 나타내는 변수가 CCLM 프로세스에 사용될 수 있다. 하나의 예를 실시예 29 및 실시예 30에 보인다.
a. 하나의 예에서, 이웃 위쪽 루마 샘플들을 나타내는 변수들이 디블록킹 필터 프로세스 이전의 재현 루마 샘플들과 같게 설정될 수 있다.
i. 하나의 예에서, 이웃 위쪽 루마 샘플들이 사용 가능하면(예를 들어 JVET-Q2001-vE에서 availT가 참이면), pY[x][y]로 표기되는 이웃 위쪽 루마 샘플들을 나타내는 변수들이 위치(xTbY + x, yTbY + y)에서의 디블록킹 필터 프로세스 이전의 재현 루마 샘플들과 같게 설정되는데, 여기서 (xTbY, yTbY)는 현재 위치의 상-좌 위치를 나타낸다.
1) 하나의 예에서, x 및 y는 x = 0... SubWidthC * max(numSampT, nTbW) - 1, y = -1, -2의 범위에 있을 수 있는데, 여기서 nTbW는 현재 블록의 폭을 표기하고, SubWidthC는 2.1에 정의되어 있으며, numSampT는 상측 및 상-좌의 사용 가능한 이웃 크로마 샘플들의 수를 표기하고 JVET-Q2001-vE에 정의되어 있다.
b. 하나의 예에서, 이웃 좌측 루마 샘플들을 나타내는 변수들이 디블록킹 필터 프로세스 이전의 재현 루마 샘플들과 같게 설정될 수 있다.
i. 하나의 예에서, 이웃 좌측 루마 샘플들이 사용 가능하면(예를 들어 JVET-Q2001-vE에서 availL가 참이면), pY[x][y]로 표기되는 이웃 좌측 루마 샘플들을 나타내는 변수들이 위치(xTbY + x, yTbY + y)에서의 디블록킹 필터 프로세스 이전의 재현 루마 샘플들과 같게 설정되는데, 여기서 (xTbY, yTbY)는 현재 위치의 상-좌 위치를 나타낸다.
1) 하나의 예에서, 하나의 예에서, x 및 y는 x = -1... -3, y = 0... SubHeightC * max(numSampL, nTbH) - 1의 범위에 있을 수 있는데, 여기서 nTbH는 현재 블록의 높이를 표기하고, SubHeightC는 2.1에 정의되어 있으며, numSampL은 좌측 및 좌-하의 사용 가능한 이웃 크로마 샘플들의 수를 표기하고 JVET-Q2001-vE에 정의되어 있다
21. 슬라이스의 슬라이스 종류는 이 슬라이스에 대한 참조 픽처 엔트리(reference picture entry)들에 좌우될 수 있다.
a. 하나의 예에서, 리스트 0에 대한 참조 픽처 엔트리들의 수가 0이고 리스트 1에 대한 참조 픽처 엔트리들의 수가 1이면 슬라이스 종류는 I-슬라이스가 되어야 한다.
i. 하나의 예에서, 이 경우 슬라이스 종류가 시그널링되지 않는다.
b. 하나의 예에서, 리스트 0에 대한 참조 픽처 엔트리들의 수가 0보다 크고 리스트 1에 대한 참조 픽처 엔트리들의 수가 0이면 슬라이스 종류는 P-슬라이스가 되어야 한다.
i. 이와는 달리, 리스트 0에 대한 참조 픽처 엔트리들의 수가 0보다 크고 리스트 1에 대한 참조 픽처 엔트리들의 수가 0이면 슬라이스 종류는 B-슬라이스가 될 수 없다.
ii. 하나의 예에서, 이 경우 슬라이스 종류가 시그널링되지 않는다.
c. 슬라이스에 대한 참조 픽처 엔트리들은 슬라이스 종류가 시그널링 또는 추론되기 이전에 시그널링 또는 추론될 수 있다.
i. 슬라이스에 대한 참조 픽처 엔트리들은 픽처에 연계된 픽처 헤더에 시그널링될 수 있다.
22. APS들에 허용된 필터들의 전체 수 또는 APS들의 전체 수는 부분픽처(subpicture)들의 수 등의 코딩된 정보에 따라 제한될 수 있다.
a. APS들에 허용된 필터들의 전체 수는 PU를 갖는 모든 APS NAL의 ALF APS들의 루마/크로마 ALF 및 CC-ALF의 전체 수를 포함할 수 있다.
b. APS들에 허용된 필터들의 전체 수는 루마 성분을 위한 적응적 루프 필터(adaptive loop filter) 클래스(class)들(또는 루마 ALF 필터들)의 전체 수, 크로마 성분들에 대한 치환적 필터들(크로마 ALF 필터들)의 전체 수, 및/또는 모든 PU를 갖는 APS NAL 유닛들의 교차 성분 필터들의 전체 수를 포함할 수 있다.
c. APS는 ALF APS/스케일링(scaling) 리스트 APS/LMCS APS이다.
d. APS ID를 어떻게 시그널링할지, 및/또는 비디오 유닛에 사용될 APS들의 수는 제한된 수에 좌우된다.
23. 적합 비트스트림(conformance bitstream)은, 비디오 유닛(예를 들어 시퀀스/픽처/슬라이스/타일/브릭/부분픽처)에 대해 BDPCM이 인에이블되면 부호 데이터 은닉(sign data hiding)이 디스에이블된다는 규칙을 따라야 한다.
a. 이와는 달리, 적합 비트스트림은, 비디오 유닛(예를 들어 시퀀스/픽처/슬라이스/타일/브릭/부분픽처)에 대해 부호 데이터 은닉이 인에이블되면 BDPCM이 디스에이블된다는 규칙을 따라야 한다.
24. 적합 비트스트림은, 비디오 유닛(예를 들어 시퀀스/픽처/슬라이스/타일/브릭/부분픽처)에 대해 변환 스킵/아이덴티티 변환만을 적용하는 코딩 툴이 인에이블되면 부호 데이터 은닉이 디스에이블된다는 규칙을 따라야 한다.
a. 이와는 달리, 적합 비트스트림은, 비디오 유닛(예를 들어 시퀀스/픽처/슬라이스/타일/브릭/부분픽처)에 대해 부호 데이터 은닉이 인에이블되면 변환 스킵/아이덴티티 변환만을 적용하는 코딩 툴이 디스에이블된다는 규칙을 따라야 한다.
25. 적합 비트스트림은, 비디오 유닛(예를 들어 시퀀스/픽처/슬라이스/타일/브릭/부분픽처)에 대해 BDPCM이 인에이블되면 DQ(종속 양자화; dependent quantization)가 디스에이블된다는 규칙을 따라야 한다.
a. 이와는 달리, 적합 비트스트림은, 비디오 유닛(예를 들어 시퀀스/픽처/슬라이스/타일/브릭/부분픽처)에 대해 DQ가 인에이블되면 BDPCM이 디스에이블된다는 규칙을 따라야 한다.
26. 적합 비트스트림은, 비디오 유닛(예를 들어 시퀀스/픽처/슬라이스/타일/브릭/부분픽처)에 대해 변환 스킵/아이덴티티 변환만을 적용하는 코딩 툴이 인에이블되면 DQ(종속 양자화)가 디스에이블된다는 규칙을 따라야 한다.
a. 이와는 달리, 적합 비트스트림은, 비디오 유닛(예를 들어 시퀀스/픽처/슬라이스/타일/브릭/부분픽처)에 대해 DQ가 인에이블되면 변환 스킵/아이덴티티 변환만을 적용하는 코딩 툴이 디스에이블된다는 규칙을 따라야 한다.
5. 실시예들(Embodiments)
이 섹션은 예시적 실시예들과 현재 VVC 표준을 이 실시예들을 기술하도록 변경시키는 방법들을 보인다. VVC 사양에 대한 변경은 볼드체 및 이탤릭체로 강조되어 있다. 삭제된 텍스트는 이중 브래킷으로 표시된다(예를 들어 [[a]]는 문자 "a"의 삭제를 표기한다).
5.1. 실시예 1(Embodiment 1)
JVET-P2001-v9에 명시된 작업 초안이 다음과 같이 변경될 수 있다
8.4.5.2.13 INTRA_LT_CCLM, INTRA_L_CCLM and INTRA_T_CCLM 인트라 예측 모드의 사양(Specification of INTRA_LT_CCLM, INTRA_L_CCLM and INTRA_T_CCLM intra prediction mode)
...
3. 다운샘플링된 동치 루마 샘플 pDsY[x][y](여기서 x = 0... nTbW - 1, y = 0... nTbH - 1)들은 다음과 같이 유도된다:
- SubWidthC 및 SubHeightC 양자 모두 1이면 다음이 적용된다:
- pDsY[x][y](여기서 x = 1... nTbW - 1, y = 1... nTbH - 1)는 다음과 같이 유도된다:
pDstY[x][y] = pY[x][y] (8-159)
- 그렇지 않으면 다음이 적용된다:
- 1차원 필터 계수 행렬 F1 및 F2, 2차원 필터 계수 행렬 F3 및 F4는 다음과 같이 명시된다.
F1[i] = 1, with i = 0... 1 (8-160)
F2[0] = 1, F2[1] = 2, F2[2] = 1 (8-161)
F3[i][j] = F4[i][j] = 0, with I = 0... 2, j = 0... 2 (8-162)
SubWidthC 및 SubHeightC 양자 모두 2이면 다음이 적용된다:
F1[0] = 1, F1[1] = 1 (8-163)
F3[0][1] = 1, F3[1][1] = 4, F3[2][1] = 1, F3[1][0] = 1, F3[1][2] = 1 (8-164)
F4[0][1] = 1, F4[1][1] = 2, F4[2][1] = 1 (8-165)
F4[0][2] = 1, F4[1][2] = 2, F4[2][2] = 1 (8-166)
그렇지 않으면 다음이 적용된다:
F1[0] = 2, F1[1] = 0 (8-167)
F3[1][1] = 8 (8-168)
F4[0][1] = 2, F4[1][1] = 4, F4[2][1] = 2, (8-169)
...
5. numSampT가 0보다 크면 선택된 이웃 상측 크로마 샘플 pSelC[idx]들은 p[pickPosT[idx - cntL]][-1](여기서 idx = cntL... cntL + cntT - 1)과 같게 설정되고 다운샘플란된 이웃 상측 루마 샘플 pSelDsY[idx](여기서 idx = 0... cntL + cntT - 1)들은 다음과 같이 명시되는데:
...
- 그렇지 않으면(sps_cclm_colocated_chroma_flag이 0이면), 다음이 작용된다:
- x가 0보다 크면 다음이 적용된다:
- bCTUboundary가 FALSE이면, 다음이 적용된다:
pSelDsY[idx] = (F4[0][1] * pY[SubWidthC * x - 1][[[-2]] -1  ] +
F4[0][2] * pY[SubWidthC * x - 1][[[-1]] -2 ] +
F4[1][1] * pY[SubWidthC * x ][[[-2]] -1 ] +
F4[1][2] * pY[SubWidthC * x][[[-1]] -2 ] +
F4[2][1] * pY[SubWidthC * x + 1][[[-2]] -1 ] +
F4[2][2] * pY[SubWidthC * x + 1][[[-1]] -2 ] + 4) >> 3 (8-193)
- 그렇지 않으면(bCTUboundary가 TRUE이면), 다음이 적용된다:
pSelDsY[idx] = (F2[0] * pY[SubWidthC * x - 1][-1] +
F2[1] * pY[SubWidthC * x][-1] +
F2[2] * pY[SubWidthC * x + 1][-1] + 2) >> 2 (8-194)
- 그렇지 않으면(x가 0이면), 다음이 적용된다:
- availTL이 TRUE이고 bCTUboundary가 FALSE이면, 다음이 적용된다:
pSelDsY[idx] = (F4[0][1] * pY[-1][[[-2]] -1 ] + F4[0][2] * pY[-1][[[-1]] -2 ] + F4[1][1] * pY[0][[[-2]] -1 ] + F4[1][2] * pY[0][[[-1]] -2 ] + F4[2][1] * pY[1][[[-2]] -1 ] + F4[2][2] * pY[1][[[-1]] -2 ] + 4) >> 3 (8-195)
- 그렇지 않고, availTL이 TRUE이고 bCTUboundary가 TRUE이면, 다음이 적용된다:
pSelDsY[idx] = (F2[0] * pY[-1][-1] + F2[1] * pY[0][-1] +
F2[2] * pY[1][-1] + 2) >> 2 (8-196)
- 그렇지 않고, availTL이 FALSE이고 bCTUboundary가 FALSE이면, 다음이 적용된다:
pSelDsY[idx] = (F1[1] * pY[0][-2] + F1[0] * pY[0][-1] + 1) >> 1 (8-197)
- 그렇지 않으면(availTL이 FALSE이고 bCTUboundary가 TRUE이면), 다음이 적용된다:
pSelDsY[idx] = pY[0][-1] (8-198)
...
5.2. 실시예 2(Embodiment 2)
이 실시예는 최대 허용된 변환 스킵 코딩된 블록 크기에 따른 크로마 변환 스킵 플래그에 대한 예를 보인다. JVET-P2001-v9에 명시된 작업 초안이 아래와 같이 변경될 수 있다.
7.3.9.10 변환 유닛 신택스(Transform unit syntax)
...
Figure pct00064
...
5.3. 실시예 3(Embodiment 3)
이 실시예는 최대 허용된 변환 스킵 코딩된 블록 크기에 따른 크로마 BDPCM 플래그에 대한 예를 보인다. JVET-P2001-v9에 명시된 작업 초안이 아래와 같이 변경될 수 있다.
7.3.9.5 코딩 유닛 신택스(Coding unit syntax)
...
Figure pct00065
...
5.4. Embodiment 4
JVET-Q2001-vE 에 명시된 작업 초안이 아래와 같이 변경될 수 있다.
8.4.5.2.13
이 프로세스에 대한 입력들은:
- 인트라 예측 모드 predModeIntra,
- 현재 픽처의 상-좌 샘플에 대한 현재 변환 블록의 상-좌 샘플의 샘플 위치(xTbC, yTbC),
- 변환 블록 폭을 명시하는 변수 nTbW,
- 변환 블록 높이를 명시하는 변수 nTbH,
- 현재 블록의 색 성분을 명시하는 변수 cIdx,
- 크로마 이웃 샘플들 p[x][y](여기서 x = -1, y = 0... 2 * nTbH - 1 및 x = 0... 2 * nTbW - 1, y = -1).
이 프로세스의 출력은 예측된 샘플 predSamples[x][y](여기서 x = 0... nTbW - 1, y = 0... nTbH - 1)들이다.
현재 루마 위치(xTbY, yTbY)는 다음과 같이 유도된다:
(xTbY, yTbY) = (xTbC << (SubWidthC - 1), yTbC << (SubHeightC - 1))(351)
변수 availL, availT, 및 availTL들은 다음과 같이 유도된다:
- 6.4.4 절(clause)에 명시된 바와 같은 인접 블록 사용 가능성(availability)에 대한 유도 프로세스는, (xTbY, yTbY)로 설정된 현재 루마 위치(xCurr, yCurr), 이웃 루마 위치 (xTbY - 1, yTbY), FALSE로 설정된 checkPredModeY, 및 cIdx를 입력으로 하여 실행되어지고, 출력은 availL 로 할당된다.
- 6.4.4 절(clause)에 명시된 바와 같은 인접 블록 사용 가능성(availability)에 대한 유도 프로세스는, (xTbY, yTbY)로 설정된 현재 루마 위치(xCurr, yCurr), 이웃 루마 위치 (xTbY, yTbY - 1), FALSE로 설정된 checkPredModeY, 및 cIdx를 입력으로 하여 실행되어지고, 출력은 availT 로 할당된다.
- 변수 availTL은 다음과 같이 유도된다:
availTL = availL && availT (352)
- 사용 가능한 상-좌 이웃 크로마 샘플의 수 numTopRight는 다음과 같이 유도된다:
- 변수 numTopRight가 0과 같게 설정되고 availTR이 TRUE와 같게 설정된다.
- predModeIntra가 INTRA_T_CCLM이면, availTR이 FALSE이거나 x가 2 * nTbW - 1이 될 때까지 다음이 x = nTbW... 2 * nTbW - 1 에 적용된다:
- 6.4.4 절(clause)에 명시된 바와 같은 인접 블록 사용 가능성(availability)에 대한 유도 프로세스는, (xTbY, yTbY)로 설정된 현재 루마 위치(xCurr, yCurr), 이웃 루마 위치 (xTbY + x, yTbY - 1), FALSE로 설정된 checkPredModeY, 및 cIdx를 입력으로 하여 실행되어지고, 출력은 availTR 로 할당된다.
- availTR이 TRUE이면, numTopRight가 1만큼 증분된다.
- 사용 가능한 좌-하 이웃 크로마 샘플들의 수 numLeftBelow는 다음과 같이 유도된다:
- 변수 numLeftBelow가 0과 같게 설정되고 availLB가 TRUE와 같게 설정된다.
- predModeIntra가 INTRA_L_CCLM이면, availLB가 FALSE이거나 y가 2 * nTbH - 1이 될 때까지 다음이 y = nTbH..2 * nTbH -1 에 적용된다:
- 6.4.4 절(clause)에 명시된 바와 같은 인접 블록 사용 가능성에 대한 유도 프로세스는, (xTbY, yTbY)로 설정된 현재 루마 위치(xCurr, yCurr), 이웃 루마 위치 (xTbY - 1, yTbY + y), FALSE로 설정된 checkPredModeY, 및 cIdx를 입력으로 하여 실행되어지고, 출력은 availLB 로 할당된다.
- availLB가 TRUE이면, numLeftBelow가 1만큼 증분된다.
상측 및 상-우의 사용 가능한 이웃 크로마 샘플들의 수 numSampT와 자측 및 좌-하의 사용 가능한 이웃 크로마 샘플들의 수 numSampL들은 다음과 같이 유도된다:
- predModeIntra가 INTRA_LT_CCLM이면, 다음이 적용된다:
numSampT = availT ? nTbW : 0 (353)
numSampL = availL ? nTbH : 0 (354)
- 그렇지 않으면 다음이 적용된다:
numSampT = (availT && predModeIntra = = INTRA_T_CCLM) ?
(nTbW +Min(numTopRight, nTbH)) : 0 (355)
numSampL = (availL && predModeIntra = = INTRA_L_CCLM) ?
(nTbH + Min(numLeftBelow, nTbW)) : 0 (356)
변수 bCTUboundary는 다음과 같이 유도된다:
bCTUboundary = (yTbY & (CtbSizeY - 1) = = 0) ? TRUE : FALSE.(357)
N이 L 및 T로 치환된 cntN 및 행렬 pickPosN은 다음과 같이 유도된다:
- 변수 numIs4N은 다음과 같이 유도된다:
numIs4N = ((availT && availL && predModeIntra = =
INTRA_LT_CCLM) ? 0 : 1) (358)
- 변수 startPosN은 numSampN >> (2 + numIs4N)과 같게 설정된다.
- 변수 pickStepN는 Max(1, numSampN >> (1 + numIs4N))과 같게 설정된다.
- availN이 TRUE이고 predModeIntra가 INTRA_LT_CCLM 또는 INTRA_N_CCLM이면, 다음 할당들이 이뤄진다:
- cntN이 Min(numSampN, (1 + numIs4N) << 1)과 같게 설정된다.
- pickPosN[pos]가 (startPosN + pos * pickStepN)(여기서 pos = 0...  cntN - 1)와 같게 설정된다.
- 그렇지 않으면, cntN이 0과 같게 설정된다.
예측 샘플 predSamples[x][y](여기서 x = 0... nTbW - 1, y = 0... nTbH - 1)들은 다음과 같이 유도된다:
- numSampL 및 numSampT 양자 모두 0이면 다음이 적용된다:
predSamples[x][y] = 1 << (BitDepth - 1) (359)
- 그렇지 않으면 다음 순서의 단계들이 적용된다:
1. 동치 루마 샘플 pY[x][y] (여기서 x = 0... nTbW * SubWidthC - 1, y = 0... nTbH * SubHeightC - 1) 들이 위치(xTbY + x, yTbY + y)들에서의 디블록킹 필터 프로세스 이전의 재현 루마 샘플들과 같게 설정된다.
2. 이웃 루마 샘플 pY[x][y]들이 다음과 같이 유도된다:
- numSampL이 0보다 크면, 이웃 좌측 루마 샘플 pY[x][y](여기서 x = -1... -3, y = 0... SubHeightC * numSampL - 1)들이 위치(xTbY + x, yTbY + y)들에서의 디블록킹 필터 프로세스 이전의 재현 루마 샘플들과 같게 설정된다.
- availT가 FALSE이면, 이웃 상측 루마 샘플 pY[x][y](여기서 x = -1... SubWidthC * numSampT - 1, y = -1... -2)들이 루마 샘플 pY[x][0]들과 같게 설정된다.
- availL이 FALSE이면, 이웃 좌측 루마 샘플 pY[x][y](여기서 x = -1... -3, y = -1... SubHeightC * numSampL - 1)들이 루마 샘플 pY[0][y]들과 같게 설정된다.
- numSampT가 0보다 크면, 이웃 상측 루마 샘플 pY[x][y](여기서 x = 0... SubWidthC * numSampT - 1, y = -1, -2)들이 위치(xTbY + x, yTbY + y)들에서의 디블록킹 필터 프로세스 이전의 재현 루마 샘플들과 같게 설정된다.
- availTL이 TRUE이면, 이웃 상-좌 루마 샘플 pY[x][y](여기서 x = - 1, y = -1, -2)들이 위치(xTbY + x, yTbY + y)들에서의 디블록킹 필터 프로세스 이전의 재현 루마 샘플들과 같게 설정된다.
3. 다운샘플링된 동치 루마 샘플 pDsY[x][y](여기서 x = 0... nTbW - 1, y = 0... nTbH - 1)들은 다음과 같이 유도된다:
- SubWidthC 및 SubHeightC 양자 모두 1이면, 다음이 적용된다:
- pDsY[x][y](여기서 x = 1... nTbW - 1, y = 1... nTbH - 1)는 다음과 같이 유도된다:
pDstY[x][y] = pY[x][y] (360)
- 그렇지 않으면 다음이 적용된다:
- 1차원 필터 계수 행렬 F1 및 F2와 차원 필터 계수 행렬 F3 및 F4 들은 다음과 같이 명시된다.
F1[0] = 2, F1[1] = 0 (361)
F2[0] = 1, F2[1] = 2, F2[2] = 1 (362)
F3[i][j] = F4[i][j] = 0,(여기서 i = 0... 2, j = 0... 2) (363)
- SubWidthC 및 SubHeightC 양자 모두 2이면, 다음이 적용된다:
F1[0] = 1, F1[1] = 1 (364)
F3[0][1] = 1, F3[1][1] = 4, F3[2][1] = 1, F3[1][0] = 1, F3[1][2] = 1 (365)
F4[0][1] = 1, F4[1][1] = 2, F4[2][1] = 1 (366)
F4[0][2] = 1, F4[1][2] = 2, F4[2][2] = 1 (367)
- 그렇지 않으면 다음이 적용된다:
F3[1][1] = 8 (368)
F4[0][1] = 2, F4[1][1] = 4, F4[2][1] = 2, (369)
- sps_chroma_vertical_collocated_flag이 1이면, 다음이 적용된다:
- pDsY[x][y](여기서 x = 0... nTbW - 1, y = 0... nTbH - 1)는 다음과 같이 유도된다:
- pDsY[x][y] = (F3[1][0] * pY[SubWidthC * x][ SubHeightC * y - 1] +
F3[0][1] * pY[SubWidthC * x - 1][SubHeightC * y] +
F3[1][1] * pY[SubWidthC * x][SubHeightC * y] +
F3[2][1] * pY[SubWidthC * x + 1][SubHeightC * y] +
F3[1][2] * pY[SubWidthC * x][SubHeightC * y + 1] + 4) >> 3 (370)
- 그렇지 않으면(sps_chroma_vertical_collocated_flag이 0이면), 다음이 적용된다:
- pDsY[x][y](여기서 x = 0... nTbW - 1, y = 0... nTbH - 1)는 다음과 같이 유도된다:
pDsY[x][y] = (F4[0][1] * pY[SubWidthC * x - 1][SubHeightC * y] +
F4[0][2] * pY[SubWidthC * x - 1][SubHeightC * y + 1] +
F4[1][1] * pY[SubWidthC * x][SubHeightC * y] +
F4[1][2] * pY[SubWidthC * x][SubHeightC * y + 1] +
F4[2][1] * pY[SubWidthC * x + 1][SubHeightC * y] +
F4[2][2] * pY[SubWidthC * x + 1][SubHeightC * y + 1] + 4) >> 3 (371)
[[ 4. numSampL이 0보다 크면, 선택된 이웃 좌측 크로마 샘플 pSelC[idx]들이 p[-1][pickPosL[idx]](여기서 idx = 0... cntL - 1)와 같게 설정되고, 선택된 다운샘플링된 이웃 좌측 루마 샘플 pSelDsY[idx](여기서 idx = 0... cntL - 1)들은 다음과 같이 유도된다:
- 변수 y가 pickPosL[idx]와 같게 설정된다.
- SubWidthC 및 SubHeightC 양자 모두 1이면, 다음이 적용된다:
pSelDsY[idx] = pY[-1][y] (372)
- 그렇지 않으면 다음이 적용된다:
- sps_chroma_vertical_collocated_flag이 1이면 다음이 적용된다:
pSelDsY[idx] = (F3[1][0] * pY[- SubWidthC][SubHeightC * y - 1] +
F3[0][1] * pY[-1 - SubWidthC][SubHeightC * y] +
F3[1][1] * pY[-SubWidthC][SubHeightC * y] +
F3[2][1] * pY[1 - SubWidthC][SubHeightC * y] +
F3[1][2] * pY[-SubWidthC][SubHeightC * y + 1] + 4) >> 3 (373)
- 그렇지 않으면(sps_chroma_vertical_collocated_flag이 0이면), 다음이 적용된다:
pSelDsY[idx] = (F4[0][1] * pY[-1 - SubWidthC][SubHeightC * y] +
F4[0][2] * pY[-1 - SubWidthC][SubHeightC * y + 1]  +
F4[1][1] * pY[-SubWidthC][SubHeightC * y] +
F4[1][2] * pY[-SubWidthC][SubHeightC * y + 1] +
F4[2][1] * pY[1 - SubWidthC][SubHeightC * y] +
F4[2][2] * pY[1 - SubWidthC][SubHeightC * y + 1] + 4) >> 3 (374)
5. numSampT가 0보다 크면, 선택된 이웃 상측 크로마 샘플 pSelC[idx]들이 p[pickPosT[idx - cntL]][-1](여기서 idx = cntL... cntL + cntT - 1)와 같게 설정되고 다운샘플링된 이웃 상측 루마 샘플 pSelDsY[idx](여기서 idx = 0... cntL + cntT - 1)들은 다음과 같이 명시된다:
- 변수 x는 pickPosT[idx - cntL]와 같게 설정된다.
- SubWidthC 및 SubHeightC 양자 모두 1이면, 다음이 적용된다:
pSelDsY[idx] = pY[x][-1] (375)
- 그렇지 않으면 다음이 적용된다:
- sps_chroma_vertical_collocated_flag이 1이면. 다음이 적용된다:
- bCTUboundary가 FALSE이면 다음이 적용된다:
pSelDsY[idx] = (F3[1][0] * pY[SubWidthC * x][-1 - SubHeightC] +
F3[0][1] * pY[SubWidthC * x - 1][-SubHeightC] +
F3[1][1] * pY[SubWidthC * x][-SubHeightC] +
F3[2][1] * pY[SubWidthC * x + 1][-SubHeightC] +
F3[1][2] * pY[SubWidthC * x][1 - SubHeightC] + 4) >> 3 (376)
- 그렇지 않으면(bCTUboundary가 TRUE이면), 다음이 적용된다:
pSelDsY[idx] = (F2[0] * pY[SubWidthC * x - 1][-1] +
F2[1] * pY[SubWidthC * x][-1] +
F2[2] * pY[SubWidthC * x + 1][-1] + 2) >> 2 (377)
- 그렇지 않으면(sps_chroma_vertical_collocated_flag이 0이면) 다음이 적용된다:
- bCTUboundary 가 FALSE이면 다음이 적용된다:
pSelDsY[idx] = (F4[0][1] * pY[SubWidthC * x - 1][-1] +
F4[0][2] * pY[SubWidthC * x - 1][-2] +
F4[1][1] * pY[SubWidthC * x][-1] +
F4[1][2] * pY[SubWidthC * x][-2] +
F4[2][1] * pY[SubWidthC * x + 1][-1] +
F4[2][2] * pY[SubWidthC * x + 1][-2] + 4) >> 3 (378)
- 그렇지 않으면(bCTUboundary가 TRUE이면), 다음이 적용된다:
pSelDsY[idx] = (F2[0] * pY[SubWidthC * x - 1][-1] +
F2[1] * pY[SubWidthC * x][-1] +
F2[2] * pY[SubWidthC * x + 1][-1] + 2) >> 2 (379) ]]
4. numSampT가 0보다 크면, 선택된 이웃 상측 크로마 샘플 pSelC[idx]들은 p[pickPosT[idx]][-1](여기서 idx = 0... cntT - 1)과 같게 설정되고, 다운샘플링된 이웃 상측 루마 샘플 pSelDsY[idx](여기서 idx = 0... cntT - )들은 다음과 같이 명시된다:
- 변수 x는 pickPosT[idx]와 같게 설정된다.
- SubWidthC 및 SubHeightC 양자 모두 1이면, 다음이 적용된다:
pSelDsY[idx] = pY[x][-1] (375)
- 그렇지 않으면 다음이 적용된다:
- sps_chroma_vertical_collocated_flag이 1이면, 다음이 적용된다:
- bCTUboundary가 FALSE이면, 다음이 적용된다:
pSelDsY[idx] = (F3[1][0] * pY[SubWidthC * x][-1 - SubHeightC] +
F3[0][1] * pY[SubWidthC * x - 1][-SubHeightC] +
F3[1][1] * pY[SubWidthC * x][-SubHeightC] +
F3[2][1] * pY[SubWidthC * x + 1][-SubHeightC] +
F3[1][2] * pY[SubWidthC * x][1 - SubHeightC] + 4) >> 3 (376)
- 그렇지 않으면(bCTUboundary가 TRUE이면), 다음이 적용된다:
pSelDsY[idx] = (F2[0] * pY[SubWidthC * x - 1][-1] +
F2[1] * pY[SubWidthC * x][-1] +
F2[2] * pY[SubWidthC * x + 1][-1] + 2) >> 2 (377)
- 그렇지 않으면(sps_chroma_vertical_collocated_flag이 0이면 다음이 적용된다:
- bCTUboundary가 FALSE이면, 다음이 적용된다:
pSelDsY[idx] = (F4[0][1] * pY[SubWidthC x - 1][-1] +
F4[0][2] * pY[SubWidthC * x - 1][-2] +
F4[1][1] * pY[SubWidthC * x][-1] +
F4[1][2] * pY[SubWidthC * x][-2] +
F4[2][1] * pY[SubWidthC * x + 1][-1] +
F4[2][2] * pY[SubWidthC * x + 1][-2] + 4) >> 3 (378)
- 그렇지 않으면(bCTUboundary가 TRUE이면), 다음이 적용된다:
pSelDsY[idx] = (F2[0] * pY[SubWidthC * x - 1][-1] +
F2[1] * pY[SubWidthC * x][-1] +
F2[2] * pY[SubWidthC * x + 1][-1] + 2) >> 2 (379)
5. numSampL이 0보다 크면, 선택된 이웃 좌측 크로마 샘플 pSelC[idx]들이 p[-1][pickPosL[idx - cntT] (여기서 idx = cntT... cntT + cntL - 1)와 같게 설정되고, 선택된 다운샘플링된 이웃 좌측 루마 샘플 pSelDsY[idx](여기서 idx = cntT... cntT + cntL - 1)들이 다음과 같이 유도된다:
- 변수 y가 pickPosL[idx - cntT]와 같게 설정된다.
- SubWidthC 및 SubHeightC 양자 모두 1이면, 다음이 적용된다:
pSelDsY[idx] = pY[-1][y] (372)
- 그렇지 않으면 다음이 적용된다:
- sps_chroma_vertical_collocated_flag이 1이면, 다음이 적용된다:
pSelDsY[idx] = (F3[1][0] * pY[-SubWidthC][SubHeightC * y - 1]+
F3[0][1] * pY[-1-SubWidthC][SubHeightC * y] +
F3[1][1] * pY[-SubWidthC][SubHeightC * y] +
F3[2][1] * pY[1 - SubWidthC][SubHeightC * y] +
F3[1][2] * pY[-SubWidthC][SubHeightC * y + 1] + 4) >> 3 (373)
- 그렇지 않으면(sps_chroma_vertical_collocated_flag이 0이면), 다음이 적용된다:
pSelDsY[idx] = (F4[0][1]*pY[-1 - SubWidthC][SubHeightC *  y] +
F4[0][2]*pY[-1 - SubWidthC][SubHeightC * y + 1] +
F4[1][1] * pY[-SubWidthC][SubHeightC * y] +
F4[1][2] * pY[-SubWidthC][SubHeightC * y + 1] +
F4[2][1] * pY[1 - SubWidthC][SubHeightC * y] +
F4[2][2] * pY[1 - SubWidthC][SubHeightC * y + 1] + 4) >> 3 (374)
6. cntT + cntL이 0이 아니면, 변수 minY, maxY, minC 및 maxC들은 다음과 같이 유도된다:
- cntT + cntLd; 2이면, pSelComp[3]이 pSelComp[0]와 같게 설정되고, pSelComp[2]가 pSelComp[1]와 같게 설정되며, pSelComp[0]이 pSelComp[1]와 같게 설정되고, 그리고 pSelComp[1]이 pSelComp[3]과 같게 설정되며, Comp가 DsY 및 C로 치환된다.
- 행렬 minGrpIdx 및 maxGrpIdx는 다음과 같이 유도된다:
minGrpIdx[0] = 0 (380)
minGrpIdx[1] = 2 (381)
maxGrpIdx[0] = 1 (382)
maxGrpIdx[1] = 3 (383)
- pSelDsY[minGrpIdx[0]]이 pSelDsY[minGrpIdx[1]]보다 크면, minGrpIdx[0]와 minGrpIdx[1]이 다음과 같이 스왑된다(swapped):
(minGrpIdx[0], minGrpIdx[1]) = Swap(minGrpIdx[0], minGrpIdx[1]) (384)
- pSelDsY[maxGrpIdx[0]]이 pSelDsY[maxGrpIdx[1]]보다 크면, maxGrpIdx[0]와 maxGrpIdx[1]이 다음과 같이 스왑된다:
(maxGrpIdx[0], maxGrpIdx[1]) = Swap(maxGrpIdx[0], maxGrpIdx[1]) (385)
- pSelDsY[minGrpIdx[0]]이 pSelDsY[maxGrpIdx[1]]보다 크면, 행렬 minGrpIdx와 maxGrpIdx가 다음과 같이 스왑된다:
(minGrpIdx, maxGrpIdx) = Swap(minGrpIdx, maxGrpIdx) (386)
- pSelDsY[minGrpIdx[1]]이 pSelDsY[maxGrpIdx[0]]보다 크면, minGrpIdx[1]와 maxGrpIdx[0]이 다음과 같이 스왑된다:
(minGrpIdx[1], maxGrpIdx[0]) = Swap(minGrpIdx[1], maxGrpIdx[0]) (387)
- 변수 maxY, maxC, minY 및 minC가 다음과 같이 유도된다:
maxY = (pSelDsY[maxGrpIdx[0]] + pSelDsY[maxGrpIdx[1]] + 1) >> 1 (388)
maxC =(pSelC[maxGrpIdx[0]] + pSelC[maxGrpIdx[1]] + 1) >> 1 (389)
minY = (pSelDsY[minGrpIdx[0]] + pSelDsY[minGrpIdx[1]] + 1) >> 1 (390)
minC = (pSelC[minGrpIdx[0]] + pSelC[minGrpIdx[1]] + 1) >> 1 (391)
7. 변수 a, b,및 k는 다음과 같이 유도된다:
- numSampL이 0이고 numSampT가 0이면 다음이 적용된다:
k = 0 (392)
a = 0 (393)
b = 1 << (BitDepth - 1) (394)
- 그렇지 않으면 다음이 적용된다:
diff = maxY - minY (395)
- diff가 0이 아니면 다음이 적용된다:
diffC = maxC - minC (396)
x = Floor(Log2(diff)) (397)
normDiff = ((diff << 4) >> x) & 15 (398)
x += (normDiff != 0) ? 1 : 0 (399)
y = Abs(diffC) > 0 ? Floor(Log2(Abs(diffC))) + 1 : 0 (400)
a = (diffC * (divSigTable[normDiff] | 8) + 2y-1) >> y (401)
k = ((3 + x - y) < 1) 1 : 3 + x - y (402)
a = ((3 + x - y) < 1) ? Sign(a) * 15 : a (403)
b = minC - ((a * minY) >> k) (404)
여기서 divSigTable[ ]은 다음과 같이 명시된다:
divSigTable[ ] = { 0, 7, 6, 5, 5, 4, 4, 3, 3, 2, 2, 1, 1, 1, 1, 0 } (405)
- 그렇지 않으면(diff가 0이면), 다음이 적용된다:
k = 0 (406)
a = 0 (407)
b = minC (408)
8. 예측 샘플 predSamples[x][y](여기서 x = 0... nTbW - 1, y = 0... nTbH - 1)들은 다음과 같이 유도된다:
predSamples[x][y] = Clip1(((pDsY[x][y] * a) >> k) + b) (409)
참고(NOTE) - 이 프로세스는 sps_chroma_vertical_collocated_flag을 사용한다. 그러나 구현을 간단히 하기 위해 sps_chroma_horizontal_collocated_flag은 사용하지 않는다.
5.5. 실시예 5(Embodiment 5)
JVET-Q2001-vE 에 명시된 작업 초안이 아래와 같이 변경될 수 있다.
8.4.5.2.13
이 프로세스에 대한 입력들은:
- 인트라 예측 모드 predModeIntra,
- 현재 픽처의 상-좌 샘플에 대한 현재 변환 블록의 상-좌 샘플의 샘플 위치(xTbC, yTbC),
- 변환 블록 폭을 명시하는 변수 nTbW,
- 변환 블록 높이를 명시하는 변수 nTbH,
- 현재 블록의 색 성분을 명시하는 변수 cIdx,
- 크로마 이웃 샘플들 p[x][y](여기서 x = -1, y = 0... 2 * nTbH - 1 및 x = 0... 2 * nTbW - 1, y = -1).
이 프로세스의 출력은 예측된 샘플 predSamples[x][y](여기서 x = 0... nTbW - 1, y = 0... nTbH - 1)들이다.
현재 루마 위치(xTbY, yTbY)는 다음과 같이 유도된다:
(xTbY, yTbY) = (xTbC << (SubWidthC - 1), yTbC << (SubHeightC - 1))(351)
변수 availL, availT, 및 availTL들은 다음과 같이 유도된다:
- 6.4.4 절(clause)에 명시된 바와 같은 인접 블록 사용 가능성에 대한 유도 프로세스는, (xTbY, yTbY)로 설정된 현재 루마 위치(xCurr, yCurr), 이웃 루마 위치 (xTbY - 1, yTbY), FALSE로 설정된 checkPredModeY, 및 cIdx를 입력으로 하여 실행되어지고, 출력은 availL 로 할당된다.
- 6.4.4 절(clause)에 명시된 바와 같은 인접 블록 사용 가능성에 대한 유도 프로세스는, (xTbY, yTbY)로 설정된 현재 루마 위치(xCurr, yCurr), 이웃 루마 위치 (xTbY, yTbY - 1), FALSE로 설정된 checkPredModeY, 및 cIdx를 입력으로 하여 실행되어지고, 출력은 availT 로 할당된다.
- 변수 availTL은 다음과 같이 유도된다:
availTL = availL && availT (352)
- 사용 가능한 상-좌 이웃 크로마 샘플의 수 numTopRight는 다음과 같이 유도된다:
- 변수 numTopRight가 0과 같게 설정되고 availTR이 TRUE와 같게 설정된다.
- predModeIntra가 INTRA_T_CCLM이면, availTR이 FALSE이거나 x가 2 * nTbW - 1이 될 때까지 다음이 x = nTbW... 2 * nTbW - 1에 적용된다:
- 6.4.4 절(clause)에 명시된 바와 같은 인접 블록 사용 가능성에 대한 유도 프로세스는, (xTbY, yTbY)로 설정된 현재 루마 위치(xCurr, yCurr), 이웃 루마 위치 (xTbY + x, yTbY - 1), FALSE로 설정된 checkPredModeY, 및 cIdx를 입력으로 하여 실행되어지고, 출력은 availTR 로 할당된다.
- availTR이 TRUE이면, numTopRight가 1만큼 증분된다.
- 사용 가능한 좌-하 이웃 크로마 샘플들의 수 numLeftBelow는 다음과 같이 유도된다:
- 변수 numLeftBelow가 0과 같게 설정되고 availLB가 TRUE와 같게 설정된다.
- predModeIntra가 INTRA_L_CCLM이면, availLB가 FALSE이거나 y가 2 * nTbH - 1이 될 때까지 다음이 적용된다:
- 6.4.4 절(clause)에 명시된 바와 같은 인접 블록 사용 가능성에 대한 유도 프로세스는, (xTbY, yTbY)로 설정된 현재 루마 위치(xCurr, yCurr), 이웃 루마 위치 (xTbY - 1, yTbY + y), FALSE로 설정된 checkPredModeY, 및 cIdx를 입력으로 하여 실행되어지고, 출력은 availLB 로 할당된다.
- availLB가 TRUE이면, numLeftBelow가 1만큼 증분된다.
상측 및 상-우의 사용 가능한 이웃 크로마 샘플들의 수 numSampT와 자측 및 좌-하의 사용 가능한 이웃 크로마 샘플들의 수 numSampL들은 다음과 같이 유도된다:
- predModeIntra가 INTRA_LT_CCLM이면, 다음이 적용된다:
numSampT = availT ? nTbW : 0 (353)
numSampL = availL ? nTbH : 0 (354)
- 그렇지 않으면 다음이 적용된다:
numSampT = (availT && predModeIntra = = INTRA_T_CCLM) ?
(nTbW +Min(numTopRight, nTbH)) : 0 (355)
numSampL = (availL && predModeIntra = = INTRA_L_CCLM) ?
(nTbH + Min(numLeftBelow, nTbW)) : 0 (356)
변수 bCTUboundary는 다음과 같이 유도된다:
bCTUboundary = (yTbY & (CtbSizeY - 1) = = 0) ? TRUE : FALSE.(357)
N이 L 및 T로 치환된 cntN 및 행렬 pickPosN은 다음과 같이 유도된다:
- 변수 numIs4N은 다음과 같이 유도된다:
numIs4N = ((availT && availL && predModeIntra = =
INTRA_LT_CCLM) ? 0 : 1) (358)
- 변수 startPosN은 numSampN >> (2 + numIs4N)과 같게 설정된다.
- 변수 pickStepN는 Max(1, numSampN >> (1 + numIs4N))과 같게 설정된다.
- availN이 TRUE이고 predModeIntra가 INTRA_LT_CCLM 또는 INTRA_N_CCLM이면, 다음 할당들이 이뤄진다:
- cntN이 Min(numSampN, (1 + numIs4N) << 1)과 같게 설정된다.
- pickPosN[pos]가 (startPosN + pos * pickStepN)(여기서 pos = 0...  cntN - 1)와 같게 설정된다.
- 그렇지 않으면, cntN이 0과 같게 설정된다.
예측 샘플 predSamples[x][y](여기서 x = 0... nTbW - 1, y = 0... nTbH - 1)들은 다음과 같이 유도된다:
- numSampL 및 numSampT 양자 모두 0이면 다음이 적용된다:
predSamples[x][y] = 1 << (BitDepth - 1) (359)
- 그렇지 않으면 다음 순서의 단계들이 적용된다:
1. 동치 루마 샘플 pY[x][y](여기서 x = 0... nTbW * SubWidthC - 1, y = 0... nTbH * SubHeightC - 1)들이 위치(xTbY + x, yTbY + y)들에서의 디블록킹 필터 프로세스 이전의 재현 루마 샘플들과 같게 설정된다.
2. 이웃 루마 샘플 pY[x][y]들이 다음과 같이 유도된다:
- numSampL이 0보다 크면, 이웃 좌측 루마 샘플 pY[x][y](여기서 x = -1... -3, y = 0... SubHeightC * numSampL - 1)들이 위치(xTbY + x, yTbY + y)들에서의 디블록킹 필터 프로세스 이전의 재현 루마 샘플들과 같게 설정된다.
- availT가 FALSE이면, 이웃 상측 루마 샘플 pY[x][y](여기서 x = -1... SubWidthC * numSampT - 1, y = -1... -2)들이 루마 샘플 pY[x][0]들과 같게 설정된다.
- availL이 FALSE이면, 이웃 좌측 루마 샘플 pY[x][y](여기서 x = -1... -3, y = -1... SubHeightC * numSampL - 1)들이 루마 샘플 pY[0][y]들과 같게 설정된다.
- numSampT가 0보다 크면, 이웃 상측 루마 샘플 pY[x][y](여기서 x = 0... SubWidthC * numSampT - 1, y = -1, -2)들이 위치(xTbY + x, yTbY + y)들에서의 디블록킹 필터 프로세스 이전의 재현 루마 샘플들과 같게 설정된다.
- availTL이 TRUE이면, 이웃 상-좌 루마 샘플 pY[x][y](여기서 x = - 1, y = -1, -2)들이 위치(xTbY + x, yTbY + y)들에서의 디블록킹 필터 프로세스 이전의 재현 루마 샘플들과 같게 설정된다.
3. 다운샘플링된 동치 루마 샘플 pDsY[x][y](여기서 x = 0... nTbW - 1, y = 0... nTbH - 1)들은 다음과 같이 유도된다:
- SubWidthC 및 SubHeightC 양자 모두 1이면, 다음이 적용된다:
- pDsY[x][y](여기서 x = 1... nTbW - 1, y = 1... nTbH - 1)는 다음과 같이 유도된다:
pDstY[x][y] = pY[x][y] (360)
- 그렇지 않으면 다음이 적용된다:
- 1차원 필터 계수 행렬 F1 및 F2와 차원 필터 계수 행렬 F3 및 F4 들은 다음과 같이 명시된다.
F1[0] = 2, F1[1] = 0 (361)
F2[0] = 1, F2[1] = 2, F2[2] = 1 (362)
F3[i][j] = F4[i][j] = 0,(여기서 i = 0... 2, j = 0... 2) (363)
- SubWidthC 및 SubHeightC 양자 모두 2이면, 다음이 적용된다:
F1[0] = 1, F1[1] = 1 (364)
F3[0][1] = 1, F3[1][1] = 4, F3[2][1] = 1, F3[1][0] = 1, F3[1][2] = 1 (365)
F4[0][1] = 1, F4[1][1] = 2, F4[2][1] = 1 (366)
F4[0][2] = 1, F4[1][2] = 2, F4[2][2] = 1 (367)
- 그렇지 않으면 다음이 적용된다:
F3[1][1] = 8 (368)
F4[0][1] = 2, F4[1][1] = 4, F4[2][1] = 2, (369)
- sps_chroma_vertical_collocated_flag이 1이면, 다음이 적용된다:
- pDsY[x][y](여기서 x = 0... nTbW - 1, y = 0... nTbH - 1)는 다음과 같이 유도된다:
- pDsY[x][y] = (F3[1][0] * pY[SubWidthC * x][ SubHeightC * y - 1] +
F3[0][1] * pY[SubWidthC * x - 1][SubHeightC * y] +
F3[1][1] * pY[SubWidthC * x][SubHeightC * y] +
F3[2][1] * pY[SubWidthC * x + 1][SubHeightC * y] +
F3[1][2] * pY[SubWidthC * x][SubHeightC * y + 1] + 4) >> 3 (370)
- 그렇지 않으면(sps_chroma_vertical_collocated_flag이 0이면), 다음이 적용된다:
- pDsY[x][y](여기서 x = 0... nTbW - 1, y = 0... nTbH - 1)는 다음과 같이 유도된다:
pDsY[x][y] = (F4[0][1] * pY[SubWidthC * x - 1][SubHeightC * y] +
F4[0][2] * pY[SubWidthC * x - 1][SubHeightC * y + 1] +
F4[1][1] * pY[SubWidthC * x][SubHeightC * y] +
F4[1][2] * pY[SubWidthC * x][SubHeightC * y + 1] +
F4[2][1] * pY[SubWidthC * x + 1][SubHeightC * y] +
F4[2][2] * pY[SubWidthC * x + 1][SubHeightC * y + 1] + 4) >> 3 (371)
4. numSampL이 0보다 크면, 선택된 이웃 좌측 크로마 샘플 pSelC[idx]들이 p[-1][pickPosL[idx]](여기서 idx = 0... cntL - 1)와 같게 설정되고, 선택된 다운샘플링된 이웃 좌측 루마 샘플 pSelDsY[idx](여기서 idx = 0... cntL - 1)들은 다음과 같이 유도된다:
- 변수 y가 pickPosL[idx]와 같게 설정된다.
- SubWidthC 및 SubHeightC 양자 모두 1이면, 다음이 적용된다:
pSelDsY[idx] = pY[-1][y] (372)
- 그렇지 않으면 다음이 적용된다:
- sps_chroma_vertical_collocated_flag이 1이면 다음이 적용된다:
pSelDsY[idx] = (F3[1][0] * pY[- SubWidthC][SubHeightC * y - 1] +
F3[0][1] * pY[-1 - SubWidthC][SubHeightC * y] +
F3[1][1] * pY[-SubWidthC][SubHeightC * y] +
F3[2][1] * pY[1 - SubWidthC][SubHeightC * y] +
F3[1][2] * pY[-SubWidthC][SubHeightC * y + 1] + 4) >> 3 (373)
- 그렇지 않으면(sps_chroma_vertical_collocated_flag이 0이면), 다음이 적용된다:
pSelDsY[idx] = (F4[0][1] * pY[-1 - SubWidthC][SubHeightC * y] +
F4[0][2] * pY[-1 - SubWidthC][SubHeightC * y + 1]  +
F4[1][1] * pY[-SubWidthC][SubHeightC * y] +
F4[1][2] * pY[-SubWidthC][SubHeightC * y + 1] +
F4[2][1] * pY[1 - SubWidthC][SubHeightC * y] +
F4[2][2] * pY[1 - SubWidthC][SubHeightC * y + 1] + 4) >> 3 (374)
5. numSampT가 0보다 크면, 선택된 이웃 상측 크로마 샘플 pSelC[idx]들이 p[pickPosT[idx - cntL]][-1](여기서 idx = cntL... cntL + cntT - 1)와 같게 설정되고 다운샘플링된 이웃 상측 루마 샘플 pSelDsY[idx](여기서 idx = [[0]] cntL ... cntL + cntT - 1)들은 다음과 같이 명시된다:
- 변수 x는 pickPosT[idx - cntL]와 같게 설정된다.
- SubWidthC 및 SubHeightC 양자 모두 1이면, 다음이 적용된다:
pSelDsY[idx] = pY[x][-1] (375)
- 그렇지 않으면 다음이 적용된다:
- sps_chroma_vertical_collocated_flag이 1이면. 다음이 적용된다:
- bCTUboundary가 FALSE이면 다음이 적용된다:
pSelDsY[idx] = (F3[1][0] * pY[SubWidthC * x][-1 - SubHeightC] +
F3[0][1] * pY[SubWidthC * x - 1][-SubHeightC] +
F3[1][1] * pY[SubWidthC * x][-SubHeightC] +
F3[2][1] * pY[SubWidthC * x + 1][-SubHeightC] +
F3[1][2] * pY[SubWidthC * x][1 - SubHeightC] + 4) >> 3 (376)
- 그렇지 않으면(bCTUboundary가 TRUE이면), 다음이 적용된다:
pSelDsY[idx] = (F2[0] * pY[SubWidthC * x - 1][-1] +
F2[1] * pY[SubWidthC * x][-1] +
F2[2] * pY[SubWidthC * x + 1][-1] + 2) >> 2 (377)
- 그렇지 않으면(sps_chroma_vertical_collocated_flag이 0이면) 다음이 적용된다:
- bCTUboundary 가 FALSE이면 다음이 적용된다:
pSelDsY[idx] = (F4[0][1] * pY[SubWidthC * x - 1][-1] +
F4[0][2] * pY[SubWidthC * x - 1][-2] +
F4[1][1] * pY[SubWidthC * x][-1] +
F4[1][2] * pY[SubWidthC * x][-2] +
F4[2][1] * pY[SubWidthC * x + 1][-1] +
F4[2][2] * pY[SubWidthC * x + 1][-2] + 4) >> 3(378)
- 그렇지 않으면(bCTUboundary가 TRUE이면), 다음이 적용된다:
pSelDsY[idx] = (F2[0] * pY[SubWidthC * x - 1][-1] +
F2[1] * pY[SubWidthC * x][-1] +
F2[2] * pY[SubWidthC * x + 1][-1] + 2) >> 2 (379)
6. cntT + cntL이 0이 아니면, 변수 minY, maxY, minC 및 maxC들은 다음과 같이 유도된다:
- cntT + cntLd; 2이면, pSelComp[3]이 pSelComp[0]와 같게 설정되고, pSelComp[2]가 pSelComp[1]와 같게 설정되며, pSelComp[0]이 pSelComp[1]와 같게 설정되고, 그리고 pSelComp[1]이 pSelComp[3]과 같게 설정되며, Comp가 DsY 및 C로 치환된다.
- 행렬 minGrpIdx 및 maxGrpIdx는 다음과 같이 유도된다:
minGrpIdx[0] = 0 (380)
minGrpIdx[1] = 2 (381)
maxGrpIdx[0] = 1 (382)
maxGrpIdx[1] = 3 (383)
- pSelDsY[minGrpIdx[0]]이 pSelDsY[minGrpIdx[1]]보다 크면, minGrpIdx[0]와 minGrpIdx[1]이 다음과 같이 스왑된다(swapped):
(minGrpIdx[0], minGrpIdx[1]) = Swap(minGrpIdx[0], minGrpIdx[1]) (384)
- pSelDsY[maxGrpIdx[0]]이 pSelDsY[maxGrpIdx[1]]보다 크면, maxGrpIdx[0]와 maxGrpIdx[1]이 다음과 같이 스왑된다:
(maxGrpIdx[0], maxGrpIdx[1]) = Swap(maxGrpIdx[0], maxGrpIdx[1]) (385)
- pSelDsY[minGrpIdx[0]]이 pSelDsY[maxGrpIdx[1]]보다 크면, 행렬 minGrpIdx와 maxGrpIdx가 다음과 같이 스왑된다:
(minGrpIdx, maxGrpIdx) = Swap(minGrpIdx, maxGrpIdx) (386)
- pSelDsY[minGrpIdx[1]]이 pSelDsY[maxGrpIdx[0]]보다 크면, minGrpIdx[1]와 maxGrpIdx[0]이 다음과 같이 스왑된다:
(minGrpIdx[1], maxGrpIdx[0]) = Swap(minGrpIdx[1], maxGrpIdx[0]) (387)
- 변수 maxY, maxC, minY 및 minC가 다음과 같이 유도된다:
maxY = (pSelDsY[maxGrpIdx[0]] + pSelDsY[maxGrpIdx[1]] + 1) >> 1 (388)
maxC =(pSelC[maxGrpIdx[0]] + pSelC[maxGrpIdx[1]] + 1) >> 1 (389)
minY = (pSelDsY[minGrpIdx[0]] + pSelDsY[minGrpIdx[1]] + 1) >> 1 (390)
minC = (pSelC[minGrpIdx[0]] + pSelC[minGrpIdx[1]] + 1) >> 1 (391)
7. 변수 a, b,및 k는 다음과 같이 유도된다:
- numSampL이 0이고 numSampT가 0이면 다음이 적용된다:
k = 0 (392)
a = 0 (393)
b = 1 << (BitDepth - 1) (394)
- 그렇지 않으면 다음이 적용된다:
diff = maxY - minY (395)
- diff가 0이 아니면 다음이 적용된다:
diffC = maxC - minC (396)
x = Floor(Log2(diff)) (397)
normDiff = ((diff << 4) >> x) & 15 (398)
x += (normDiff != 0) ? 1 : 0 (399)
y = Abs(diffC) > 0 ? Floor(Log2(Abs(diffC))) + 1 : 0 (400)
a = (diffC * (divSigTable[normDiff] | 8) + 2y-1) >> y (401)
k = ((3 + x - y) < 1) 1 : 3 + x - y (402)
a = ((3 + x - y) < 1) ? Sign(a) * 15 : a (403)
b = minC - ((a * minY) >> k) (404)
여기서 divSigTable[ ]은 다음과 같이 명시된다:
divSigTable[ ] = { 0, 7, 6, 5, 5, 4, 4, 3, 3, 2, 2, 1, 1, 1, 1, 0 } (405)
- 그렇지 않으면(diff가 0이면), 다음이 적용된다:
k = 0 (406)
a = 0 (407)
b = minC (408)
8. 예측 샘플 predSamples[x][y](여기서 x = 0... nTbW - 1, y = 0... nTbH - 1)들은 다음과 같이 유도된다:
predSamples[x][y] = Clip1(((pDsY[x][y] * a) >> k) + b) (409)
참고(NOTE) - 이 프로세스는 sps_chroma_vertical_collocated_flag을 사용한다. 그러나 구현을 간단히 하기 위해 sps_chroma_horizontal_collocated_flag은 사용하지 않는다.
5.6. 실시예 6(Embodiment 6)
JVET-Q2001-vE에 명시된 작업 초안이 아래와 같이 변경될 수 있다.
8.4.5.2.13
이 프로세스에 대한 입력들은:
- 인트라 예측 모드 predModeIntra,
- 현재 픽처의 상-좌 샘플에 대한 현재 변환 블록의 상-좌 샘플의 샘플 위치(xTbC, yTbCF),
- 변환 블록 폭을 명시하는 변수 nTbW,
- 변환 블록 높이를 명시하는 변수 nTbH,
- 현재 블록의 색 성분을 명시하는 변수 cIdx,
- 크로마 이웃 샘플들 p[x][y](여기서 x = -1, y = 0... 2 * nTbH - 1 및 x = 0... 2 * nTbW - 1, y = -1).
이 프로세스의 출력은 예측된 샘플 predSamples[x][y](여기서 x = 0... nTbW - 1, y = 0... nTbH - 1)들이다.
현재 루마 위치(xTbY, yTbY)는 다음과 같이 유도된다:
(xTbY, yTbY) = (xTbC << (SubWidthC - 1), yTbC << (SubHeightC - 1))(351)
변수 availL, availT, 및 availTL들은 다음과 같이 유도된다:
- 6.4.4 절(clause)에 명시된 바와 같은 인접 블록 사용 가능성에 대한 유도 프로세스는, (xTbY, yTbY)로 설정된 현재 루마 위치(xCurr, yCurr), 이웃 루마 위치 (xTbY - 1, yTbY), FALSE로 설정된 checkPredModeY, 및 cIdx를 입력으로 하여 실행되어지고, 출력은 availL 로 할당된다.
- 6.4.4 절(clause)에 명시된 바와 같은 인접 블록 사용 가능성에 대한 유도 프로세스는, (xTbY, yTbY)로 설정된 현재 루마 위치(xCurr, yCurr), 이웃 루마 위치 (xTbY, yTbY - 1), FALSE로 설정된 checkPredModeY, 및 cIdx를 입력으로 하여 실행되어지고, 출력은 availT 로 할당된다.
- 변수 availTL은 다음과 같이 유도된다:
availTL = availL && availT (352)
- 사용 가능한 상-좌 이웃 크로마 샘플의 수 numTopRight는 다음과 같이 유도된다:
- 변수 numTopRight가 0과 같게 설정되고 availTR이 TRUE와 같게 설정된다.
- predModeIntra가 INTRA_T_CCLM이면, availTR이 FALSE이거나 x가 2 * nTbW - 1이 될 때까지 다음이 x = nTbW... 2 * nTbW - 1에 적용된다:
- 6.4.4 절(clause)에 명시된 바와 같은 인접 블록 사용 가능성에 대한 유도 프로세스는, (xTbY, yTbY)로 설정된 현재 루마 위치(xCurr, yCurr), 이웃 루마 위치 (xTbY + x, yTbY - 1), FALSE로 설정된 checkPredModeY, 및 cIdx를 입력으로 하여 실행되어지고, 출력은 availTR 로 할당된다.
- availTR이 TRUE이면, numTopRight가 1만큼 증분된다.
- 사용 가능한 좌-하 이웃 크로마 샘플들의 수 numLeftBelow는 다음과 같이 유도된다:
- 변수 numLeftBelow가 0과 같게 설정되고 availLB가 TRUE와 같게 설정된다.
- predModeIntra가 INTRA_L_CCLM이면, availLB가 FALSE이거나 y가 2 * nTbH - 1이 될 때까지 다음이 적용된다:
- 6.4.4 절(clause)에 명시된 바와 같은 인접 블록 사용 가능성에 대한 유도 프로세스는, (xTbY, yTbY)로 설정된 현재 루마 위치(xCurr, yCurr), 이웃 루마 위치 (xTbY - 1, yTbY + y), FALSE로 설정된 checkPredModeY, 및 cIdx를 입력으로 하여 실행되어지고, 출력은 availLB 로 할당된다.
- availLB가 TRUE이면, numLeftBelow가 1만큼 증분된다.
상측 및 상-우의 사용 가능한 이웃 크로마 샘플들의 수 numSampT와 자측 및 좌-하의 사용 가능한 이웃 크로마 샘플들의 수 numSampL들은 다음과 같이 유도된다:
- predModeIntra가 INTRA_LT_CCLM이면, 다음이 적용된다:
numSampT = availT ? nTbW : 0 (353)
numSampL = availL ? nTbH : 0 (354)
- 그렇지 않으면 다음이 적용된다:
numSampT = (availT && predModeIntra = = INTRA_T_CCLM) ?
(nTbW +Min(numTopRight, nTbH)) : 0 (355)
numSampL = (availL && predModeIntra = = INTRA_L_CCLM) ?
(nTbH + Min(numLeftBelow, nTbW)) : 0 (356)
변수 bCTUboundary는 다음과 같이 유도된다:
bCTUboundary = (yTbY & (CtbSizeY - 1) = = 0) ? TRUE : FALSE.(357)
N이 L 및 T로 치환된 cntN 및 행렬 pickPosN은 다음과 같이 유도된다:
- 변수 numIs4N은 다음과 같이 유도된다:
numIs4N = ((availT && availL && predModeIntra = =
INTRA_LT_CCLM) ? 0 : 1) (358)
- 변수 startPosN은 numSampN >> (2 + numIs4N)과 같게 설정된다.
- 변수 pickStepN는 Max(1, numSampN >> (1 + numIs4N))과 같게 설정된다.
- availN이 TRUE이고 predModeIntra가 INTRA_LT_CCLM 또는 INTRA_N_CCLM이면, 다음 할당들이 이뤄진다:
- cntN이 Min(numSampN, (1 + numIs4N) << 1)과 같게 설정된다.
- pickPosN[pos]가 (startPosN + pos * pickStepN)(여기서 pos = 0...  cntN - 1)와 같게 설정된다.
- 그렇지 않으면, cntN이 0과 같게 설정된다.
예측 샘플 predSamples[x][y](여기서 x = 0... nTbW - 1, y = 0... nTbH - 1)들은 다음과 같이 유도된다:
- numSampL 및 numSampT 양자 모두 0이면 다음이 적용된다:
predSamples[x][y] = 1 << (BitDepth - 1) (359)
- 그렇지 않으면 다음 순서의 단계들이 적용된다:
1. 동치 루마 샘플 pY[x][y](여기서 x = 0... nTbW * SubWidthC - 1, y = 0... nTbH * SubHeightC - 1)들이 위치(xTbY + x, yTbY + y)들에서의 디블록킹 필터 프로세스 이전의 재현 루마 샘플들과 같게 설정된다.
2. 이웃 루마 샘플 pY[x][y]들이 다음과 같이 유도된다:
- numSampL이 0보다 크면, 이웃 좌측 루마 샘플 pY[x][y](여기서 x = -1... -3, y = 0... SubHeightC * numSampL - 1)들이 위치(xTbY + x, yTbY + y)들에서의 디블록킹 필터 프로세스 이전의 재현 루마 샘플들과 같게 설정된다.
- availT가 FALSE이면, 이웃 상측 루마 샘플 pY[x][y](여기서 x = -1... SubWidthC * numSampT - 1, y = -1... -2)들이 루마 샘플 pY[x][0]들과 같게 설정된다.
- availL이 FALSE이면, 이웃 좌측 루마 샘플 pY[x][y](여기서 x = -1... -3, y = -1... SubHeightC * numSampL - 1)들이 루마 샘플 pY[0][y]들과 같게 설정된다.
- numSampT가 0보다 크면, 이웃 상측 루마 샘플 pY[x][y](여기서 x = 0... SubWidthC * numSampT - 1, y = -1, -[[2]] 3 )들이 위치(xTbY + x, yTbY + y)들에서의 디블록킹 필터 프로세스 이전의 재현 루마 샘플들과 같게 설정된다.
- availTL이 TRUE이면, 이웃 상-좌 루마 샘플 pY[x][y](여기서 x = - 1, y = -1, -2)들이 위치(xTbY + x, yTbY + y)들에서의 디블록킹 필터 프로세스 이전의 재현 루마 샘플들과 같게 설정된다.
3. 다운샘플링된 동치 루마 샘플 pDsY[x][y](여기서 x = 0... nTbW - 1, y = 0... nTbH - 1)들은 다음과 같이 유도된다:
- SubWidthC 및 SubHeightC 양자 모두 1이면, 다음이 적용된다:
- pDsY[x][y](여기서 x = 1... nTbW - 1, y = 1... nTbH - 1)는 다음과 같이 유도된다:
pDstY[x][y] = pY[x][y] (360)
- 그렇지 않으면 다음이 적용된다:
- 1차원 필터 계수 행렬 F1 및 F2와 차원 필터 계수 행렬 F3 및 F4 들은 다음과 같이 명시된다.
F1[0] = 2, F1[1] = 0 (361)
F2[0] = 1, F2[1] = 2, F2[2] = 1 (362)
F3[i][j] = F4[i][j] = 0,(여기서 i = 0... 2, j = 0... 2) (363)
- SubWidthC 및 SubHeightC 양자 모두 2이면, 다음이 적용된다:
F1[0] = 1, F1[1] = 1 (364)
F3[0][1] = 1, F3[1][1] = 4, F3[2][1] = 1, F3[1][0] = 1, F3[1][2] = 1 (365)
F4[0][1] = 1, F4[1][1] = 2, F4[2][1] = 1 (366)
F4[0][2] = 1, F4[1][2] = 2, F4[2][2] = 1 (367)
- 그렇지 않으면 다음이 적용된다:
F3[1][1] = 8 (368)
F4[0][1] = 2, F4[1][1] = 4, F4[2][1] = 2, (369)
- sps_chroma_vertical_collocated_flag이 1이면, 다음이 적용된다:
- pDsY[x][y](여기서 x = 0... nTbW - 1, y = 0... nTbH - 1)는 다음과 같이 유도된다:
- pDsY[x][y] = (F3[1][0] * pY[SubWidthC * x][ SubHeightC * y - 1] +
F3[0][1] * pY[SubWidthC * x - 1][SubHeightC * y] +
F3[1][1] * pY[SubWidthC * x][SubHeightC * y] +
F3[2][1] * pY[SubWidthC * x + 1][SubHeightC * y] +
F3[1][2] * pY[SubWidthC * x][SubHeightC * y + 1] + 4) >> 3 (370)
- 그렇지 않으면(sps_chroma_vertical_collocated_flag이 0이면), 다음이 적용된다:
- pDsY[x][y](여기서 x = 0... nTbW - 1, y = 0... nTbH - 1)는 다음과 같이 유도된다:
pDsY[x][y] = (F4[0][1] * pY[SubWidthC * x - 1][SubHeightC * y] +
F4[0][2] * pY[SubWidthC * x - 1][SubHeightC * y + 1] +
F4[1][1] * pY[SubWidthC * x][SubHeightC * y] +
F4[1][2] * pY[SubWidthC * x][SubHeightC * y + 1] +
F4[2][1] * pY[SubWidthC * x + 1][SubHeightC * y] +
F4[2][2] * pY[SubWidthC * x + 1][SubHeightC * y + 1] + 4) >> 3 (371)
4. numSampL이 0보다 크면, 선택된 이웃 좌측 크로마 샘플 pSelC[idx]들이 p[-1][pickPosL[idx]](여기서 idx = 0... cntL - 1)와 같게 설정되고, 선택된 다운샘플링된 이웃 좌측 루마 샘플 pSelDsY[idx](여기서 idx = 0... cntL - 1)들은 다음과 같이 유도된다:
- 변수 y가 pickPosL[idx]와 같게 설정된다.
- SubWidthC 및 SubHeightC 양자 모두 1이면, 다음이 적용된다:
pSelDsY[idx] = pY[-1][y] (372)
- 그렇지 않으면 다음이 적용된다:
- sps_chroma_vertical_collocated_flag이 1이면 다음이 적용된다:
pSelDsY[idx] = (F3[1][0] * pY[- SubWidthC][SubHeightC * y - 1] +
F3[0][1] * pY[-1 - SubWidthC][SubHeightC * y] +
F3[1][1] * pY[-SubWidthC][SubHeightC * y] +
F3[2][1] * pY[1 - SubWidthC][SubHeightC * y] +
F3[1][2] * pY[-SubWidthC][SubHeightC * y + 1] + 4) >> 3 (373)
- 그렇지 않으면(sps_chroma_vertical_collocated_flag이 0이면), 다음이 적용된다:
pSelDsY[idx] = (F4[0][1] * pY[-1 - SubWidthC][SubHeightC * y] +
F4[0][2] * pY[-1 - SubWidthC][SubHeightC * y + 1]  +
F4[1][1] * pY[-SubWidthC][SubHeightC * y] +
F4[1][2] * pY[-SubWidthC][SubHeightC * y + 1] +
F4[2][1] * pY[1 - SubWidthC][SubHeightC * y] +
F4[2][2] * pY[1 - SubWidthC][SubHeightC * y + 1] + 4) >> 3 (374)
5. numSampT가 0보다 크면, 선택된 이웃 상측 크로마 샘플 pSelC[idx]들이 p[pickPosT[idx - cntL]][-1](여기서 idx = cntL... cntL + cntT - 1)와 같게 설정되고 다운샘플링된 이웃 상측 루마 샘플 pSelDsY[idx](여기서 idx = 0... cntL + cntT - 1)들은 다음과 같이 명시된다:
- 변수 x는 pickPosT[idx - cntL]와 같게 설정된다.
- SubWidthC 및 SubHeightC 양자 모두 1이면, 다음이 적용된다:
pSelDsY[idx] = pY[x][-1] (375)
- 그렇지 않으면 다음이 적용된다:
- sps_chroma_vertical_collocated_flag이 1이면. 다음이 적용된다:
- bCTUboundary가 FALSE이면 다음이 적용된다:
pSelDsY[idx] = (F3[1][0] * pY[SubWidthC * x][-1 - SubHeightC] +
F3[0][1] * pY[SubWidthC * x - 1][-SubHeightC] +
F3[1][1] * pY[SubWidthC * x][-SubHeightC] +
F3[2][1] * pY[SubWidthC * x + 1][-SubHeightC] +
F3[1][2] * pY[SubWidthC * x][1 - SubHeightC] + 4) >> 3 (376)
- 그렇지 않으면(bCTUboundary가 TRUE이면), 다음이 적용된다:
pSelDsY[idx] = (F2[0] * pY[SubWidthC * x - 1][-1] +
F2[1] * pY[SubWidthC * x][-1] +
F2[2] * pY[SubWidthC * x + 1][-1] + 2) >> 2 (377)
- 그렇지 않으면(sps_chroma_vertical_collocated_flag이 0이면) 다음이 적용된다:
- bCTUboundary 가 FALSE이면 다음이 적용된다:
pSelDsY[idx] = (F4[0][1] * pY[SubWidthC * x - 1][-1] +
F4[0][2] * pY[SubWidthC * x - 1][-2] +
F4[1][1] * pY[SubWidthC * x][-1] +
F4[1][2] * pY[SubWidthC * x][-2] +
F4[2][1] * pY[SubWidthC * x + 1][-1] +
F4[2][2] * pY[SubWidthC * x + 1][-2] + 4) >> 3 (378)
- 그렇지 않으면(bCTUboundary가 TRUE이면), 다음이 적용된다:
pSelDsY[idx] = (F2[0] * pY[SubWidthC * x - 1][-1] +
F2[1] * pY[SubWidthC * x][-1] +
F2[2] * pY[SubWidthC * x + 1][-1] + 2) >> 2 (379)
6. cntT + cntL이 0이 아니면, 변수 minY, maxY, minC 및 maxC들은 다음과 같이 유도된다:
- cntT + cntLd; 2이면, pSelComp[3]이 pSelComp[0]와 같게 설정되고, pSelComp[2]가 pSelComp[1]와 같게 설정되며, pSelComp[0]이 pSelComp[1]와 같게 설정되고, 그리고 pSelComp[1]이 pSelComp[3]과 같게 설정되며, Comp가 DsY 및 C로 치환된다.
- 행렬 minGrpIdx 및 maxGrpIdx는 다음과 같이 유도된다:
minGrpIdx[0] = 0 (380)
minGrpIdx[1] = 2 (381)
maxGrpIdx[0] = 1 (382)
maxGrpIdx[1] = 3 (383)
- pSelDsY[minGrpIdx[0]]이 pSelDsY[minGrpIdx[1]]보다 크면, minGrpIdx[0]와 minGrpIdx[1]이 다음과 같이 스왑된다(swapped):
(minGrpIdx[0], minGrpIdx[1]) = Swap(minGrpIdx[0], minGrpIdx[1]) (384)
- pSelDsY[maxGrpIdx[0]]이 pSelDsY[maxGrpIdx[1]]보다 크면, maxGrpIdx[0]와 maxGrpIdx[1]이 다음과 같이 스왑된다:
(maxGrpIdx[0], maxGrpIdx[1]) = Swap(maxGrpIdx[0], maxGrpIdx[1]) (385)
- pSelDsY[minGrpIdx[0]]이 pSelDsY[maxGrpIdx[1]]보다 크면, 행렬 minGrpIdx와 maxGrpIdx가 다음과 같이 스왑된다:
(minGrpIdx, maxGrpIdx) = Swap(minGrpIdx, maxGrpIdx) (386)
- pSelDsY[minGrpIdx[1]]이 pSelDsY[maxGrpIdx[0]]보다 크면, minGrpIdx[1]와 maxGrpIdx[0]이 다음과 같이 스왑된다:
(minGrpIdx[1], maxGrpIdx[0]) = Swap(minGrpIdx[1], maxGrpIdx[0]) (387)
- 변수 maxY, maxC, minY 및 minC가 다음과 같이 유도된다:
maxY = (pSelDsY[maxGrpIdx[0]] + pSelDsY[maxGrpIdx[1]] + 1) >> 1 (388)
maxC =(pSelC[maxGrpIdx[0]] + pSelC[maxGrpIdx[1]] + 1) >> 1 (389)
minY = (pSelDsY[minGrpIdx[0]] + pSelDsY[minGrpIdx[1]] + 1) >> 1 (390)
minC = (pSelC[minGrpIdx[0]] + pSelC[minGrpIdx[1]] + 1) >> 1 (391)
7. 변수 a, b,및 k는 다음과 같이 유도된다:
- numSampL이 0이고 numSampT가 0이면 다음이 적용된다:
k = 0 (392)
a = 0 (393)
b = 1 << (BitDepth - 1) (394)
- 그렇지 않으면 다음이 적용된다:
diff = maxY - minY (395)
- diff가 0이 아니면 다음이 적용된다:
diffC = maxC - minC (396)
x = Floor(Log2(diff)) (397)
normDiff = ((diff << 4) >> x) & 15 (398)
x += (normDiff != 0) ? 1 : 0 (399)
y = Abs(diffC) > 0 ? Floor(Log2(Abs(diffC))) + 1 : 0 (400)
a = (diffC * (divSigTable[normDiff] | 8) + 2y-1) >> y (401)
k = ((3 + x - y) < 1) 1 : 3 + x - y (402)
a = ((3 + x - y) < 1) ? Sign(a) * 15 : a (403)
b = minC - ((a * minY) >> k) (404)
여기서 divSigTable[ ]은 다음과 같이 명시된다:
divSigTable[ ] = { 0, 7, 6, 5, 5, 4, 4, 3, 3, 2, 2, 1, 1, 1, 1, 0 } (405)
- 그렇지 않으면(diff가 0이면), 다음이 적용된다:
k = 0 (406)
a = 0 (407)
b = minC (408)
8. 예측 샘플 predSamples[x][y](여기서 x = 0... nTbW - 1, y = 0... nTbH - 1)들은 다음과 같이 유도된다:
predSamples[x][y] = Clip1(((pDsY[x][y] * a) >> k) + b) (409)
참고(NOTE) - 이 프로세스는 sps_chroma_vertical_collocated_flag을 사용한다. 그러나 구현을 간단히 하기 위해 sps_chroma_horizontal_collocated_flag은 사용하지 않는다.
5.7. 실시예 7(Embodiment 7)
JVET-Q2001-vE 에 명시된 작업 초안이 아래와 같이 변경될 수 있다.
8.4.5.2.13
이 프로세스에 대한 입력들은:
- 인트라 예측 모드 predModeIntra,
- 현재 픽처의 상-좌 샘플에 대한 현재 변환 블록의 상-좌 샘플의 샘플 위치(xTbC, yTbC),
- 변환 블록 폭을 명시하는 변수 nTbW,
- 변환 블록 높이를 명시하는 변수 nTbH,
- 현재 블록의 색 성분을 명시하는 변수 cIdx,
- 크로마 이웃 샘플들 p[x][y](여기서 x = -1, y = 0... 2 * nTbH - 1 및 x = 0... 2 * nTbW - 1, y = -1).
이 프로세스의 출력은 예측된 샘플 predSamples[x][y](여기서 x = 0... nTbW - 1, y = 0... nTbH - 1)들이다.
현재 루마 위치(xTbY, yTbY)는 다음과 같이 유도된다:
(xTbY, yTbY) = (xTbC << (SubWidthC - 1), yTbC << (SubHeightC - 1))(351)
변수 availL, availT, 및 availTL들은 다음과 같이 유도된다:
- 6.4.4 절(clause)에 명시된 바와 같은 인접 블록 사용 가능성에 대한 유도 프로세스는, (xTbY, yTbY)로 설정된 현재 루마 위치(xCurr, yCurr), 이웃 루마 위치 (xTbY - 1, yTbY), FALSE로 설정된 checkPredModeY, 및 cIdx를 입력으로 하여 실행되어지고, 출력은 availL 로 할당된다.
- 6.4.4 절(clause)에 명시된 바와 같은 인접 블록 사용 가능성에 대한 유도 프로세스는, (xTbY, yTbY)로 설정된 현재 루마 위치(xCurr, yCurr), 이웃 루마 위치 (xTbY, yTbY - 1), FALSE로 설정된 checkPredModeY, 및 cIdx를 입력으로 하여 실행되어지고, 출력은 availT 로 할당된다.
- 변수 availTL은 다음과 같이 유도된다:
availTL = availL && availT (352)
- 사용 가능한 상-좌 이웃 크로마 샘플의 수 numTopRight는 다음과 같이 유도된다:
- 변수 numTopRight가 0과 같게 설정되고 availTR이 TRUE와 같게 설정된다.
- predModeIntra가 INTRA_T_CCLM이면, availTR이 FALSE이거나 x가 2 * nTbW - 1이 될 때까지 다음이 x = nTbW... 2 * nTbW - 1에 적용된다:
- 6.4.4 절(clause)에 명시된 바와 같은 인접 블록 사용 가능성에 대한 유도 프로세스는, (xTbY, yTbY)로 설정된 현재 루마 위치(xCurr, yCurr), 이웃 루마 위치 (xTbY + x, yTbY - 1), FALSE로 설정된 checkPredModeY, 및 cIdx를 입력으로 하여 실행되어지고, 출력은 availTR 로 할당된다.
- availTR이 TRUE이면, numTopRight가 1만큼 증분된다.
- 사용 가능한 좌-하 이웃 크로마 샘플들의 수 numLeftBelow는 다음과 같이 유도된다:
- 변수 numLeftBelow가 0과 같게 설정되고 availLB가 TRUE와 같게 설정된다.
- predModeIntra가 INTRA_L_CCLM이면, availLB가 FALSE이거나 y가 2 * nTbH - 1이 될 때까지 다음이 적용된다:
- 6.4.4 절(clause)에 명시된 바와 같은 인접 블록 사용 가능성에 대한 유도 프로세스는, (xTbY, yTbY)로 설정된 현재 루마 위치(xCurr, yCurr), 이웃 루마 위치 (xTbY - 1, yTbY + y), FALSE로 설정된 checkPredModeY, 및 cIdx를 입력으로 하여 실행되어지고, 출력은 availLB 로 할당된다.
- availLB가 TRUE이면, numLeftBelow가 1만큼 증분된다.
상측 및 상-우의 사용 가능한 이웃 크로마 샘플들의 수 numSampT와 자측 및 좌-하의 사용 가능한 이웃 크로마 샘플들의 수 numSampL들은 다음과 같이 유도된다:
- predModeIntra가 INTRA_LT_CCLM이면, 다음이 적용된다:
numSampT = availT ? nTbW : 0 (353)
numSampL = availL ? nTbH : 0 (354)
- 그렇지 않으면 다음이 적용된다:
numSampT = (availT && predModeIntra = = INTRA_T_CCLM) ?
(nTbW +Min(numTopRight, nTbH)) : 0 (355)
numSampL = (availL && predModeIntra = = INTRA_L_CCLM) ?
(nTbH + Min(numLeftBelow, nTbW)) : 0 (356)
변수 bCTUboundary는 다음과 같이 유도된다:
bCTUboundary = (yTbY & (CtbSizeY - 1) = = 0) ? TRUE : FALSE.(357)
N이 L 및 T로 치환된 cntN 및 행렬 pickPosN은 다음과 같이 유도된다:
- 변수 numIs4N은 다음과 같이 유도된다:
numIs4N = ((availT && availL && predModeIntra = =
INTRA_LT_CCLM) ? 0 : 1) (358)
- 변수 startPosN은 numSampN >> (2 + numIs4N)과 같게 설정된다.
- 변수 pickStepN는 Max(1, numSampN >> (1 + numIs4N))과 같게 설정된다.
- availN이 TRUE이고 predModeIntra가 INTRA_LT_CCLM 또는 INTRA_N_CCLM이면, 다음 할당들이 이뤄진다:
- cntN이 Min(numSampN, (1 + numIs4N) << 1)과 같게 설정된다.
- pickPosN[pos]가 (startPosN + pos * pickStepN)(여기서 pos = 0...  cntN - 1)와 같게 설정된다.
- 그렇지 않으면, cntN이 0과 같게 설정된다.
예측 샘플 predSamples[x][y](여기서 x = 0... nTbW - 1, y = 0... nTbH - 1)들은 다음과 같이 유도된다:
- numSampL 및 numSampT 양자 모두 0이면 다음이 적용된다:
predSamples[x][y] = 1 << (BitDepth - 1) (359)
- 그렇지 않으면 다음 순서의 단계들이 적용된다:
1. 동치 루마 샘플 pY[x][y](여기서 x = 0... nTbW * SubWidthC - 1, y = 0... nTbH * SubHeightC - 1)들이 위치(xTbY + x, yTbY + y)들에서의 디블록킹 필터 프로세스 이전의 재현 루마 샘플들과 같게 설정된다.
2. 이웃 루마 샘플 pY[x][y]들이 다음과 같이 유도된다:
- numSampL이 0보다 크면, 이웃 좌측 루마 샘플 pY[x][y](여기서 x = -1... -3, y = 0... SubHeightC * numSampL - 1)들이 위치(xTbY + x, yTbY + y)들에서의 디블록킹 필터 프로세스 이전의 재현 루마 샘플들과 같게 설정된다.
- availT가 FALSE이면, 이웃 상측 루마 샘플 pY[x][y](여기서 x = -1... SubWidthC * numSampT - 1, y = -1... [[-2]] - (2+ sps_chroma_vertical_collocated_flag) )들이 루마 샘플 pY[x][0]들과 같게 설정된다.
- availL이 FALSE이면, 이웃 좌측 루마 샘플 pY[x][y](여기서 x = -1... -3, y = -1... SubHeightC * numSampL - 1)들이 루마 샘플 pY[0][y]들과 같게 설정된다.
- numSampT가 0보다 크면, 이웃 상측 루마 샘플 pY[x][y](여기서 x = 0... SubWidthC * numSampT - 1, y = -1... - (2+ sps_chroma_vertical_collocated_flag) [[-2]])들이 위치(xTbY + x, yTbY + y)들에서의 디블록킹 필터 프로세스 이전의 재현 루마 샘플들과 같게 설정된다.
- availTL이 TRUE이면, 이웃 상-좌 루마 샘플 pY[x][y](여기서 x = - 1, y = -1, -2)들이 위치(xTbY + x, yTbY + y)들에서의 디블록킹 필터 프로세스 이전의 재현 루마 샘플들과 같게 설정된다.
3. 다운샘플링된 동치 루마 샘플 pDsY[x][y](여기서 x = 0... nTbW - 1, y = 0... nTbH - 1)들은 다음과 같이 유도된다:
- SubWidthC 및 SubHeightC 양자 모두 1이면, 다음이 적용된다:
- pDsY[x][y](여기서 x = 1... nTbW - 1, y = 1... nTbH - 1)는 다음과 같이 유도된다:
pDstY[x][y] = pY[x][y] (360)
- 그렇지 않으면 다음이 적용된다:
- 1차원 필터 계수 행렬 F1 및 F2와 차원 필터 계수 행렬 F3 및 F4 들은 다음과 같이 명시된다.
F1[0] = 2, F1[1] = 0 (361)
F2[0] = 1, F2[1] = 2, F2[2] = 1 (362)
F3[i][j] = F4[i][j] = 0,(여기서 i = 0... 2, j = 0... 2) (363)
- SubWidthC 및 SubHeightC 양자 모두 2이면, 다음이 적용된다:
F1[0] = 1, F1[1] = 1 (364)
F3[0][1] = 1, F3[1][1] = 4, F3[2][1] = 1, F3[1][0] = 1, F3[1][2] = 1 (365)
F4[0][1] = 1, F4[1][1] = 2, F4[2][1] = 1 (366)
F4[0][2] = 1, F4[1][2] = 2, F4[2][2] = 1 (367)
- 그렇지 않으면 다음이 적용된다:
F3[1][1] = 8 (368)
F4[0][1] = 2, F4[1][1] = 4, F4[2][1] = 2, (369)
- sps_chroma_vertical_collocated_flag이 1이면, 다음이 적용된다:
- pDsY[x][y](여기서 x = 0... nTbW - 1, y = 0... nTbH - 1)는 다음과 같이 유도된다:
- pDsY[x][y] = (F3[1][0] * pY[SubWidthC * x][ SubHeightC * y - 1] +
F3[0][1] * pY[SubWidthC * x - 1][SubHeightC * y] +
F3[1][1] * pY[SubWidthC * x][SubHeightC * y] +
F3[2][1] * pY[SubWidthC * x + 1][SubHeightC * y] +
F3[1][2] * pY[SubWidthC * x][SubHeightC * y + 1] + 4) >> 3 (370)
- 그렇지 않으면(sps_chroma_vertical_collocated_flag이 0이면), 다음이 적용된다:
- pDsY[x][y](여기서 x = 0... nTbW - 1, y = 0... nTbH - 1)는 다음과 같이 유도된다:
pDsY[x][y] = (F4[0][1] * pY[SubWidthC * x - 1][SubHeightC * y] +
F4[0][2] * pY[SubWidthC * x - 1][SubHeightC * y + 1] +
F4[1][1] * pY[SubWidthC * x][SubHeightC * y] +
F4[1][2] * pY[SubWidthC * x][SubHeightC * y + 1] +
F4[2][1] * pY[SubWidthC * x + 1][SubHeightC * y] +
F4[2][2] * pY[SubWidthC * x + 1][SubHeightC * y + 1] + 4) >> 3 (371)
4. numSampL이 0보다 크면, 선택된 이웃 좌측 크로마 샘플 pSelC[idx]들이 p[-1][pickPosL[idx]](여기서 idx = 0... cntL - 1)와 같게 설정되고, 선택된 다운샘플링된 이웃 좌측 루마 샘플 pSelDsY[idx](여기서 idx = 0... cntL - 1)들은 다음과 같이 유도된다:
- 변수 y가 pickPosL[idx]와 같게 설정된다.
- SubWidthC 및 SubHeightC 양자 모두 1이면, 다음이 적용된다:
pSelDsY[idx] = pY[-1][y] (372)
- 그렇지 않으면 다음이 적용된다:
- sps_chroma_vertical_collocated_flag이 1이면 다음이 적용된다:
pSelDsY[idx] = (F3[1][0] * pY[- SubWidthC][SubHeightC * y - 1] +
F3[0][1] * pY[-1 - SubWidthC][SubHeightC * y] +
F3[1][1] * pY[-SubWidthC][SubHeightC * y] +
F3[2][1] * pY[1 - SubWidthC][SubHeightC * y] +
F3[1][2] * pY[-SubWidthC][SubHeightC * y + 1] + 4) >> 3 (373)
- 그렇지 않으면(sps_chroma_vertical_collocated_flag이 0이면), 다음이 적용된다:
pSelDsY[idx] = (F4[0][1] * pY[-1 - SubWidthC][SubHeightC * y] +
F4[0][2] * pY[-1 - SubWidthC][SubHeightC * y + 1]  +
F4[1][1] * pY[-SubWidthC][SubHeightC * y] +
F4[1][2] * pY[-SubWidthC][SubHeightC * y + 1] +
F4[2][1] * pY[1 - SubWidthC][SubHeightC * y] +
F4[2][2] * pY[1 - SubWidthC][SubHeightC * y + 1] + 4) >> 3 (374)
5. numSampT가 0보다 크면, 선택된 이웃 상측 크로마 샘플 pSelC[idx]들이 p[pickPosT[idx - cntL]][-1](여기서 idx = cntL... cntL + cntT - 1)와 같게 설정되고 다운샘플링된 이웃 상측 루마 샘플 pSelDsY[idx](여기서 idx = 0... cntL + cntT - 1)들은 다음과 같이 명시된다:
- 변수 x는 pickPosT[idx - cntL]와 같게 설정된다.
- SubWidthC 및 SubHeightC 양자 모두 1이면, 다음이 적용된다:
pSelDsY[idx] = pY[x][-1] (375)
- 그렇지 않으면 다음이 적용된다:
- sps_chroma_vertical_collocated_flag이 1이면. 다음이 적용된다:
- bCTUboundary가 FALSE이면 다음이 적용된다:
pSelDsY[idx] = (F3[1][0] * pY[SubWidthC * x][-1 - SubHeightC] +
F3[0][1] * pY[SubWidthC * x - 1][-SubHeightC] +
F3[1][1] * pY[SubWidthC * x][-SubHeightC] +
F3[2][1] * pY[SubWidthC * x + 1][-SubHeightC] +
F3[1][2] * pY[SubWidthC * x][1 - SubHeightC] + 4) >> 3 (376)
- 그렇지 않으면(bCTUboundary가 TRUE이면), 다음이 적용된다:
pSelDsY[idx] = (F2[0] * pY[SubWidthC * x - 1][-1] +
F2[1] * pY[SubWidthC * x][-1] +
F2[2] * pY[SubWidthC * x + 1][-1] + 2) >> 2 (377)
- 그렇지 않으면(sps_chroma_vertical_collocated_flag이 0이면) 다음이 적용된다:
- bCTUboundary 가 FALSE이면 다음이 적용된다:
pSelDsY[idx] = (F4[0][1] * pY[SubWidthC * x - 1][-1] +
F4[0][2] * pY[SubWidthC * x - 1][-2] +
F4[1][1] * pY[SubWidthC * x][-1] +
F4[1][2] * pY[SubWidthC * x][-2] +
F4[2][1] * pY[SubWidthC * x + 1][-1] +
F4[2][2] * pY[SubWidthC * x + 1][-2] + 4) >> 3 (378)
- 그렇지 않으면(bCTUboundary가 TRUE이면), 다음이 적용된다:
pSelDsY[idx] = (F2[0] * pY[SubWidthC * x - 1][-1] +
F2[1] * pY[SubWidthC * x][-1] +
F2[2] * pY[SubWidthC * x + 1][-1] + 2) >> 2 (379)
6. cntT + cntL이 0이 아니면, 변수 minY, maxY, minC 및 maxC들은 다음과 같이 유도된다:
- cntT + cntLd; 2이면, pSelComp[3]이 pSelComp[0]와 같게 설정되고, pSelComp[2]가 pSelComp[1]와 같게 설정되며, pSelComp[0]이 pSelComp[1]와 같게 설정되고, 그리고 pSelComp[1]이 pSelComp[3]과 같게 설정되며, Comp가 DsY 및 C로 치환된다.
- 행렬 minGrpIdx 및 maxGrpIdx는 다음과 같이 유도된다:
minGrpIdx[0] = 0 (380)
minGrpIdx[1] = 2 (381)
maxGrpIdx[0] = 1 (382)
maxGrpIdx[1] = 3 (383)
- pSelDsY[minGrpIdx[0]]이 pSelDsY[minGrpIdx[1]]보다 크면, minGrpIdx[0]와 minGrpIdx[1]이 다음과 같이 스왑된다(swapped):
(minGrpIdx[0], minGrpIdx[1]) = Swap(minGrpIdx[0], minGrpIdx[1]) (384)
- pSelDsY[maxGrpIdx[0]]이 pSelDsY[maxGrpIdx[1]]보다 크면, maxGrpIdx[0]와 maxGrpIdx[1]이 다음과 같이 스왑된다:
(maxGrpIdx[0], maxGrpIdx[1]) = Swap(maxGrpIdx[0], maxGrpIdx[1]) (385)
- pSelDsY[minGrpIdx[0]]이 pSelDsY[maxGrpIdx[1]]보다 크면, 행렬 minGrpIdx와 maxGrpIdx가 다음과 같이 스왑된다:
(minGrpIdx, maxGrpIdx) = Swap(minGrpIdx, maxGrpIdx) (386)
- pSelDsY[minGrpIdx[1]]이 pSelDsY[maxGrpIdx[0]]보다 크면, minGrpIdx[1]와 maxGrpIdx[0]이 다음과 같이 스왑된다:
(minGrpIdx[1], maxGrpIdx[0]) = Swap(minGrpIdx[1], maxGrpIdx[0]) (387)
- 변수 maxY, maxC, minY 및 minC가 다음과 같이 유도된다:
maxY = (pSelDsY[maxGrpIdx[0]] + pSelDsY[maxGrpIdx[1]] + 1) >> 1 (388)
maxC =(pSelC[maxGrpIdx[0]] + pSelC[maxGrpIdx[1]] + 1) >> 1 (389)
minY = (pSelDsY[minGrpIdx[0]] + pSelDsY[minGrpIdx[1]] + 1) >> 1 (390)
minC = (pSelC[minGrpIdx[0]] + pSelC[minGrpIdx[1]] + 1) >> 1 (391)
7. 변수 a, b,및 k는 다음과 같이 유도된다:
- numSampL이 0이고 numSampT가 0이면 다음이 적용된다:
k = 0 (392)
a = 0 (393)
b = 1 << (BitDepth - 1) (394)
- 그렇지 않으면 다음이 적용된다:
diff = maxY - minY (395)
- diff가 0이 아니면 다음이 적용된다:
diffC = maxC - minC (396)
x = Floor(Log2(diff)) (397)
normDiff = ((diff << 4) >> x) & 15 (398)
x += (normDiff != 0) ? 1 : 0 (399)
y = Abs(diffC) > 0 ? Floor(Log2(Abs(diffC))) + 1 : 0 (400)
a = (diffC * (divSigTable[normDiff] | 8) + 2y-1) >> y (401)
k = ((3 + x - y) < 1) 1 : 3 + x - y (402)
a = ((3 + x - y) < 1) ? Sign(a) * 15 : a (403)
b = minC - ((a * minY) >> k) (404)
여기서 divSigTable[ ]은 다음과 같이 명시된다:
divSigTable[ ] = { 0, 7, 6, 5, 5, 4, 4, 3, 3, 2, 2, 1, 1, 1, 1, 0 } (405)
- 그렇지 않으면(diff가 0이면), 다음이 적용된다:
k = 0 (406)
a = 0 (407)
b = minC (408)
8. 예측 샘플 predSamples[x][y](여기서 x = 0... nTbW - 1, y = 0... nTbH - 1)들은 다음과 같이 유도된다:
predSamples[x][y] = Clip1(((pDsY[x][y] * a) >> k) + b) (409)
참고(NOTE) - 이 프로세스는 sps_chroma_vertical_collocated_flag을 사용한다. 그러나 구현을 간단히 하기 위해 sps_chroma_horizontal_collocated_flag은 사용하지 않는다.
5.8. 실시예 8(Embodiment 8)
JVET-Q2001-vE에 명시된 작업 초안은 다음과 같이 변경될 수 있다.
8.4.5.2.13
이 프로세스에 대한 입력들은:
- 인트라 예측 모드 predModeIntra,
- 현재 픽처의 상-좌 샘플에 대한 현재 변환 블록의 상좌 샘플의 샘플 위치(xTbC, yTbC),
- 변환 블록 폭을 명시하는 변수 nTbW,
- 변환 블록 높이를 명시하는 변수 nTbH,
- 현재 블록의 색상 성분을 명시하는 변수 cIdx,
- 크로마 이웃 샘플들 p[x][y], 여기서 x = -1, y = 0... 2 * nTbH - 1 및 x = 0... 2 * nTbW - 1, y = -1.
이 프로세스의 출력은 예측된 샘플들 predSamples[x][y]인데, 여기서 x = 0... nTbW - 1, y = 0... nTbH - 1.
현재 루마 위치(xTbY, yTbY)는 다음과 같이 유도된다:
(xTbY, yTbY) = (xTbC<<(SubWidthC - 1), yTbC << (SubHeightC - 1)) (351)
변수 availL, availT, 및 availTL들은 다음과 같이 유도된다:
- 6.4.4 절(clause)에 명시된 바와 같은 인접 블록 사용 가능성에 대한 유도 프로세스는, (xTbY, yTbY)로 설정된 현재 루마 위치(xCurr, yCurr), 이웃 루마 위치 (xTbY - 1, yTbY), FALSE로 설정된 checkPredModeY, 및 cIdx를 입력으로 하여 실행되어지고, 출력은 availL 로 할당된다.
- 6.4.4 절(clause)에 명시된 바와 같은 인접 블록 사용 가능성에 대한 유도 프로세스는, (xTbY, yTbY)로 설정된 현재 루마 위치(xCurr, yCurr), 이웃 루마 위치 (xTbY, yTbY - 1), FALSE로 설정된 checkPredModeY, 및 cIdx를 입력으로 하여 실행되어지고, 출력은 availT 로 할당된다.
- 6.4.4 절(clause)에 명시된 바와 같은 인접 블록 사용 가능성에 대한 유도 프로세스는, (xTbY, yTbY)로 설정된 현재 루마 위치(xCurr, yCurr), 이웃 루마 위치 (xTbY - 1, yTbY - 1), FALSE로 설정된 checkPredModeY, 및 cIdx를 입력으로 하여 실행되어지고, 출력은 availTL 로 할당된다.
[[ - 변수 availTL은 다음과 같이 유도된다:
availTL = availL && availT (352) ]]
- 사용 가능한 상-우 이웃 크로마 샘플들의 수는 다음과 같이 유도된다:
- 변수 numTopRight가 0과 같게 설정되고 availTR이 TRUE와 같게 설정된다.
- predModeIntra가 INTRA_T_CCLM와 같을 때, availTR이 FALSE이거나 x가 2 * nTbW - 1이 될 때까지 다음이 x = nTbW... 2 * nTbW - 1에 적용된다:
- 6.4.4 절(clause)에 명시된 바와 같은 인접 블록 사용 가능성에 대한 유도 프로세스는, (xTbY, yTbY)로 설정된 현재 루마 위치(xCurr, yCurr), 이웃 루마 위치 (xTbY + x, yTbY - 1), FALSE로 설정된 checkPredModeY, 및 cIdx를 입력으로 하여 실행되어지고, 출력은 availTR 로 할당된다.
- availTR이 TRUE일 때, numTopRight가 1만큼 증분된다.
- 사용 가능한 좌-하(left-below) 이웃 크로마 샘플들의 수 numLeftBelow는 다음과 같이 유도된다:
- 변수 numLeftBelow가 0과 같게 설정되고 availLB가 TRUE와 같게 설정된다.
- predModeIntra가 INTRA_L_CCLM일 때, availLB가 FALSE이거나 y가 2 * nTbH - 1이 될 때까지 ekdmaa이 y = nTbH... 2 * nTbH - 1에 적용되고:
- 6.4.4 절(clause)에 명시된 바와 같은 인접 블록 사용 가능성에 대한 유도 프로세스는, (xTbY, yTbY)로 설정된 현재 루마 위치(xCurr, yCurr), 이웃 루마 위치 (xTbY - 1, yTbY + y), FALSE로 설정된 checkPredModeY, 및 cIdx를 입력으로 하여 실행되어지고, 출력은 availLB 로 할당된다.
- availLB가 TRUE일 때, numLeftBelow가 1만큼 증분된다.
상측 및 상-우측 상의 사용 가능한 이웃 크로마 샘플들의 수 numSampT와 좌측 및 좌-하측 상의 사용 가능한 이웃 크로마 샘플들의 수 numSampL은 다음과 같이 유도된다:
- predModeIntra가 INTRA_LT_CCLM이면, 다음이 적용된다:
numSampT = availT ? nTbW : 0 (353)
numSampL = availL ? nTbH : 0 (354)
- 그렇지 않으면 다음이 적용된다:
numSampT = (availT && predModeIntra = = INTRA_T_CCLM) ? (nTbW + Min(numTopRight, nTbH)) : 0 (355)
numSampL = (availL && predModeIntra = = INTRA_L_CCLM) ? (nTbH + Min(numLeftBelow, nTbW)) : 0 (356)
변수 bCTUboundary는 다음과 같이 유도된다:
bCTUboundary = (yTbY & (CtbSizeY - 1) = = 0) ? TRUE : FALSE (357)
변수 cntN와 N이 L 및 T로 치환된 행렬(array) pickPosN은 다음과 같이 유도되는데 :
- 변수 numIs4N은 다음과 같이 유도된다:
numIs4N = ((availT && availL && predModeIntra = = INTRA_LT_CCLM) ? 0 : 1) (358)
- 변수 startPosN이 numSampN >> (2 + numIs4N)과 같게 설정된다.
- 변수 pickStepN 이 Max(1, numSampN >> (1 + numIs4N))과 같게 설정된다.
- availN이 TRUE이고 predModeIntra가 INTRA_LT_CCLM 또는 INTRA_N_CCLM이면, 다음 할당이 이뤄지는데:
- cntN이 Min(numSampN, (1 + numIs4N) << 1)와 같게 설정된다.
- pickPosN[pos]가 (startPosN = pos * pickStepN)와 같게 설정되는데, 여기서 pos = 0... cntN - 1.
- 그렇지 않으면 cntN이 0과 같게 설정된다.
예측 샘플 predSamples[x][y](여기서 x= 0... nTbW - 1, y = 0.. nTbH - 1)들은 다음과 같이 유도된다:
- numSampL 및 numSampT 모두 0이면 다음이 적용된다:
predSamples[x][y] = 1 << (BitDepth - 1) (359)
- 그렇지 않으면 다음 순서의 단계들이 적용된다:
1. 동치(collocated) 루마 샘플 pY[x][y](여기서 x = 0... nTbW * SubWidthC - 1, y = 0... nTbH * SubHeightC - 1)들은 위치(xTbY + x, yTbY + y)들에서의 디블록킹 필터 처리에 앞서 재현된 루마 샘플들과 같게 설정된다.
2. 이웃 루마 샘플 pY[x][y]들은 다음과 같이 유도된다:
- numSampL이 0보다 크면, 이웃 좌측 루마 샘플 pY[x][y](여기서 x = -1... -3, y = 0... SubHeightC*numSampL - 1)들은 위치(xTbY + x, yTbY +y)들에서의 디블록킹 필터 처리 전에 재현 루마 샘플들과 같게 설정된다.
- availT가 FALSE이면, 이웃 상측 루마 샘플 pY[x][y](여기서 x = -1... SubWidthC * numSampT - 1, y = -1... -2)들은 루마 샘플 pY[x][0]들과 같게 설정된다.
- availL이 FALSE이면, 이웃 좌측 루마 샘플 pY[x][y](여기서 x = -1... -3, y = -1... SubHeightC * numSampL - 1)들은 루마 샘플 pY[0][y]들과 같게 설정된다.
- numSampT가 0보다 크면, 이웃 상측 루마 샘플 pY[x][y](여기서 x = 0... SubWidthC * numSampT - 1, y = -1, -2)들은 위치(xTbY + x, yTbY + y)에서의 디블록킹 필터 처리 전에 재현 루마 샘플들과 같게 설정된다.
- [[When]] If availTL이 TRUE이면, 이웃 상-좌 루마 샘플 pY[x][y](여기서 x = -1, y = -1, -2)들은 위치(xTbY + x, yTbY + y)에서의 디블록킹 필터 처리 전에 재현 루마 샘플들과 같게 설정된다.
- 그렇지 않고 availT가 true이면, 이웃 상-좌 루마 샘플 pY[x][y](여기서 x = -1, -2, y = -1, -2)들은 루마 샘플 pY[0][y]들과 같게 설정된다.
- 그렇지 않고 availL이 true이면, 이웃 상-좌 루마 샘플 pY[x][y](여기서 x = -1, -2, y = -1, -2)들은 루마 샘플 pY[x][0]와 같게 설정된다.
-
3. 다운샘플링된 동치 루마 샘플 pDsY[x][y](여기서 x = 0... nTbW - 1, y = 0... nTbH - 1)들은 다음과 같이 유도된다:
- SubWidthC 및 SubHeightC 양자 모두 1이면, 다음이 적용된다:
- pDsY[x][y](여기서 x = 1... nTbW - 1, y = 1... nTbH - 1)는 다음과 같이 유도된다:
pDstY[x][y] = pY[x][y] (360)
- 그렇지 않으면 다음이 적용된다:
- 1차원 필터계수 행렬 F1 및 F2와 2차원 필터 계수 행렬 F3 및 F4는 다음과 같이 명시된다:
F1[0] = 2, F1[1] = 0 (361)
F2[0] = 1, F2[1]  = 2, F2[2] = 1 (362)
F3[i][j] = F4[i][j] = 0(여기서 I = 0... 2, j = 0... 2 (363)
- SubWidthC 및 SubHeightC 양자 모두 2이면, 다음이 적용된다:
F1[0] = 1, F1[1] = 1 (364)
F3[0][1] = 1, F3[1][1] = 4, F3[2][1] = 1, F3[1][0] = 1, F3[1][2] = 1 (365)
F4[0][1] = 1, F4[1][1] = 2, F4[2][1] = 1 (366)
F4[0][2] = 1, F4[1][2] = 2, F4[2][2] = 1 (367)
- 그렇지 않으면 다음이 적용된다:
F3[1][1] = 8 (368)
F4[0][1] = 2, F4[1][1] = 4, F4[2][1] = 2, (369)
- sps_chroma_vertical_collocated_flag이 1이면, 다음이 적용된다:
- pDsY[x][y](여기서 x = 0... nTbW - 1, y = 0... nTbH - 1)응 다음과 같이 유도된다:
pDsY[x][y] = (F3[1][0] * pY[SubWidthC * x][SubHeightC * y - 1] + F3[0][1] * pY[SubWidthC * x - 1][SubHeightC * y] +
F3[1][1] * pY[SubWidthC * x][SubHeightC * y] +
F3[2][1] * pY[SubWidthC * x + 1 ][ SubHeightC * y] + F3[1][2] * pY[SubWidthC * x][SubHeightC * y + 1] + 4) >> 3 (370)
- 그렇지 않으면(sps_chroma_vertical_collocated_flag이 0이면), 다음이 적용된다:
- pDsY[x][y](여기서 x = 0... nTbW - 1, y = 0... nTbH - 1)는 다음과 같이 유도된다:
pDsY[x][y] = (F4[0][1] * pY[SubWidthC * x - 1][SubHeightC * y] +
F4[0][2] * pY[SubWidthC * x - 1][SubHeightC * y + 1] +
F4[1][1] * pY[SubWidthC * x][SubHeightC * y] +
F4[1][2] * pY[SubWidthC * x][SubHeightC * y + 1] +
F4[2][1] * pY[SubWidthC * x + 1][SubHeightC * y] +
F4[2][2] * pY[SubWidthC * x + 1][SubHeightC * y + 1] + 4) >> 3 (371)
4. numSampL가 0보다 크면, 선택된 좌측 크로마 샘플 pSelC[idx]들은 p[-1][pickPosL[idx]](여기서 idx = 0... cntL = 1)와 같게 설정되고, 선택된 다운샘플링된 이웃 좌측 루마 샘플 pSelDsY[idx](여기서 idx = 0... cntL - 1)들은 다음과 같이 유도된다:
- 변수 y가 pickPosL[idx]와 같게 설정된다.
- SubWidthC 및 SubHeightC 양자 모두 1이면, 다음이 적용된다:
pSelDsY[idx] = pY[-1][y] (372)
- 그렇지 않으면 다음이 적용된다:
- sps_chroma_vertical_collocated_flag이 1이면 다음이 적용된다:
pSelDsY[idx] = (F3[1][0] * pY[-SubWidthC][SubHeightC * y - 1] +
F3[0][1] * pY[-SubWidthC][SubHeightC * y] +
F3[1][1] * pY[-SubWidthC][SubHeightC * y] +
F3[2][1] * pY[1 - SubWidthC][SubHeightC * y] +
F3[1][2] * pY[-SubWidthC][SubHeightC * y + 1] + 4 ) >> 3 (373)
- 그렇지 않으면(sps_chroma_vertical_collocated_flag이 0이면) 다음이 적용된다:
pSelDsY[idx] = (F4[0][1] * pY[-1 - SubWidthC][SubHeightC * y]+
F4[0][2] * pY[-1 - SubWidthC][SubHeightC * y + 1] +
F4[1][1] * pY[-SubWidthC][SubHeightC * y] +
F4[1][2] * pY[-SubWidthC][SubHeightC * y + 1] +
F4[2][1] * pY[1 - SubWidthC][SubHeightC * y ] +
F4[2][2] * pY[1 - SubWidthC][SubHeightC * y + 1] + 4) >> 3 (374)
5. numSampT가 0보다 크면, 선택된 이웃 상측 크로마 샘플 pSelC[idx]들은 p[pickPosT[idx - cntL]][-1](여기서 idx = cntL... cntL + cntT - 1)과 같게 설정되고, 다운샘플링된 이웃 상측 루마 샘플 pSelDsY[idx](여기서 idx = 0... cntL + cntT - 1)들은 다음과 같이 명시되는데:
- 변수 x는 pickPosT[idx - cntL]와 같게 설정된다.
- SubWidthC 및 SubHeightC 양자 모두 1이면. 다음이 적용된다:
pSelDsY[idx] = pY[x][-1] (375)
- 그렇지 않으면 다음이 적용된다:
- sps_chroma_vertical_collocated_flag이 1이면, 다음이 적용된다:
- bCTUboundary가 FALSE이면, 다음이 적용된다:
pSelDsY[idx] = (F3[1][0] * pY[SubWidthC * x][-1 - SubHeightC]+
F3[0][1] * pY[SubWidthC * x - 1][-SubHeightC] +
F3[1][1] * pY[SubWidthC * x][-SubHeightC] +
F3[2][1] * pY[SubWidthC * x + 1][-SubHeightC] +
F3[1][2] * pY[SubWidthC * x][1 - SubHeightC] + 4) >> 3 (376)
- 그렇지 않으면(bCTUboundary가 TRUE이면), 다음이 적용된다:
pSelDsY[idx] = (F2[0] * pY[SubWidthC * x - 1][-1] +
F2[1] * pY[SubWidthC * x][-1] +
F2[2] * pY[SubWidthC * x + 1][-1] + 2) >> 2 (377)
- 그렇지 않으면(sps_chroma_vertical_collocated_flag이 0이면), 다음이 적용된다:
- bCTUboundary가 FALSE이면, 다음이 적용된다:
pSelDsY[idx] = (F4[0][1] * pY[SubWidthC * x - 1][-1] +
F4[0][2] * pY[SubWidthC * x - 1][-2] +
F4[1][1] * pY[SubWidthC * x][-1] +
F4[1][2] * pY[SubWidthC * x][-2] +
F4[2][1] * pY[SubWidthC * x + 1][-1] +
F4[2][2] * pY[SubWidthC * x + 1][-2] + 4) >> 3 (378)
- 그렇지 않으면(bCTUboundary가 TRUE이면), 다음이 적용된다:
pSelDsY[idx] = (F2[0] * pY[SubWidthC * x - 1][-1] +
F2[1] * pY[SubWidthC * x][-1] +
F2[2] * pY[SubWidthC * x + 1][-1] + 2) >> 2 (379)
6. cntT + cntL이 0이 아니면, 변수 minY, maxY, minC, 및 maxC들이 다음과 같이 유도된다:
- cntT + cntL가 2이면, pSelComp[3]이 pSelComp[0]와 같게 설정되고, pSelComp[2]가 pSelComp[1]와 같게 설정되며, pSelComp[0]이 pSelComp[1]와 같게 설정되고, 그리고 pSelComp[1]가 pSelComp[3]와 같게 설정되는데 여기서 Comp는 DsY 및 C로 치환된다.
- 행렬 minGrpIdx 및 maxGrpIdx들은 다음과 같이 유도된다:
minGrpIdx[0] = 0 (380)
minGrpIdx[1] = 2 (381)
maxGrpIdx[0] = 1 (382)
maxGrpIdx[1] = 3 (383)
- pSelDsY[minGrpIdx[0]]이 pSelDsY[minGrpIdx[1]]보다 크면, minGrpIdx[0]과 minGrpIdx[1]들이 다음과 같이 스왑된다(swapped):
(minGrpIdx[0], minGrpIdx[1]) = Swap(minGrpIdx[0], minGrpIdx[1]) (384)
- pSelDsY[maxGrpIdx[0]]이 pSelDsY[maxGrpIdx[1]]보다 크면, maxGrpIdx[0]과 maxGrpIdx[1]들이 다음과 같이 스왑된다:
(maxGrpIdx[0], maxGrpIdx[1]) = Swap(maxGrpIdx[0], maxGrpIdx[1]) (385)
- pSelDsY[minGrpIdx[0]]이 pSelDsY[maxGrpIdx[1]]보다 크면, 행렬 minGrpIdx와 maxGrpIdx들이 다음과 같이 스왑된다:
(minGrpIdx, maxGrpIdx) = Swap(minGrpIdx, maxGrpIdx) (386)
- pSelDsY[minGrpIdx[1]]이 pSelDsY[maxGrpIdx[0]]보다 크면, minGrpIdx[1]와 maxGrpIdx[0]들이 다음과 같이 스왑된다:
(minGrpIdx[1], maxGrpIdx[0]) = Swap(minGrpIdx[1], maxGrpIdx[0]) (387)
- 변수 maxY, maxC, minY, 및 minC들은 다음과 같이 유도된다:
maxY = (pSelDsY[maxGrpIdx[0]] + pSelDsY[maxGrpIdx[1]] + 1) >> 1 (388)
maxC = (pSelC[maxGrpIdx[0]] + pSelC[maxGrpIdx[1]] + 1) >> 1 (389)
minY = (pSelDsY[minGrpIdx[0]] + pSelDsY[minGrpIdx[1]] + 1) >> 1 (390)
minC = (pSelC[minGrpIdx[0]] + pSelC[minGrpIdx[1]] + 1) >> 1 (391)
7. 변수 a, b, 및 k들은 다음과 같이 유도된다:
- numSampL이 0이고, numSampT가 0이면 다음이 적용된다:
k = 0 (392)
a = 0 (393)
b = 1 << (BitDepth - 1) (394)
- 그렇지 않으면 다음이 적용된다:
diff = maxY - minY (395)
- diff가 0이 아니면, 다음이 적용된다:
diffC = maxC - minC (396)
x = Floor(Log2(diff)) (397)
normDiff = ((diff << 4) >> x) & 15 (398)
x += (normDiff ! = 0) ? 1 : 0 (399)
y = Abs(diffC) > 0 ? Floor(Log2(Abs(diffC))) + 1 : 0 (400)
a = (diffC * (divSigTable[normDiff] | 8) + 2y - 1) >> y (401)
k = ((3 + x - y) < 1) 1 : 3 + x - y (402)
a = ((3 + x - y) < 1) ? Sign(a) * 15 : a (403)
b = minC - ((a * minY) >> k) (404)
여기서 divSigTable[ ]은 다음과 같이 명시된다:
divSigTable[ ] = { 0, 7, 6, 5, 5, 4, 4, 3, 3, 2, 2, 1, 1, 1, 1, 0 } (405)
- 그렇지 않으면(diff가 0이면), 다음이 적용된다:
k = 0 (406)
a = 0 (407)
b = minC (408)
8. 예측 샘플 predSamples[x][y](여기서 x = 0... nTbW - 1, y = 0... nTbH - 1)들은 다음과 같이 유도된다:
predSamples[x][y] = Clip1(((pDsY[x][y] * a) >> k) + b) (409)
참고(NOTE) - 이 프로세스는 sps_chroma_vertical_collocated_flag을 사용한다. 그러니 구현을 간략화하기 위해 sps_chroma_horizontal_collocated_flag을 사용하지 않는다.
5.9. 실시예 9(Embodiment 9)
JVET-Q2001-vE에 명시된 작업 초안은 아래와 같이 변경될 수 있다.
8.4.5.2.13
이 프로세스에 대한 입력들은:
- 인트라 예측 모드 predModeIntra,
- 현재 픽처의 상-좌 샘플에 대한 현재 변환 블록의 상좌 샘플의 샘플 위치(xTbC, yTbC),
- 변환 블록 폭을 명시하는 변수 nTbW,
- 변환 블록 높이를 명시하는 변수 nTbH,
- 현재 블록의 색상 성분을 명시하는 변수 cIdx,
- 크로마 이웃 샘플들 p[x][y], 여기서 x = -1, y = 0... 2 * nTbH - 1 및 x = 0... 2 * nTbW - 1, y = -1.
이 프로세스의 출력은 예측된 샘플들 predSamples[x][y]인데, 여기서 x = 0... nTbW - 1, y = 0... nTbH - 1.
현재 루마 위치(xTbY, yTbY)는 다음과 같이 유도된다:
(xTbY, yTbY) = (xTbC<<(SubWidthC - 1), yTbC << (SubHeightC - 1)) (351)
변수 availL, availT, 및 availTL들은 다음과 같이 유도된다:
- 6.4.4 절(clause)에 명시된 바와 같은 인접 블록 사용 가능성에 대한 유도 프로세스는, (xTbY, yTbY)로 설정된 현재 루마 위치(xCurr, yCurr), 이웃 루마 위치 (xTbY - 1, yTbY), FALSE로 설정된 checkPredModeY, 및 cIdx를 입력으로 하여 실행되어지고, 출력은 availL 로 할당된다.
6.4.4 절(clause)에 명시된 바와 같은 인접 블록 사용 가능성에 대한 유도 프로세스는, (xTbY, yTbY)로 설정된 현재 루마 위치(xCurr, yCurr), 이웃 루마 위치 (xTbY, yTbY - 1), FALSE로 설정된 checkPredModeY, 및 cIdx를 입력으로 하여 실행되어지고, 출력은 availT 로 할당된다.
- 변수 availTL은 다음과 같이 유도된다:
availTL = availL && availT (352)
- 사용 가능한 상-우 이웃 크로마 샘플들의 수는 다음과 같이 유도된다:
- 변수 numTopRight가 0과 같게 설정되고 availTR이 TRUE와 같게 설정된다.
- predModeIntra가 INTRA_T_CCLM과 같을 때, availTR이 FALSE이거나 x가 2 * nTbW - 1이 될 때까지 다음이 x = nTbW... 2 * nTbW - 1에 적용된다:
- 6.4.4 절(clause)에 명시된 바와 같은 인접 블록 사용 가능성에 대한 유도 프로세스는, (xTbY, yTbY)로 설정된 현재 루마 위치(xCurr, yCurr), 이웃 루마 위치 (xTbY + x, yTbY - 1), FALSE로 설정된 checkPredModeY, 및 cIdx를 입력으로 하여 실행되어지고, 출력은 availTR 로 할당된다.
- availTR이 TRUE일 때, numTopRight가 1만큼 증분된다.
- 사용 가능한 좌-하(left-below) 이웃 크로마 샘플들의 수 numLeftBelow는 다음과 같이 유도된다:
- 변수 numLeftBelow가 0과 같게 설정되고 availLB가 TRUE와 같게 설정된다.
- predModeIntra가 INTRA_L_CCLM일 때, availLB가 FALSE이거나 y가 2 * nTbH - 1이 될 때까지 ekdmaa이 y = nTbH... 2 * nTbH - 1에 적용되고:
- 6.4.4 절(clause)에 명시된 바와 같은 인접 블록 사용 가능성에 대한 유도 프로세스는, (xTbY, yTbY)로 설정된 현재 루마 위치(xCurr, yCurr), 이웃 루마 위치 (xTbY - 1, yTbY + y), FALSE로 설정된 checkPredModeY, 및 cIdx를 입력으로 하여 실행되어지고, 출력은 availLB 로 할당된다.
- availLB가 TRUE일 때, numLeftBelow가 1만큼 증분된다.
상측 및 상-우측 상의 사용 가능한 이웃 크로마 샘플들의 수 numSampT와 좌측 및 좌-하측 상의 사용 가능한 이웃 크로마 샘플들의 수 numSampL은 다음과 같이 유도된다:
- predModeIntra가 INTRA_LT_CCLM이면, 다음이 적용된다:
numSampT = availT ? nTbW : 0 (353)
numSampL = availL ? nTbH : 0 (354)
- 그렇지 않으면 다음이 적용된다:
numSampT = (availT && predModeIntra = = INTRA_T_CCLM) ? (nTbW + Min(numTopRight, nTbH)) : 0 (355)
numSampL = (availL && predModeIntra = = INTRA_L_CCLM) ? (nTbH + Min(numLeftBelow, nTbW)) : 0 (356)
변수 bCTUboundary는 다음과 같이 유도된다:
bCTUboundary = (yTbY & (CtbSizeY - 1) = = 0) ? TRUE : FALSE (357)
변수 cntN와 N이 L 및 T로 치환된 행렬(array) pickPosN은 다음과 같이 유도되는데 :
- 변수 numIs4N은 다음과 같이 유도된다:
numIs4N = ((availT && availL && predModeIntra = = INTRA_LT_CCLM) ? 0 : 1) (358)
- 변수 startPosN이 numSampN >> (2 + numIs4N)과 같게 설정된다.
- 변수 pickStepN 이 Max(1, numSampN >> (1 + numIs4N))과 같게 설정된다.
- availN이 TRUE이고 predModeIntra가 INTRA_LT_CCLM 또는 INTRA_N_CCLM이면, 다음 할당이 이뤄지는데:
- cntN이 Min(numSampN, (1 + numIs4N) << 1)와 같게 설정된다.
- pickPosN[pos]가 (startPosN = pos * pickStepN)와 같게 설정되는데, 여기서 pos = 0... cntN - 1.
- 그렇지 않으면 cntN이 0과 같게 설정된다.
예측 샘플 predSamples[x][y](여기서 x= 0... nTbW - 1, y = 0.. nTbH - 1)들은 다음과 같이 유도된다:
- numSampL 및 numSampT 모두 0이면 다음이 적용된다:
predSamples[x][y] = 1 << (BitDepth - 1) (359)
- 그렇지 않으면 다음 순서의 단계들이 적용된다:
1. 동치(collocated) 루마 샘플 pY[x][y](여기서 x = 0... nTbW * SubWidthC - 1, y = 0... nTbH * SubHeightC - 1)들은 위치(xTbY + x, yTbY + y)들에서의 디블록킹 필터 처리에 앞서 재현된 루마 샘플들과 같게 설정된다.
2. 이웃 루마 샘플 pY[x][y]들은 다음과 같이 유도된다:
- numSampL이 0보다 크면, 이웃 좌측 루마 샘플 pY[x][y](여기서 x = -1... -3, y = 0... SubHeightC*numSampL - 1)들은 위치(xTbY + x, yTbY +y)들에서의 디블록킹 필터 처리 전에 재현 루마 샘플들과 같게 설정된다.
- availT가 FALSE이면, 이웃 상측 루마 샘플 pY[x][y](여기서 x = -1... SubWidthC * [[numSampT]] nTbW - 1, y = -1... -2)들은 루마 샘플 pY[x][0]들과 같게 설정된다.
[[ - availL이 FALSE이면, 이웃 좌측 루마 샘플 pY[x][y](여기서 x = -1... -3, y = -1... SubHeightC * numSampL - 1)들은 루마 샘플 pY[0][y]들과 같게 설정된다. ]]
- numSampT가 0보다 크면, 이웃 상측 루마 샘플 pY[x][y](여기서 x = 0... SubWidthC * numSampT - 1, y = -1, -2)들은 위치(xTbY + x, yTbY + y)에서의 디블록킹 필터 처리 전에 재현 루마 샘플들과 같게 설정된다.
- availL이 FALSE이면, 이웃 좌측 루마 샘플 pY[x][y](여기서 x = -1... -3, y = - 1... SubHeightC * nTbH - 1) 들이 루마 샘플 pY[0][y]들과 같게 설정된다.
- availTL이 TRUE이면, 이웃 상-좌 루마 샘플 pY[x][y](여기서 x = -1, y = -1, -2)들은 위치(xTbY + x, yTbY + y)에서의 디블록킹 필터 처리 전에 재현 루마 샘플들과 같게 설정된다.
3. 다운샘플링된 동치 루마 샘플 pDsY[x][y](여기서 x = 0... nTbW - 1, y = 0... nTbH - 1)들은 다음과 같이 유도된다:
- SubWidthC 및 SubHeightC 양자 모두 1이면, 다음이 적용된다:
- pDsY[x][y](여기서 x = 1... nTbW - 1, y = 1... nTbH - 1)는 다음과 같이 유도된다:
pDstY[x][y] = pY[x][y] (360)
- 그렇지 않으면 다음이 적용된다:
- 1차원 필터계수 행렬 F1 및 F2와 2차원 필터 계수 행렬 F3 및 F4는 다음과 같이 명시된다:
F1[0] = 2, F1[1] = 0 (361)
F2[0] = 1, F2[1]  = 2, F2[2] = 1 (362)
F3[i][j] = F4[i][j] = 0(여기서 I = 0... 2, j = 0... 2 (363)
- SubWidthC 및 SubHeightC 양자 모두 2이면, 다음이 적용된다:
F1[0] = 1, F1[1] = 1 (364)
F3[0][1] = 1, F3[1][1] = 4, F3[2][1] = 1, F3[1][0] = 1, F3[1][2] = 1 (365)
F4[0][1] = 1, F4[1][1] = 2, F4[2][1] = 1 (366)
F4[0][2] = 1, F4[1][2] = 2, F4[2][2] = 1 (367)
- 그렇지 않으면 다음이 적용된다:
F3[1][1] = 8 (368)
F4[0][1] = 2, F4[1][1] = 4, F4[2][1] = 2, (369)
- sps_chroma_vertical_collocated_flag이 1이면, 다음이 적용된다:
- pDsY[x][y](여기서 x = 0... nTbW - 1, y = 0... nTbH - 1)응 다음과 같이 유도된다:
pDsY[x][y] = (F3[1][0] * pY[SubWidthC * x][SubHeightC * y - 1] + F3[0][1] * pY[SubWidthC * x - 1][SubHeightC * y] +
F3[1][1] * pY[SubWidthC * x][SubHeightC * y] +
F3[2][1] * pY[SubWidthC * x + 1 ][ SubHeightC * y] + F3[1][2] * pY[SubWidthC * x][SubHeightC * y + 1] + 4) >> 3 (370)
- 그렇지 않으면(sps_chroma_vertical_collocated_flag이 0이면), 다음이 적용된다:
- pDsY[x][y](여기서 x = 0... nTbW - 1, y = 0... nTbH - 1)는 다음과 같이 유도된다:
pDsY[x][y] = (F4[0][1] * pY[SubWidthC * x - 1][SubHeightC * y] +
F4[0][2] * pY[SubWidthC * x - 1][SubHeightC * y + 1] +
F4[1][1] * pY[SubWidthC * x][SubHeightC * y] +
F4[1][2] * pY[SubWidthC * x][SubHeightC * y + 1] +
F4[2][1] * pY[SubWidthC * x + 1][SubHeightC * y] +
F4[2][2] * pY[SubWidthC * x + 1][SubHeightC * y + 1] + 4) >> 3 (371)
4. numSampL가 0보다 크면, 선택된 좌측 크로마 샘플 pSelC[idx]들은 p[-1][pickPosL[idx]](여기서 idx = 0... cntL = 1)와 같게 설정되고, 선택된 다운샘플링된 이웃 좌측 루마 샘플 pSelDsY[idx](여기서 idx = 0... cntL - 1)들은 다음과 같이 유도된다:
- 변수 y가 pickPosL[idx]와 같게 설정된다.
- SubWidthC 및 SubHeightC 양자 모두 1이면, 다음이 적용된다:
pSelDsY[idx] = pY[-1][y] (372)
- 그렇지 않으면 다음이 적용된다:
- sps_chroma_vertical_collocated_flag이 1이면 다음이 적용된다:
pSelDsY[idx] = (F3[1][0] * pY[-SubWidthC][SubHeightC * y - 1] +
F3[0][1] * pY[-SubWidthC][SubHeightC * y] +
F3[1][1] * pY[-SubWidthC][SubHeightC * y] +
F3[2][1] * pY[1 - SubWidthC][SubHeightC * y] +
F3[1][2] * pY[-SubWidthC][SubHeightC * y + 1] + 4 ) >> 3 (373)
- 그렇지 않으면(sps_chroma_vertical_collocated_flag이 0이면) 다음이 적용된다:
pSelDsY[idx] = (F4[0][1] * pY[-1 - SubWidthC][SubHeightC * y]+
F4[0][2] * pY[-1 - SubWidthC][SubHeightC * y + 1] +
F4[1][1] * pY[-SubWidthC][SubHeightC * y] +
F4[1][2] * pY[-SubWidthC][SubHeightC * y + 1] +
F4[2][1] * pY[1 - SubWidthC][SubHeightC * y ] +
F4[2][2] * pY[1 - SubWidthC][SubHeightC * y + 1] + 4) >> 3 (374)
5. numSampT가 0보다 크면, 선택된 이웃 상측 크로마 샘플 pSelC[idx]들은 p[pickPosT[idx - cntL]][-1](여기서 idx = cntL... cntL + cntT - 1)과 같게 설정되고, 다운샘플링된 이웃 상측 루마 샘플 pSelDsY[idx](여기서 idx = 0... cntL + cntT - 1)들은 다음과 같이 명시되는데:
- 변수 x는 pickPosT[idx - cntL]와 같게 설정된다.
- SubWidthC 및 SubHeightC 양자 모두 1이면. 다음이 적용된다:
pSelDsY[idx] = pY[x][-1] (375)
- 그렇지 않으면 다음이 적용된다:
- sps_chroma_vertical_collocated_flag이 1이면, 다음이 적용된다:
- bCTUboundary가 FALSE이면, 다음이 적용된다:
pSelDsY[idx] = (F3[1][0] * pY[SubWidthC * x][-1 - SubHeightC]+
F3[0][1] * pY[SubWidthC * x - 1][-SubHeightC] +
F3[1][1] * pY[SubWidthC * x][-SubHeightC] +
F3[2][1] * pY[SubWidthC * x + 1][-SubHeightC] +
F3[1][2] * pY[SubWidthC * x][1 - SubHeightC] + 4) >> 3 (376)
- 그렇지 않으면(bCTUboundary가 TRUE이면), 다음이 적용된다:
pSelDsY[idx] = (F2[0] * pY[SubWidthC * x - 1][-1] +
F2[1] * pY[SubWidthC * x][-1] +
F2[2] * pY[SubWidthC * x + 1][-1] + 2) >> 2 (377)
- 그렇지 않으면(sps_chroma_vertical_collocated_flag이 0이면), 다음이 적용된다:
- bCTUboundary가 FALSE이면, 다음이 적용된다:
pSelDsY[idx] = (F4[0][1] * pY[SubWidthC * x - 1][-1] +
F4[0][2] * pY[SubWidthC * x - 1][-2] +
F4[1][1] * pY[SubWidthC * x][-1] +
F4[1][2] * pY[SubWidthC * x][-2] +
F4[2][1] * pY[SubWidthC * x + 1][-1] +
F4[2][2] * pY[SubWidthC * x + 1][-2] + 4) >> 3 (378)
- 그렇지 않으면(bCTUboundary가 TRUE이면), 다음이 적용된다:
pSelDsY[idx] = (F2[0] * pY[SubWidthC * x - 1][-1] +
F2[1] * pY[SubWidthC * x][-1] +
F2[2] * pY[SubWidthC * x + 1][-1] + 2) >> 2 (379)
6. cntT + cntL이 0이 아니면, 변수 minY, maxY, minC, 및 maxC들이 다음과 같이 유도된다:
- cntT + cntL가 2이면, pSelComp[3]이 pSelComp[0]와 같게 설정되고, pSelComp[2]가 pSelComp[1]와 같게 설정되며, pSelComp[0]이 pSelComp[1]와 같게 설정되고, 그리고 pSelComp[1]가 pSelComp[3]와 같게 설정되는데 여기서 Comp는 DsY 및 C로 치환된다.
- 행렬 minGrpIdx 및 maxGrpIdx들은 다음과 같이 유도된다:
minGrpIdx[0] = 0 (380)
minGrpIdx[1] = 2 (381)
maxGrpIdx[0] = 1 (382)
maxGrpIdx[1] = 3 (383)
- pSelDsY[minGrpIdx[0]]이 pSelDsY[minGrpIdx[1]]보다 크면, minGrpIdx[0]과 minGrpIdx[1]들이 다음과 같이 스왑된다(swapped):
(minGrpIdx[0], minGrpIdx[1]) = Swap(minGrpIdx[0], minGrpIdx[1]) (384)
- pSelDsY[maxGrpIdx[0]]이 pSelDsY[maxGrpIdx[1]]보다 크면, maxGrpIdx[0]과 maxGrpIdx[1]들이 다음과 같이 스왑된다:
(maxGrpIdx[0], maxGrpIdx[1]) = Swap(maxGrpIdx[0], maxGrpIdx[1]) (385)
- pSelDsY[minGrpIdx[0]]이 pSelDsY[maxGrpIdx[1]]보다 크면, 행렬 minGrpIdx와 maxGrpIdx들이 다음과 같이 스왑된다:
(minGrpIdx, maxGrpIdx) = Swap(minGrpIdx, maxGrpIdx) (386)
- pSelDsY[minGrpIdx[1]]이 pSelDsY[maxGrpIdx[0]]보다 크면, minGrpIdx[1]와 maxGrpIdx[0]들이 다음과 같이 스왑된다:
(minGrpIdx[1], maxGrpIdx[0]) = Swap(minGrpIdx[1], maxGrpIdx[0]) (387)
- 변수 maxY, maxC, minY, 및 minC들은 다음과 같이 유도된다:
maxY = (pSelDsY[maxGrpIdx[0]] + pSelDsY[maxGrpIdx[1]] + 1) >> 1 (388)
maxC = (pSelC[maxGrpIdx[0]] + pSelC[maxGrpIdx[1]] + 1) >> 1 (389)
minY = (pSelDsY[minGrpIdx[0]] + pSelDsY[minGrpIdx[1]] + 1) >> 1 (390)
minC = (pSelC[minGrpIdx[0]] + pSelC[minGrpIdx[1]] + 1) >> 1 (391)
7. 변수 a, b, 및 k들은 다음과 같이 유도된다:
- numSampL이 0이고, numSampT가 0이면 다음이 적용된다:
k = 0 (392)
a = 0 (393)
b = 1 << (BitDepth - 1) (394)
- 그렇지 않으면 다음이 적용된다:
diff = maxY - minY (395)
- diff가 0이 아니면, 다음이 적용된다:
diffC = maxC - minC (396)
x = Floor(Log2(diff)) (397)
normDiff = ((diff << 4) >> x) & 15 (398)
x += (normDiff ! = 0) ? 1 : 0 (399)
y = Abs(diffC) > 0 ? Floor(Log2(Abs(diffC))) + 1 : 0 (400)
a = (diffC * (divSigTable[normDiff] | 8) + 2y - 1) >> y (401)
k = ((3 + x - y) < 1) 1 : 3 + x - y (402)
a = ((3 + x - y) < 1) ? Sign(a) * 15 : a (403)
b = minC - ((a * minY) >> k) (404)
여기서 divSigTable[ ]은 다음과 같이 명시된다:
divSigTable[ ] = { 0, 7, 6, 5, 5, 4, 4, 3, 3, 2, 2, 1, 1, 1, 1, 0 } (405)
- 그렇지 않으면(diff가 0이면), 다음이 적용된다:
k = 0 (406)
a = 0 (407)
b = minC (408)
8. 예측 샘플 predSamples[x][y](여기서 x = 0... nTbW - 1, y = 0... nTbH - 1)들은 다음과 같이 유도된다:
predSamples[x][y] = Clip1(((pDsY[x][y] * a) >> k) + b) (409)
참고(NOTE) - 이 프로세스는 sps_chroma_vertical_collocated_flag을 사용한다. 그러니 구현을 간략화하기 위해 sps_chroma_horizontal_collocated_flag을 사용하지 않는다.
5.10. 실시예 10(Embodiment 10)
JVET-Q2001-vE에 명시된 작업 초안은 다음과 같이 변경될 수 있다.
8.4.5.2.13
JVET-Q2001-vE에 명시된 작업 초안은 다음과 같이 변경될 수 있다.
이 프로세스에 대한 입력들은:
- 인트라 예측 모드 predModeIntra,
- 현재 픽처의 상-좌 샘플에 대한 현재 변환 블록의 상좌 샘플의 샘플 위치(xTbC, yTbC),
- 변환 블록 폭을 명시하는 변수 nTbW,
- 변환 블록 높이를 명시하는 변수 nTbH,
- 현재 블록의 색상 성분을 명시하는 변수 cIdx,
- 크로마 이웃 샘플들 p[x][y], 여기서 x = -1, y = 0... 2 * nTbH - 1 및 x = 0... 2 * nTbW - 1, y = -1.
이 프로세스의 출력은 예측된 샘플들 predSamples[x][y]인데, 여기서 x = 0... nTbW - 1, y = 0... nTbH - 1.
현재 루마 위치(xTbY, yTbY)는 다음과 같이 유도된다:
(xTbY, yTbY) = (xTbC<<(SubWidthC - 1), yTbC << (SubHeightC - 1)) (351)
변수 availL, availT, 및 availTL들은 다음과 같이 유도된다:
- 6.4.4 절(clause)에 명시된 바와 같은 인접 블록 사용 가능성에 대한 유도 프로세스는, (xTbY, yTbY)로 설정된 현재 루마 위치(xCurr, yCurr), 이웃 루마 위치 (xTbY - 1, yTbY), FALSE로 설정된 checkPredModeY, 및 cIdx를 입력으로 하여 실행되어지고, 출력은 availL 로 할당된다.
- 6.4.4 절(clause)에 명시된 바와 같은 인접 블록 사용 가능성에 대한 유도 프로세스는, (xTbY, yTbY)로 설정된 현재 루마 위치(xCurr, yCurr), 이웃 루마 위치 (xTbY, yTbY - 1), FALSE로 설정된 checkPredModeY, 및 cIdx를 입력으로 하여 실행되어지고, 출력은 availT 로 할당된다.
- 6.4.4 절(clause)에 명시된 바와 같은 인접 블록 사용 가능성에 대한 유도 프로세스는, (xTbY, yTbY)로 설정된 현재 루마 위치(xCurr, yCurr), 이웃 루마 위치 (xTbY - 1, yTbY - 1), FALSE로 설정된 checkPredModeY, 및 cIdx를 입력으로 하여 실행되어지고, 출력은 availTL로 할당된다.
[[ 변수 availTL은 다음과 같이 유도된다:
availTL = availL && availT (352) ]]
- 사용 가능한 상-우 이웃 크로마 샘플들의 수는 다음과 같이 유도된다:
- 변수 numTopRight가 0과 같게 설정되고 availTR이 TRUE와 같게 설정된다.
- predModeIntra가 INTRA_T_CCLM과 같을 때, availTR이 FALSE이거나 x가 2 * nTbW - 1이 될 때까지 다음이 x = nTbW... 2 * nTbW - 1에 적용된다:
- 6.4.4 절(clause)에 명시된 바와 같은 인접 블록 사용 가능성에 대한 유도 프로세스는, (xTbY, yTbY)로 설정된 현재 루마 위치(xCurr, yCurr), 이웃 루마 위치 (xTbY + x, yTbY - 1), FALSE로 설정된 checkPredModeY, 및 cIdx를 입력으로 하여 실행되어지고, 출력은 availTR 로 할당된다.
- availTR이 TRUE일 때, numTopRight가 1만큼 증분된다.
- 사용 가능한 좌-하(left-below) 이웃 크로마 샘플들의 수 numLeftBelow는 다음과 같이 유도된다:
- 변수 numLeftBelow가 0과 같게 설정되고 availLB가 TRUE와 같게 설정된다.
- predModeIntra가 INTRA_L_CCLM일 때, availLB가 FALSE이거나 y가 2 * nTbH - 1이 될 때까지 ekdmaa이 y = nTbH... 2 * nTbH - 1에 적용되고:
- 6.4.4 절(clause)에 명시된 바와 같은 인접 블록 사용 가능성에 대한 유도 프로세스는, (xTbY, yTbY)로 설정된 현재 루마 위치(xCurr, yCurr), 이웃 루마 위치 (xTbY - 1, yTbY + y), FALSE로 설정된 checkPredModeY, 및 cIdx를 입력으로 하여 실행되어지고, 출력은 availLB 로 할당된다.
- availLB가 TRUE일 때, numLeftBelow가 1만큼 증분된다.
상측 및 상-우측 상의 사용 가능한 이웃 크로마 샘플들의 수 numSampT와 좌측 및 좌-하측 상의 사용 가능한 이웃 크로마 샘플들의 수 numSampL은 다음과 같이 유도된다:
- predModeIntra가 INTRA_LT_CCLM이면, 다음이 적용된다:
numSampT = availT ? nTbW : 0 (353)
numSampL = availL ? nTbH : 0 (354)
- 그렇지 않으면 다음이 적용된다:
numSampT = (availT && predModeIntra = = INTRA_T_CCLM) ? (nTbW + Min(numTopRight, nTbH)) : 0 (355)
numSampL = (availL && predModeIntra = = INTRA_L_CCLM) ? (nTbH + Min(numLeftBelow, nTbW)) : 0 (356)
변수 bCTUboundary는 다음과 같이 유도된다:
bCTUboundary = (yTbY & (CtbSizeY - 1) = = 0) ? TRUE : FALSE (357)
변수 cntN와 N이 L 및 T로 치환된 행렬(array) pickPosN은 다음과 같이 유도되는데 :
- 변수 numIs4N은 다음과 같이 유도된다:
numIs4N = ((availT && availL && predModeIntra = = INTRA_LT_CCLM) ? 0 : 1) (358)
- 변수 startPosN이 numSampN >> (2 + numIs4N)과 같게 설정된다.
- 변수 pickStepN 이 Max(1, numSampN >> (1 + numIs4N))과 같게 설정된다.
- availN이 TRUE이고 predModeIntra가 INTRA_LT_CCLM 또는 INTRA_N_CCLM이면, 다음 할당이 이뤄지는데:
- cntN이 Min(numSampN, (1 + numIs4N) << 1)와 같게 설정된다.
- pickPosN[pos]가 (startPosN = pos * pickStepN)와 같게 설정되는데, 여기서 pos = 0... cntN - 1.
- 그렇지 않으면 cntN이 0과 같게 설정된다.
예측 샘플 predSamples[x][y](여기서 x= 0... nTbW - 1, y = 0.. nTbH - 1)들은 다음과 같이 유도된다:
- numSampL 및 numSampT 모두 0이면 다음이 적용된다:
predSamples[x][y] = 1 << (BitDepth - 1) (359)
- 그렇지 않으면 다음 순서의 단계들이 적용된다:
1. 동치(collocated) 루마 샘플 pY[x][y](여기서 x = 0... nTbW * SubWidthC - 1, y = 0... nTbH * SubHeightC - 1)들은 위치(xTbY + x, yTbY + y)들에서의 디블록킹 필터 처리에 앞서 재현된 루마 샘플들과 같게 설정된다.
2. 이웃 루마 샘플 pY[x][y]들은 다음과 같이 유도된다:
- numSampL이 0보다 크면, 이웃 좌측 루마 샘플 pY[x][y](여기서 x = -1... -3, y = 0... SubHeightC*numSampL - 1)들은 위치(xTbY + x, yTbY +y)들에서의 디블록킹 필터 처리 전에 재현 루마 샘플들과 같게 설정된다.
[[- availT가 FALSE이면, 이웃 상측 루마 샘플 pY[x][y](여기서 x = -1... SubWidthC * numSampT - 1, y = -1... -2)들은 루마 샘플 pY[x][0]들과 같게 설정된다.
- availL이 FALSE이면, 이웃 좌측 루마 샘플 pY[x][y](여기서 x = -1... -3, y = -1... SubHeightC * numSampL - 1)들은 루마 샘플 pY[0][y]들과 같게 설정된다.]]
- numSampT가 0보다 크면, 이웃 상측 루마 샘플 pY[x][y](여기서 x = 0... SubWidthC * numSampT - 1, y = -1, -2)들은 위치(xTbY + x, yTbY + y)에서의 디블록킹 필터 처리 전에 재현 루마 샘플들과 같게 설정된다.
- [[When]] If availTL이 TRUE이면, 이웃 상-좌 루마 샘플 pY[x][y](여기서 x = -1,  -2, y = -1, -2)들은 위치(xTbY + x, yTbY + y)에서의 디블록킹 필터 처리 전에 재현 루마 샘플들과 같게 설정된다.
- 그렇지 않고 availT가 true이면, 이웃 상-좌 루마 샘플 pY[x][y](여기서 x = -1, -2, y = -1, - 2)들은 루마 샘플 pY[0][y]들과 같게 설정된다.
- 그렇지 않고 availL이 true이면, 이웃 상-좌 루마 샘플 pY[x][y](여기서 x = - 1, -2, y = -1, -2)들은 루마 샘플 pY[x][0]들과 같게 설정된다.
- availT가 FALSE이면, 이웃 상측 루마 샘플 pY[x][y](여기서 x = 0... SubWidthC * nTbW - 1, y = -1... -2)들은 루마 샘플 pY[x][0]들과 같게 설정된다.
- availL이 FALSE이면, 이웃 좌축 루마 샘플 pY[x][y](여기서 x = 0... -3, y = -1... SubHeightC * nTbH - 1)들이 루마 샘플 pY[0][y]들과 같게 설정된다.
3. 다운샘플링된 동치 루마 샘플 pDsY[x][y](여기서 x = 0... nTbW - 1, y = 0... nTbH - 1)들은 다음과 같이 유도된다:
- SubWidthC 및 SubHeightC 양자 모두 1이면, 다음이 적용된다:
- pDsY[x][y](여기서 x = 1... nTbW - 1, y = 1... nTbH - 1)는 다음과 같이 유도된다:
pDstY[x][y] = pY[x][y] (360)
- 그렇지 않으면 다음이 적용된다:
- 1차원 필터계수 행렬 F1 및 F2와 2차원 필터 계수 행렬 F3 및 F4는 다음과 같이 명시된다:
F1[0] = 2, F1[1] = 0 (361)
F2[0] = 1, F2[1]  = 2, F2[2] = 1 (362)
F3[i][j] = F4[i][j] = 0(여기서 I = 0... 2, j = 0... 2 (363)
- SubWidthC 및 SubHeightC 양자 모두 2이면, 다음이 적용된다:
F1[0] = 1, F1[1] = 1 (364)
F3[0][1] = 1, F3[1][1] = 4, F3[2][1] = 1, F3[1][0] = 1, F3[1][2] = 1 (365)
F4[0][1] = 1, F4[1][1] = 2, F4[2][1] = 1 (366)
F4[0][2] = 1, F4[1][2] = 2, F4[2][2] = 1 (367)
- 그렇지 않으면 다음이 적용된다:
F3[1][1] = 8 (368)
F4[0][1] = 2, F4[1][1] = 4, F4[2][1] = 2, (369)
- sps_chroma_vertical_collocated_flag이 1이면, 다음이 적용된다:
- pDsY[x][y](여기서 x = 0... nTbW - 1, y = 0... nTbH - 1)응 다음과 같이 유도된다:
pDsY[x][y] = (F3[1][0] * pY[SubWidthC * x][SubHeightC * y - 1] + F3[0][1] * pY[SubWidthC * x - 1][SubHeightC * y] +
F3[1][1] * pY[SubWidthC * x][SubHeightC * y] +
F3[2][1] * pY[SubWidthC * x + 1 ][ SubHeightC * y] + F3[1][2] * pY[SubWidthC * x][SubHeightC * y + 1] + 4) >> 3 (370)
- 그렇지 않으면(sps_chroma_vertical_collocated_flag이 0이면), 다음이 적용된다:
- pDsY[x][y](여기서 x = 0... nTbW - 1, y = 0... nTbH - 1)는 다음과 같이 유도된다:
pDsY[x][y] = (F4[0][1] * pY[SubWidthC * x - 1][SubHeightC * y] +
F4[0][2] * pY[SubWidthC * x - 1][SubHeightC * y + 1] +
F4[1][1] * pY[SubWidthC * x][SubHeightC * y] +
F4[1][2] * pY[SubWidthC * x][SubHeightC * y + 1] +
F4[2][1] * pY[SubWidthC * x + 1][SubHeightC * y] +
F4[2][2] * pY[SubWidthC * x + 1][SubHeightC * y + 1] + 4) >> 3 (371)
4. numSampL가 0보다 크면, 선택된 좌측 크로마 샘플 pSelC[idx]들은 p[-1][pickPosL[idx]](여기서 idx = 0... cntL = 1)와 같게 설정되고, 선택된 다운샘플링된 이웃 좌측 루마 샘플 pSelDsY[idx](여기서 idx = 0... cntL - 1)들은 다음과 같이 유도된다:
- 변수 y가 pickPosL[idx]와 같게 설정된다.
- SubWidthC 및 SubHeightC 양자 모두 1이면, 다음이 적용된다:
pSelDsY[idx] = pY[-1][y] (372)
- 그렇지 않으면 다음이 적용된다:
- sps_chroma_vertical_collocated_flag이 1이면 다음이 적용된다:
pSelDsY[idx] = (F3[1][0] * pY[-SubWidthC][SubHeightC * y - 1] +
F3[0][1] * pY[-SubWidthC][SubHeightC * y] +
F3[1][1] * pY[-SubWidthC][SubHeightC * y] +
F3[2][1] * pY[1 - SubWidthC][SubHeightC * y] +
F3[1][2] * pY[-SubWidthC][SubHeightC * y + 1] + 4 ) >> 3 (373)
- 그렇지 않으면(sps_chroma_vertical_collocated_flag이 0이면) 다음이 적용된다:
pSelDsY[idx] = (F4[0][1] * pY[-1 - SubWidthC][SubHeightC * y]+
F4[0][2] * pY[-1 - SubWidthC][SubHeightC * y + 1] +
F4[1][1] * pY[-SubWidthC][SubHeightC * y] +
F4[1][2] * pY[-SubWidthC][SubHeightC * y + 1] +
F4[2][1] * pY[1 - SubWidthC][SubHeightC * y ] +
F4[2][2] * pY[1 - SubWidthC][SubHeightC * y + 1] + 4) >> 3 (374)
5. numSampT가 0보다 크면, 선택된 이웃 상측 크로마 샘플 pSelC[idx]들은 p[pickPosT[idx - cntL]][-1](여기서 idx = cntL... cntL + cntT - 1)과 같게 설정되고, 다운샘플링된 이웃 상측 루마 샘플 pSelDsY[idx](여기서 idx = 0... cntL + cntT - 1)들은 다음과 같이 명시되는데:
- 변수 x는 pickPosT[idx - cntL]와 같게 설정된다.
- SubWidthC 및 SubHeightC 양자 모두 1이면. 다음이 적용된다:
pSelDsY[idx] = pY[x][-1] (375)
- 그렇지 않으면 다음이 적용된다:
- sps_chroma_vertical_collocated_flag이 1이면, 다음이 적용된다:
- bCTUboundary가 FALSE이면, 다음이 적용된다:
pSelDsY[idx] = (F3[1][0] * pY[SubWidthC * x][-1 - SubHeightC]+
F3[0][1] * pY[SubWidthC * x - 1][-SubHeightC] +
F3[1][1] * pY[SubWidthC * x][-SubHeightC] +
F3[2][1] * pY[SubWidthC * x + 1][-SubHeightC] +
F3[1][2] * pY[SubWidthC * x][1 - SubHeightC] + 4) >> 3 (376)
- 그렇지 않으면(bCTUboundary가 TRUE이면), 다음이 적용된다:
pSelDsY[idx] = (F2[0] * pY[SubWidthC * x - 1][-1] +
F2[1] * pY[SubWidthC * x][-1] +
F2[2] * pY[SubWidthC * x + 1][-1] + 2) >> 2 (377)
- 그렇지 않으면(sps_chroma_vertical_collocated_flag이 0이면), 다음이 적용된다:
- bCTUboundary가 FALSE이면, 다음이 적용된다:
pSelDsY[idx] = (F4[0][1] * pY[SubWidthC * x - 1][-1] +
F4[0][2] * pY[SubWidthC * x - 1][-2] +
F4[1][1] * pY[SubWidthC * x][-1] +
F4[1][2] * pY[SubWidthC * x][-2] +
F4[2][1] * pY[SubWidthC * x + 1][-1] +
F4[2][2] * pY[SubWidthC * x + 1][-2] + 4) >> 3(378)
- 그렇지 않으면(bCTUboundary가 TRUE이면), 다음이 적용된다:
pSelDsY[idx] = (F2[0] * pY[SubWidthC * x - 1][-1] +
F2[1] * pY[SubWidthC * x][-1] +
F2[2] * pY[SubWidthC * x + 1][-1] + 2) >> 2 (379)
6. cntT + cntL이 0이 아니면, 변수 minY, maxY, minC, 및 maxC들이 다음과 같이 유도된다:
- cntT + cntL가 2이면, pSelComp[3]이 pSelComp[0]와 같게 설정되고, pSelComp[2]가 pSelComp[1]와 같게 설정되며, pSelComp[0]이 pSelComp[1]와 같게 설정되고, 그리고 pSelComp[1]가 pSelComp[3]와 같게 설정되는데 여기서 Comp는 DsY 및 C로 치환된다.
- 행렬 minGrpIdx 및 maxGrpIdx들은 다음과 같이 유도된다:
minGrpIdx[0] = 0 (380)
minGrpIdx[1] = 2 (381)
maxGrpIdx[0] = 1 (382)
maxGrpIdx[1] = 3 (383)
- pSelDsY[minGrpIdx[0]]이 pSelDsY[minGrpIdx[1]]보다 크면, minGrpIdx[0]과 minGrpIdx[1]들이 다음과 같이 스왑된다(swapped):
(minGrpIdx[0], minGrpIdx[1]) = Swap(minGrpIdx[0], minGrpIdx[1]) (384)
- pSelDsY[maxGrpIdx[0]]이 pSelDsY[maxGrpIdx[1]]보다 크면, maxGrpIdx[0]과 maxGrpIdx[1]들이 다음과 같이 스왑된다:
(maxGrpIdx[0], maxGrpIdx[1]) = Swap(maxGrpIdx[0], maxGrpIdx[1]) (385)
- pSelDsY[minGrpIdx[0]]이 pSelDsY[maxGrpIdx[1]]보다 크면, 행렬 minGrpIdx와 maxGrpIdx들이 다음과 같이 스왑된다:
(minGrpIdx, maxGrpIdx) = Swap(minGrpIdx, maxGrpIdx) (386)
- pSelDsY[minGrpIdx[1]]이 pSelDsY[maxGrpIdx[0]]보다 크면, minGrpIdx[1]와 maxGrpIdx[0]들이 다음과 같이 스왑된다:
(minGrpIdx[1], maxGrpIdx[0]) = Swap(minGrpIdx[1], maxGrpIdx[0]) (387)
- 변수 maxY, maxC, minY, 및 minC들은 다음과 같이 유도된다:
maxY = (pSelDsY[maxGrpIdx[0]] + pSelDsY[maxGrpIdx[1]] + 1) >> 1 (388)
maxC = (pSelC[maxGrpIdx[0]] + pSelC[maxGrpIdx[1]] + 1) >> 1 (389)
minY = (pSelDsY[minGrpIdx[0]] + pSelDsY[minGrpIdx[1]] + 1) >> 1 (390)
minC = (pSelC[minGrpIdx[0]] + pSelC[minGrpIdx[1]] + 1) >> 1 (391)
7. 변수 a, b, 및 k들은 다음과 같이 유도된다:
- numSampL이 0이고, numSampT가 0이면 다음이 적용된다:
k = 0 (392)
a = 0 (393)
b = 1 << (BitDepth - 1) (394)
- 그렇지 않으면 다음이 적용된다:
diff = maxY - minY (395)
- diff가 0이 아니면, 다음이 적용된다:
diffC = maxC - minC (396)
x = Floor(Log2(diff)) (397)
normDiff = ((diff << 4) >> x) & 15 (398)
x += (normDiff ! = 0) ? 1 : 0 (399)
y = Abs(diffC) > 0 ? Floor(Log2(Abs(diffC))) + 1 : 0 (400)
a = (diffC * (divSigTable[normDiff] | 8) + 2y - 1) >> y (401)
k = ((3 + x - y) < 1) 1 : 3 + x - y (402)
a = ((3 + x - y) < 1) ? Sign(a) * 15 : a (403)
b = minC - ((a * minY) >> k) (404)
여기서 divSigTable[ ]은 다음과 같이 명시된다:
divSigTable[ ] = { 0, 7, 6, 5, 5, 4, 4, 3, 3, 2, 2, 1, 1, 1, 1, 0 } (405)
- 그렇지 않으면(diff가 0이면), 다음이 적용된다:
k = 0 (406)
a = 0 (407)
b = minC (408)
8. 예측 샘플 predSamples[x][y](여기서 x = 0... nTbW - 1, y = 0... nTbH - 1)들은 다음과 같이 유도된다:
predSamples[x][y] = Clip1(((pDsY[x][y] * a) >> k) + b) (409)
참고(NOTE) - 이 프로세스는 sps_chroma_vertical_collocated_flag을 사용한다. 그러니 구현을 간략화하기 위해 sps_chroma_horizontal_collocated_flag을 사용하지 않는다.
5.11. 실시예 11(Embodiment 11)
JVET-Q2001-vE에 명시된 작업 초안은 다음과 같이 변경될 수 있다.
8.4.5.2.13
JVET-Q2001-vE에 명시된 작업 초안은 다음과 같이 변경될 수 있다.
이 프로세스에 대한 입력들은:
- 인트라 예측 모드 predModeIntra,
- 현재 픽처의 상-좌 샘플에 대한 현재 변환 블록의 상좌 샘플의 샘플 위치(xTbC, yTbC),
- 변환 블록 폭을 명시하는 변수 nTbW,
- 변환 블록 높이를 명시하는 변수 nTbH,
- 현재 블록의 색상 성분을 명시하는 변수 cIdx,
- 크로마 이웃 샘플들 p[x][y], 여기서 x = -1, y = 0... 2 * nTbH - 1 및 x = 0... 2 * nTbW - 1, y = -1.
이 프로세스의 출력은 예측된 샘플들 predSamples[x][y]인데, 여기서 x = 0... nTbW - 1, y = 0... nTbH - 1.
현재 루마 위치(xTbY, yTbY)는 다음과 같이 유도된다:
(xTbY, yTbY) = (xTbC<<(SubWidthC - 1), yTbC << (SubHeightC - 1)) (351)
변수 availL, availT, 및 availTL들은 다음과 같이 유도된다:
- 6.4.4 절(clause)에 명시된 바와 같은 인접 블록 사용 가능성에 대한 유도 프로세스는, (xTbY, yTbY)로 설정된 현재 루마 위치(xCurr, yCurr), 이웃 루마 위치 (xTbY - 1, yTbY), FALSE로 설정된 checkPredModeY, 및 cIdx를 입력으로 하여 실행되어지고, 출력은 availL 로 할당된다.
- 6.4.4 절(clause)에 명시된 바와 같은 인접 블록 사용 가능성에 대한 유도 프로세스는, (xTbY, yTbY)로 설정된 현재 루마 위치(xCurr, yCurr), 이웃 루마 위치 (xTbY, yTbY - 1), FALSE로 설정된 checkPredModeY, 및 cIdx를 입력으로 하여 실행되어지고, 출력은 availT 로 할당된다.
[[ - 변수 availTL은 다음과 같이 유도된다:
availTL = availL && availT (352) ]]
- 사용 가능한 상-우 이웃 크로마 샘플들의 수는 다음과 같이 유도된다:
- 변수 numTopRight가 0과 같게 설정되고 availTR이 TRUE와 같게 설정된다.
- predModeIntra가 INTRA_T_CCLM과 같을 때, availTR이 FALSE이거나 x가 2 * nTbW - 1이 될 때까지 다음이 x = nTbW... 2 * nTbW - 1에 적용된다:
- 6.4.4 절(clause)에 명시된 바와 같은 인접 블록 사용 가능성에 대한 유도 프로세스는, (xTbY, yTbY)로 설정된 현재 루마 위치(xCurr, yCurr), 이웃 루마 위치 (xTbY + x, yTbY - 1), FALSE로 설정된 checkPredModeY, 및 cIdx를 입력으로 하여 실행되어지고, 출력은 availTR 로 할당된다.
- availTR이 TRUE일 때, numTopRight가 1만큼 증분된다.
- 사용 가능한 좌-하(left-below) 이웃 크로마 샘플들의 수 numLeftBelow는 다음과 같이 유도된다:
- 변수 numLeftBelow가 0과 같게 설정되고 availLB가 TRUE와 같게 설정된다.
- predModeIntra가 INTRA_L_CCLM일 때, availLB가 FALSE이거나 y가 2 * nTbH - 1이 될 때까지 ekdmaa이 y = nTbH... 2 * nTbH - 1에 적용되고:
- 6.4.4 절(clause)에 명시된 바와 같은 인접 블록 사용 가능성에 대한 유도 프로세스는, (xTbY, yTbY)로 설정된 현재 루마 위치(xCurr, yCurr), 이웃 루마 위치 (xTbY - 1, yTbY + y), FALSE로 설정된 checkPredModeY, 및 cIdx를 입력으로 하여 실행되어지고, 출력은 availLB 로 할당된다.
- availLB가 TRUE일 때, numLeftBelow가 1만큼 증분된다.
상측 및 상-우측 상의 사용 가능한 이웃 크로마 샘플들의 수 numSampT와 좌측 및 좌-하측 상의 사용 가능한 이웃 크로마 샘플들의 수 numSampL은 다음과 같이 유도된다:
- predModeIntra가 INTRA_LT_CCLM이면, 다음이 적용된다:
numSampT = availT ? nTbW : 0 (353)
numSampL = availL ? nTbH : 0 (354)
- 그렇지 않으면 다음이 적용된다:
numSampT = (availT && predModeIntra = = INTRA_T_CCLM) ? (nTbW + Min(numTopRight, nTbH)) : 0 (355)
numSampL = (availL && predModeIntra = = INTRA_L_CCLM) ? (nTbH + Min(numLeftBelow, nTbW)) : 0 (356)
변수 bCTUboundary는 다음과 같이 유도된다:
bCTUboundary = (yTbY & (CtbSizeY - 1) = = 0) ? TRUE : FALSE (357)
변수 cntN와 N이 L 및 T로 치환된 행렬(array) pickPosN은 다음과 같이 유도되는데 :
- 변수 numIs4N은 다음과 같이 유도된다:
numIs4N = ((availT && availL && predModeIntra = = INTRA_LT_CCLM) ? 0 : 1) (358)
- 변수 startPosN이 numSampN >> (2 + numIs4N)과 같게 설정된다.
- 변수 pickStepN 이 Max(1, numSampN >> (1 + numIs4N))과 같게 설정된다.
- availN이 TRUE이고 predModeIntra가 INTRA_LT_CCLM 또는 INTRA_N_CCLM이면, 다음 할당이 이뤄지는데:
- cntN이 Min(numSampN, (1 + numIs4N) << 1)와 같게 설정된다.
- pickPosN[pos]가 (startPosN = pos * pickStepN)와 같게 설정되는데, 여기서 pos = 0... cntN - 1.
- 그렇지 않으면 cntN이 0과 같게 설정된다.
예측 샘플 predSamples[x][y](여기서 x= 0... nTbW - 1, y = 0.. nTbH - 1)들은 다음과 같이 유도된다:
- numSampL 및 numSampT 모두 0이면 다음이 적용된다:
predSamples[x][y] = 1 << (BitDepth - 1) (359)
- 그렇지 않으면 다음 순서의 단계들이 적용된다:
1. 동치(collocated) 루마 샘플 pY[x][y](여기서 x = 0... nTbW * SubWidthC - 1, y = 0... nTbH * SubHeightC - 1)들은 위치(xTbY + x, yTbY + y)들에서의 디블록킹 필터 처리에 앞서 재현된 루마 샘플들과 같게 설정된다.
2. 이웃 루마 샘플 pY[x][y]들은 다음과 같이 유도된다:
- numSampL이 0보다 크면, 이웃 좌측 루마 샘플 pY[x][y](여기서 x = -1... -3, y = 0... SubHeightC*numSampL - 1)들은 위치(xTbY + x, yTbY +y)들에서의 디블록킹 필터 처리 전에 재현 루마 샘플들과 같게 설정된다.
- availT가 FALSE이면, 이웃 상측 루마 샘플 pY[x][y](여기서 x = -1... SubWidthC * numSampT - 1, y = -1... -2)들은 루마 샘플 pY[x][0]들과 같게 설정된다.
- availL이 FALSE이면, 이웃 좌측 루마 샘플 pY[x][y](여기서 x = -1... -3, y = -1... SubHeightC * numSampL - 1)들은 루마 샘플 pY[0][y]들과 같게 설정된다.
- numSampT가 0보다 크면, 이웃 상측 루마 샘플 pY[x][y](여기서 x = 0... SubWidthC * numSampT - 1, y = -1, -2)들은 위치(xTbY + x, yTbY + y)에서의 디블록킹 필터 처리 전에 재현 루마 샘플들과 같게 설정된다.
[[ - availTL이 TRUE이면, 이웃 상-좌 루마 샘플 pY[x][y](여기서 x = -1, y = -1, -2)들은 위치(xTbY + x, yTbY + y)에서의 디블록킹 필터 처리 전에 재현 루마 샘플들과 같게 설정된다. ]]
- availT가 true이면, 이웃 상-좌 루마 샘플 pY[x][y](여기서 x = -1, -2, y = -1, -2)들이 루마 샘플 pY[0][y]들과 같게 설정된다.
- 그렇지 않고 availL이 true이면, 이웃 상-좌 루마 샘플 pY[x][y](여기서 x = -1, -2, y = -1, -2)들이 루마 샘플 pY[x][0]들과 같게 설정된다.
3. 다운샘플링된 동치 루마 샘플 pDsY[x][y](여기서 x = 0... nTbW - 1, y = 0... nTbH - 1)들은 다음과 같이 유도된다:
- SubWidthC 및 SubHeightC 양자 모두 1이면, 다음이 적용된다:
- pDsY[x][y](여기서 x = 1... nTbW - 1, y = 1... nTbH - 1)는 다음과 같이 유도된다:
pDstY[x][y] = pY[x][y] (360)
- 그렇지 않으면 다음이 적용된다:
- 1차원 필터계수 행렬 F1 및 F2와 2차원 필터 계수 행렬 F3 및 F4는 다음과 같이 명시된다:
F1[0] = 2, F1[1] = 0 (361)
F2[0] = 1, F2[1]  = 2, F2[2] = 1 (362)
F3[i][j] = F4[i][j] = 0(여기서 I = 0... 2, j = 0... 2 (363)
- SubWidthC 및 SubHeightC 양자 모두 2이면, 다음이 적용된다:
F1[0] = 1, F1[1] = 1 (364)
F3[0][1] = 1, F3[1][1] = 4, F3[2][1] = 1, F3[1][0] = 1, F3[1][2] = 1 (365)
F4[0][1] = 1, F4[1][1] = 2, F4[2][1] = 1 (366)
F4[0][2] = 1, F4[1][2] = 2, F4[2][2] = 1 (367)
- 그렇지 않으면 다음이 적용된다:
F3[1][1] = 8 (368)
F4[0][1] = 2, F4[1][1] = 4, F4[2][1] = 2, (369)
- sps_chroma_vertical_collocated_flag이 1이면, 다음이 적용된다:
- pDsY[x][y](여기서 x = 0... nTbW - 1, y = 0... nTbH - 1)응 다음과 같이 유도된다:
pDsY[x][y] = (F3[1][0] * pY[SubWidthC * x][SubHeightC * y - 1] + F3[0][1] * pY[SubWidthC * x - 1][SubHeightC * y] +
F3[1][1] * pY[SubWidthC * x][SubHeightC * y] +
F3[2][1] * pY[SubWidthC * x + 1 ][ SubHeightC * y] + F3[1][2] * pY[SubWidthC * x][SubHeightC * y + 1] + 4) >> 3 (370)
- 그렇지 않으면(sps_chroma_vertical_collocated_flag이 0이면), 다음이 적용된다:
- pDsY[x][y](여기서 x = 0... nTbW - 1, y = 0... nTbH - 1)는 다음과 같이 유도된다:
pDsY[x][y] = (F4[0][1] * pY[SubWidthC * x - 1][SubHeightC * y] +
F4[0][2] * pY[SubWidthC * x - 1][SubHeightC * y + 1] +
F4[1][1] * pY[SubWidthC * x][SubHeightC * y] +
F4[1][2] * pY[SubWidthC * x][SubHeightC * y + 1] +
F4[2][1] * pY[SubWidthC * x + 1][SubHeightC * y] +
F4[2][2] * pY[SubWidthC * x + 1][SubHeightC * y + 1] + 4) >> 3 (371)
4. numSampL가 0보다 크면, 선택된 좌측 크로마 샘플 pSelC[idx]들은 p[-1][pickPosL[idx]](여기서 idx = 0... cntL = 1)와 같게 설정되고, 선택된 다운샘플링된 이웃 좌측 루마 샘플 pSelDsY[idx](여기서 idx = 0... cntL - 1)들은 다음과 같이 유도된다:
- 변수 y가 pickPosL[idx]와 같게 설정된다.
- SubWidthC 및 SubHeightC 양자 모두 1이면, 다음이 적용된다:
pSelDsY[idx] = pY[-1][y] (372)
- 그렇지 않으면 다음이 적용된다:
- sps_chroma_vertical_collocated_flag이 1이면 다음이 적용된다:
pSelDsY[idx] = (F3[1][0] * pY[-SubWidthC][SubHeightC * y - 1] +
F3[0][1] * pY[-SubWidthC][SubHeightC * y] +
F3[1][1] * pY[-SubWidthC][SubHeightC * y] +
F3[2][1] * pY[1 - SubWidthC][SubHeightC * y] +
F3[1][2] * pY[-SubWidthC][SubHeightC * y + 1] + 4 ) >> 3 (373)
- 그렇지 않으면(sps_chroma_vertical_collocated_flag이 0이면) 다음이 적용된다:
pSelDsY[idx] = (F4[0][1] * pY[-1 - SubWidthC][SubHeightC * y]+
F4[0][2] * pY[-1 - SubWidthC][SubHeightC * y + 1] +
F4[1][1] * pY[-SubWidthC][SubHeightC * y] +
F4[1][2] * pY[-SubWidthC][SubHeightC * y + 1] +
F4[2][1] * pY[1 - SubWidthC][SubHeightC * y ] +
F4[2][2] * pY[1 - SubWidthC][SubHeightC * y + 1] + 4) >> 3 (374)
5. numSampT가 0보다 크면, 선택된 이웃 상측 크로마 샘플 pSelC[idx]들은 p[pickPosT[idx - cntL]][-1](여기서 idx = cntL... cntL + cntT - 1)과 같게 설정되고, 다운샘플링된 이웃 상측 루마 샘플 pSelDsY[idx](여기서 idx = 0... cntL + cntT - 1)들은 다음과 같이 명시되는데:
- 변수 x는 pickPosT[idx - cntL]와 같게 설정된다.
- SubWidthC 및 SubHeightC 양자 모두 1이면. 다음이 적용된다:
pSelDsY[idx] = pY[x][-1] (375)
- 그렇지 않으면 다음이 적용된다:
- sps_chroma_vertical_collocated_flag이 1이면, 다음이 적용된다:
- bCTUboundary가 FALSE이면, 다음이 적용된다:
pSelDsY[idx] = (F3[1][0] * pY[SubWidthC * x][-1 - SubHeightC]+
F3[0][1] * pY[SubWidthC * x - 1][-SubHeightC] +
F3[1][1] * pY[SubWidthC * x][-SubHeightC] +
F3[2][1] * pY[SubWidthC * x + 1][-SubHeightC] +
F3[1][2] * pY[SubWidthC * x][1 - SubHeightC] + 4) >> 3 (376)
- 그렇지 않으면(bCTUboundary가 TRUE이면), 다음이 적용된다:
pSelDsY[idx] = (F2[0] * pY[SubWidthC * x - 1][-1] +
F2[1] * pY[SubWidthC * x][-1] +
F2[2] * pY[SubWidthC * x + 1][-1] + 2) >> 2 (377)
- 그렇지 않으면(sps_chroma_vertical_collocated_flag이 0이면), 다음이 적용된다:
- bCTUboundary가 FALSE이면, 다음이 적용된다:
pSelDsY[idx] = (F4[0][1] * pY[SubWidthC * x - 1][-1] +
F4[0][2] * pY[SubWidthC * x - 1][-2] +
F4[1][1] * pY[SubWidthC * x][-1] +
F4[1][2] * pY[SubWidthC * x][-2] +
F4[2][1] * pY[SubWidthC * x + 1][-1] +
F4[2][2] * pY[SubWidthC * x + 1][-2] + 4) >> 3(378)
- 그렇지 않으면(bCTUboundary가 TRUE이면), 다음이 적용된다:
pSelDsY[idx] = (F2[0] * pY[SubWidthC * x - 1][-1] +
F2[1] * pY[SubWidthC * x][-1] +
F2[2] * pY[SubWidthC * x + 1][-1] + 2) >> 2 (379)
6. cntT + cntL이 0이 아니면, 변수 minY, maxY, minC, 및 maxC들이 다음과 같이 유도된다:
- cntT + cntL가 2이면, pSelComp[3]이 pSelComp[0]와 같게 설정되고, pSelComp[2]가 pSelComp[1]와 같게 설정되며, pSelComp[0]이 pSelComp[1]와 같게 설정되고, 그리고 pSelComp[1]가 pSelComp[3]와 같게 설정되는데 여기서 Comp는 DsY 및 C로 치환된다.
- 행렬 minGrpIdx 및 maxGrpIdx들은 다음과 같이 유도된다:
minGrpIdx[0] = 0 (380)
minGrpIdx[1] = 2 (381)
maxGrpIdx[0] = 1 (382)
maxGrpIdx[1] = 3 (383)
- pSelDsY[minGrpIdx[0]]이 pSelDsY[minGrpIdx[1]]보다 크면, minGrpIdx[0]과 minGrpIdx[1]들이 다음과 같이 스왑된다(swapped):
(minGrpIdx[0], minGrpIdx[1]) = Swap(minGrpIdx[0], minGrpIdx[1]) (384)
- pSelDsY[maxGrpIdx[0]]이 pSelDsY[maxGrpIdx[1]]보다 크면, maxGrpIdx[0]과 maxGrpIdx[1]들이 다음과 같이 스왑된다:
(maxGrpIdx[0], maxGrpIdx[1]) = Swap(maxGrpIdx[0], maxGrpIdx[1]) (385)
- pSelDsY[minGrpIdx[0]]이 pSelDsY[maxGrpIdx[1]]보다 크면, 행렬 minGrpIdx와 maxGrpIdx들이 다음과 같이 스왑된다:
(minGrpIdx, maxGrpIdx) = Swap(minGrpIdx, maxGrpIdx) (386)
- pSelDsY[minGrpIdx[1]]이 pSelDsY[maxGrpIdx[0]]보다 크면, minGrpIdx[1]와 maxGrpIdx[0]들이 다음과 같이 스왑된다:
(minGrpIdx[1], maxGrpIdx[0]) = Swap(minGrpIdx[1], maxGrpIdx[0]) (387)
- 변수 maxY, maxC, minY, 및 minC들은 다음과 같이 유도된다:
maxY = (pSelDsY[maxGrpIdx[0]] + pSelDsY[maxGrpIdx[1]] + 1) >> 1 (388)
maxC = (pSelC[maxGrpIdx[0]] + pSelC[maxGrpIdx[1]] + 1) >> 1 (389)
minY = (pSelDsY[minGrpIdx[0]] + pSelDsY[minGrpIdx[1]] + 1) >> 1 (390)
minC = (pSelC[minGrpIdx[0]] + pSelC[minGrpIdx[1]] + 1) >> 1 (391)
7. 변수 a, b, 및 k들은 다음과 같이 유도된다:
- numSampL이 0이고, numSampT가 0이면 다음이 적용된다:
k = 0 (392)
a = 0 (393)
b = 1 << (BitDepth - 1) (394)
- 그렇지 않으면 다음이 적용된다:
diff = maxY - minY (395)
- diff가 0이 아니면, 다음이 적용된다:
diffC = maxC - minC (396)
x = Floor(Log2(diff)) (397)
normDiff = ((diff << 4) >> x) & 15 (398)
x += (normDiff ! = 0) ? 1 : 0 (399)
y = Abs(diffC) > 0 ? Floor(Log2(Abs(diffC))) + 1 : 0 (400)
a = (diffC * (divSigTable[normDiff] | 8) + 2y - 1) >> y (401)
k = ((3 + x - y) < 1) 1 : 3 + x - y (402)
a = ((3 + x - y) < 1) ? Sign(a) * 15 : a (403)
b = minC - ((a * minY) >> k) (404)
여기서 divSigTable[ ]은 다음과 같이 명시된다:
divSigTable[ ] = { 0, 7, 6, 5, 5, 4, 4, 3, 3, 2, 2, 1, 1, 1, 1, 0 } (405)
- 그렇지 않으면(diff가 0이면), 다음이 적용된다:
k = 0 (406)
a = 0 (407)
b = minC (408)
8. 예측 샘플 predSamples[x][y](여기서 x = 0... nTbW - 1, y = 0... nTbH - 1)들은 다음과 같이 유도된다:
predSamples[x][y] = Clip1(((pDsY[x][y] * a) >> k) + b) (409)
참고(NOTE) - 이 프로세스는 sps_chroma_vertical_collocated_flag을 사용한다. 그러니 구현을 간략화하기 위해 sps_chroma_horizontal_collocated_flag을 사용하지 않는다.
5.12. 실시예 12(Embodiment 12)
JVET-Q2001-vE에 명시된 작업 초안은 다음과 같이 변경될 수 있다.
8.4.5.2.13
이 프로세스에 대한 입력들은:
- 인트라 예측 모드 predModeIntra,
- 현재 픽처의 상-좌 샘플에 대한 현재 변환 블록의 상좌 샘플의 샘플 위치(xTbC, yTbC),
- 변환 블록 폭을 명시하는 변수 nTbW,
- 변환 블록 높이를 명시하는 변수 nTbH,
- 현재 블록의 색상 성분을 명시하는 변수 cIdx,
- 크로마 이웃 샘플들 p[x][y], 여기서 x = -1, y = 0... 2 * nTbH - 1 및 x = 0... 2 * nTbW - 1, y = -1.
이 프로세스의 출력은 예측된 샘플들 predSamples[x][y]인데, 여기서 x = 0... nTbW - 1, y = 0... nTbH - 1.
현재 루마 위치(xTbY, yTbY)는 다음과 같이 유도된다:
(xTbY, yTbY) = (xTbC<<(SubWidthC - 1), yTbC << (SubHeightC - 1)) (351)
변수 availL, availT, 및 availTL들은 다음과 같이 유도된다:
- 6.4.4 절(clause)에 명시된 바와 같은 인접 블록 사용 가능성에 대한 유도 프로세스는, (xTbY, yTbY)로 설정된 현재 루마 위치(xCurr, yCurr), 이웃 루마 위치 (xTbY - 1, yTbY), FALSE로 설정된 checkPredModeY, 및 cIdx를 입력으로 하여 실행되어지고, 출력은 availL 로 할당된다.
- 6.4.4 절(clause)에 명시된 바와 같은 인접 블록 사용 가능성에 대한 유도 프로세스는, (xTbY, yTbY)로 설정된 현재 루마 위치(xCurr, yCurr), 이웃 루마 위치 (xTbY, yTbY - 1), FALSE로 설정된 checkPredModeY, 및 cIdx를 입력으로 하여 실행되어지고, 출력은 availT 로 할당된다.
- 변수 availTL은 다음과 같이 유도된다:
availTL = availL && availT (352)
- 사용 가능한 상-우 이웃 크로마 샘플들의 수는 다음과 같이 유도된다:
- 변수 numTopRight가 0과 같게 설정되고 availTR이 TRUE와 같게 설정된다.
- predModeIntra가 INTRA_T_CCLM과 같을 때, availTR이 FALSE이거나 x가 2 * nTbW - 1이 될 때까지 다음이 x = nTbW... 2 * nTbW - 1에 적용된다:
- 6.4.4 절(clause)에 명시된 바와 같은 인접 블록 사용 가능성에 대한 유도 프로세스는, (xTbY, yTbY)로 설정된 현재 루마 위치(xCurr, yCurr), 이웃 루마 위치 (xTbY + x, yTbY - 1), FALSE로 설정된 checkPredModeY, 및 cIdx를 입력으로 하여 실행되어지고, 출력은 availTR 로 할당된다.
- availTR이 TRUE일 때, numTopRight가 1만큼 증분된다.
- 사용 가능한 좌-하(left-below) 이웃 크로마 샘플들의 수 numLeftBelow는 다음과 같이 유도된다:
- 변수 numLeftBelow가 0과 같게 설정되고 availLB가 TRUE와 같게 설정된다.
- predModeIntra가 INTRA_L_CCLM일 때, availLB가 FALSE이거나 y가 2 * nTbH - 1이 될 때까지 다음이 y = nTbH... 2 * nTbH - 1에 적용되고:
- 6.4.4 절(clause)에 명시된 바와 같은 인접 블록 사용 가능성에 대한 유도 프로세스는, (xTbY, yTbY)로 설정된 현재 루마 위치(xCurr, yCurr), 이웃 루마 위치 (xTbY - 1, yTbY + y), FALSE로 설정된 checkPredModeY, 및 cIdx를 입력으로 하여 실행되어지고, 출력은 availLB 로 할당된다.
- availLB가 TRUE일 때, numLeftBelow가 1만큼 증분된다.
상측 및 상-우측 상의 사용 가능한 이웃 크로마 샘플들의 수 numSampT와 좌측 및 좌-하측 상의 사용 가능한 이웃 크로마 샘플들의 수 numSampL은 다음과 같이 유도된다:
- predModeIntra가 INTRA_LT_CCLM이면, 다음이 적용된다:
numSampT = availT ? nTbW : 0 (353)
numSampL = availL ? nTbH : 0 (354)
- 그렇지 않으면 다음이 적용된다:
numSampT = (availT && predModeIntra = = INTRA_T_CCLM) ? (nTbW + Min(numTopRight, nTbH)) : 0 (355)
numSampL = (availL && predModeIntra = = INTRA_L_CCLM) ? (nTbH + Min(numLeftBelow, nTbW)) : 0 (356)
변수 bCTUboundary는 다음과 같이 유도된다:
bCTUboundary = (yTbY & (CtbSizeY - 1) = = 0) ? TRUE : FALSE (357)
변수 cntN와 N이 L 및 T로 치환된 행렬(array) pickPosN은 다음과 같이 유도된다 :
- 변수 numIs4N은 다음과 같이 유도된다:
numIs4N = ((availT && availL && predModeIntra = = INTRA_LT_CCLM) ? 0 : 1) (358)
- 변수 startPosN이 numSampN >> (2 + numIs4N)과 같게 설정된다.
- 변수 pickStepN 이 Max(1, numSampN >> (1 + numIs4N))과 같게 설정된다.
- availN이 TRUE이고 predModeIntra가 INTRA_LT_CCLM 또는 INTRA_N_CCLM이면, 다음 할당이 이뤄지는데:
- cntN이 Min(numSampN, (1 + numIs4N) << 1)와 같게 설정된다.
- pickPosN[pos]가 (startPosN = pos * pickStepN)와 같게 설정되는데, 여기서 pos = 0... cntN - 1.
- 그렇지 않으면 cntN이 0과 같게 설정된다.
예측 샘플 predSamples[x][y](여기서 x= 0... nTbW - 1, y = 0.. nTbH - 1)들은 다음과 같이 유도된다:
- numSampL 및 numSampT 모두 0이면 다음이 적용된다:
predSamples[x][y] = 1 << (BitDepth - 1) (359)
- 그렇지 않으면 다음 순서의 단계들이 적용된다:
1. 동치(collocated) 루마 샘플 pY[x][y](여기서 x = 0... nTbW * SubWidthC - 1, y = 0... nTbH * SubHeightC - 1)들은 위치(xTbY + x, yTbY + y)들에서의 디블록킹 필터 처리에 앞서 재현된 루마 샘플들과 같게 설정된다.
2. 이웃 루마 샘플 pY[x][y]들은 다음과 같이 유도된다:
- numSampL이 0보다 크면, 이웃 좌측 루마 샘플 pY[x][y](여기서 x = -1... -3, y = 0... SubHeightC*numSampL - 1)들은 위치(xTbY + x, yTbY +y)들에서의 디블록킹 필터 처리 전에 재현 루마 샘플들과 같게 설정된다.
- availT가 FALSE이면, 이웃 상측 루마 샘플 pY[x][y](여기서 x = -1... SubWidthC * numSampT - 1, y = -1... -2)들은 루마 샘플 pY[x][0]들과 같게 설정된다.
- availL이 FALSE이면, 이웃 좌측 루마 샘플 pY[x][y](여기서 x = -1... -3, y = -1... SubHeightC * numSampL - 1)들은 루마 샘플 pY[0][y]들과 같게 설정된다.
- numSampT가 0보다 크면, 이웃 상측 루마 샘플 pY[x][y](여기서 x = 0... SubWidthC * numSampT - 1, y = -1, -[[2]] 3 )들은 위치(xTbY + x, yTbY + y)에서의 디블록킹 필터 처리 전에 재현 루마 샘플들과 같게 설정된다.
- availTL이 TRUE이면, 이웃 상-좌 루마 샘플 pY[x][y](여기서 x = -1,  -2, y = -1, -2)들은 위치(xTbY + x, yTbY + y)에서의 디블록킹 필터 처리 전에 재현 루마 샘플들과 같게 설정된다.
3. 다운샘플링된 동치 루마 샘플 pDsY[x][y](여기서 x = 0... nTbW - 1, y = 0... nTbH - 1)들은 다음과 같이 유도된다:
- SubWidthC 및 SubHeightC 양자 모두 1이면, 다음이 적용된다:
- pDsY[x][y](여기서 x = 1... nTbW - 1, y = 1... nTbH - 1)는 다음과 같이 유도된다:
pDstY[x][y] = pY[x][y] (360)
- 그렇지 않으면 다음이 적용된다:
- 1차원 필터계수 행렬 F1 및 F2와 2차원 필터 계수 행렬 F3 및 F4는 다음과 같이 명시된다:
F1[0] = 2, F1[1] = 0 (361)
F2[0] = 1, F2[1]  = 2, F2[2] = 1 (362)
F3[i][j] = F4[i][j] = 0(여기서 I = 0... 2, j = 0... 2 (363)
- SubWidthC 및 SubHeightC 양자 모두 2이면, 다음이 적용된다:
F1[0] = 1, F1[1] = 1 (364)
F3[0][1] = 1, F3[1][1] = 4, F3[2][1] = 1, F3[1][0] = 1, F3[1][2] = 1 (365)
F4[0][1] = 1, F4[1][1] = 2, F4[2][1] = 1 (366)
F4[0][2] = 1, F4[1][2] = 2, F4[2][2] = 1 (367)
- 그렇지 않으면 다음이 적용된다:
F3[1][1] = 8 (368)
F4[0][1] = 2, F4[1][1] = 4, F4[2][1] = 2, (369)
- sps_chroma_vertical_collocated_flag이 1이면, 다음이 적용된다:
- pDsY[x][y](여기서 x = 0... nTbW - 1, y = 0... nTbH - 1)응 다음과 같이 유도된다:
pDsY[x][y] = (F3[1][0] * pY[SubWidthC * x][SubHeightC * y - 1] + F3[0][1] * pY[SubWidthC * x - 1][SubHeightC * y] +
F3[1][1] * pY[SubWidthC * x][SubHeightC * y] +
F3[2][1] * pY[SubWidthC * x + 1 ][ SubHeightC * y] + F3[1][2] * pY[SubWidthC * x][SubHeightC * y + 1] + 4) >> 3 (370)
- 그렇지 않으면(sps_chroma_vertical_collocated_flag이 0이면), 다음이 적용된다:
- pDsY[x][y](여기서 x = 0... nTbW - 1, y = 0... nTbH - 1)는 다음과 같이 유도된다:
pDsY[x][y] = (F4[0][1] * pY[SubWidthC * x - 1][SubHeightC * y] +
F4[0][2] * pY[SubWidthC * x - 1][SubHeightC * y + 1] +
F4[1][1] * pY[SubWidthC * x][SubHeightC * y] +
F4[1][2] * pY[SubWidthC * x][SubHeightC * y + 1] +
F4[2][1] * pY[SubWidthC * x + 1][SubHeightC * y] +
F4[2][2] * pY[SubWidthC * x + 1][SubHeightC * y + 1] + 4) >> 3 (371)
4. numSampL가 0보다 크면, 선택된 좌측 크로마 샘플 pSelC[idx]들은 p[-1][pickPosL[idx]](여기서 idx = 0... cntL = 1)와 같게 설정되고, 선택된 다운샘플링된 이웃 좌측 루마 샘플 pSelDsY[idx](여기서 idx = 0... cntL - 1)들은 다음과 같이 유도된다:
- 변수 y가 pickPosL[idx]와 같게 설정된다.
- SubWidthC 및 SubHeightC 양자 모두 1이면, 다음이 적용된다:
pSelDsY[idx] = pY[-1][y] (372)
- 그렇지 않으면 다음이 적용된다:
- sps_chroma_vertical_collocated_flag이 1이면 다음이 적용된다:
pSelDsY[idx] = (F3[1][0] * pY[-SubWidthC][SubHeightC * y - 1] +
F3[0][1] * pY[-SubWidthC][SubHeightC * y] +
F3[1][1] * pY[-SubWidthC][SubHeightC * y] +
F3[2][1] * pY[1 - SubWidthC][SubHeightC * y] +
F3[1][2] * pY[-SubWidthC][SubHeightC * y + 1] + 4 ) >> 3 (373)
- 그렇지 않으면(sps_chroma_vertical_collocated_flag이 0이면) 다음이 적용된다:
pSelDsY[idx] = (F4[0][1] * pY[-1 - SubWidthC][SubHeightC * y]+
F4[0][2] * pY[-1 - SubWidthC][SubHeightC * y + 1] +
F4[1][1] * pY[-SubWidthC][SubHeightC * y] +
F4[1][2] * pY[-SubWidthC][SubHeightC * y + 1] +
F4[2][1] * pY[1 - SubWidthC][SubHeightC * y ] +
F4[2][2] * pY[1 - SubWidthC][SubHeightC * y + 1] + 4) >> 3 (374)
5. numSampT가 0보다 크면, 선택된 이웃 상측 크로마 샘플 pSelC[idx]들은 p[pickPosT[idx - cntL]][-1](여기서 idx = cntL... cntL + cntT - 1)과 같게 설정되고, 다운샘플링된 이웃 상측 루마 샘플 pSelDsY[idx](여기서 idx = 0... cntL + cntT - 1)들은 다음과 같이 명시되는데:
- 변수 x는 pickPosT[idx - cntL]와 같게 설정된다.
- SubWidthC 및 SubHeightC 양자 모두 1이면. 다음이 적용된다:
pSelDsY[idx] = pY[x][-1] (375)
- 그렇지 않으면 다음이 적용된다:
- sps_chroma_vertical_collocated_flag이 1이면, 다음이 적용된다:
- bCTUboundary가 FALSE이면, 다음이 적용된다:
pSelDsY[idx] = (F3[1][0] * pY[SubWidthC * x][-1 - SubHeightC]+
F3[0][1] * pY[SubWidthC * x - 1][-SubHeightC] +
F3[1][1] * pY[SubWidthC * x][-SubHeightC] +
F3[2][1] * pY[SubWidthC * x + 1][-SubHeightC] +
F3[1][2] * pY[SubWidthC * x][1 - SubHeightC] + 4) >> 3 (376)
- 그렇지 않으면(bCTUboundary가 TRUE이면), 다음이 적용된다:
pSelDsY[idx] = (F2[0] * pY[SubWidthC * x - 1][-1] +
F2[1] * pY[SubWidthC * x][-1] +
F2[2] * pY[SubWidthC * x + 1][-1] + 2) >> 2 (377)
- 그렇지 않으면(sps_chroma_vertical_collocated_flag이 0이면), 다음이 적용된다:
- bCTUboundary가 FALSE이면, 다음이 적용된다:
pSelDsY[idx] = (F4[0][1] * pY[SubWidthC * x - 1][-1] +
F4[0][2] * pY[SubWidthC * x - 1][-2] +
F4[1][1] * pY[SubWidthC * x][-1] +
F4[1][2] * pY[SubWidthC * x][-2] +
F4[2][1] * pY[SubWidthC * x + 1][-1] +
F4[2][2] * pY[SubWidthC * x + 1][-2] + 4) >> 3(378)
- 그렇지 않으면(bCTUboundary가 TRUE이면), 다음이 적용된다:
pSelDsY[idx] = (F2[0] * pY[SubWidthC * x - 1][-1] +
F2[1] * pY[SubWidthC * x][-1] +
F2[2] * pY[SubWidthC * x + 1][-1] + 2) >> 2 (379)
6. cntT + cntL이 0이 아니면, 변수 minY, maxY, minC, 및 maxC들이 다음과 같이 유도된다:
- cntT + cntL가 2이면, pSelComp[3]이 pSelComp[0]와 같게 설정되고, pSelComp[2]가 pSelComp[1]와 같게 설정되며, pSelComp[0]이 pSelComp[1]와 같게 설정되고, 그리고 pSelComp[1]가 pSelComp[3]와 같게 설정되는데 여기서 Comp는 DsY 및 C로 치환된다.
- 행렬 minGrpIdx 및 maxGrpIdx들은 다음과 같이 유도된다:
minGrpIdx[0] = 0 (380)
minGrpIdx[1] = 2 (381)
maxGrpIdx[0] = 1 (382)
maxGrpIdx[1] = 3 (383)
- pSelDsY[minGrpIdx[0]]이 pSelDsY[minGrpIdx[1]]보다 크면, minGrpIdx[0]과 minGrpIdx[1]들이 다음과 같이 스왑된다(swapped):
(minGrpIdx[0], minGrpIdx[1]) = Swap(minGrpIdx[0], minGrpIdx[1]) (384)
- pSelDsY[maxGrpIdx[0]]이 pSelDsY[maxGrpIdx[1]]보다 크면, maxGrpIdx[0]과 maxGrpIdx[1]들이 다음과 같이 스왑된다:
(maxGrpIdx[0], maxGrpIdx[1]) = Swap(maxGrpIdx[0], maxGrpIdx[1]) (385)
- pSelDsY[minGrpIdx[0]]이 pSelDsY[maxGrpIdx[1]]보다 크면, 행렬 minGrpIdx와 maxGrpIdx들이 다음과 같이 스왑된다:
(minGrpIdx, maxGrpIdx) = Swap(minGrpIdx, maxGrpIdx) (386)
- pSelDsY[minGrpIdx[1]]이 pSelDsY[maxGrpIdx[0]]보다 크면, minGrpIdx[1]와 maxGrpIdx[0]들이 다음과 같이 스왑된다:
(minGrpIdx[1], maxGrpIdx[0]) = Swap(minGrpIdx[1], maxGrpIdx[0]) (387)
- 변수 maxY, maxC, minY, 및 minC들은 다음과 같이 유도된다:
maxY = (pSelDsY[maxGrpIdx[0]] + pSelDsY[maxGrpIdx[1]] + 1) >> 1 (388)
maxC = (pSelC[maxGrpIdx[0]] + pSelC[maxGrpIdx[1]] + 1) >> 1 (389)
minY = (pSelDsY[minGrpIdx[0]] + pSelDsY[minGrpIdx[1]] + 1) >> 1 (390)
minC = (pSelC[minGrpIdx[0]] + pSelC[minGrpIdx[1]] + 1) >> 1 (391)
7. 변수 a, b, 및 k들은 다음과 같이 유도된다:
- numSampL이 0이고, numSampT가 0이면 다음이 적용된다:
k = 0 (392)
a = 0 (393)
b = 1 << (BitDepth - 1) (394)
- 그렇지 않으면 다음이 적용된다:
diff = maxY - minY (395)
- diff가 0이 아니면, 다음이 적용된다:
diffC = maxC - minC (396)
x = Floor(Log2(diff)) (397)
normDiff = ((diff << 4) >> x) & 15 (398)
x += (normDiff ! = 0) ? 1 : 0 (399)
y = Abs(diffC) > 0 ? Floor(Log2(Abs(diffC))) + 1 : 0 (400)
a = (diffC * (divSigTable[normDiff] | 8) + 2y - 1) >> y (401)
k = ((3 + x - y) < 1) 1 : 3 + x - y (402)
a = ((3 + x - y) < 1) ? Sign(a) * 15 : a (403)
b = minC - ((a * minY) >> k) (404)
여기서 divSigTable[ ]은 다음과 같이 명시된다:
divSigTable[ ] = { 0, 7, 6, 5, 5, 4, 4, 3, 3, 2, 2, 1, 1, 1, 1, 0 } (405)
- 그렇지 않으면(diff가 0이면), 다음이 적용된다:
k = 0 (406)
a = 0 (407)
b = minC (408)
8. 예측 샘플 predSamples[x][y](여기서 x = 0... nTbW - 1, y = 0... nTbH - 1)들은 다음과 같이 유도된다:
predSamples[x][y] = Clip1(((pDsY[x][y] * a) >> k) + b) (409)
참고(NOTE) - 이 프로세스는 sps_chroma_vertical_collocated_flag을 사용한다. 그러니 구현을 간략화하기 위해 sps_chroma_horizontal_collocated_flag을 사용하지 않는다.
5.13. 실시예 13(Embodiment 13)
JVET-Q2001-vE에 명시된 작업 초안이 다음과 같이 변경될 수 있다
8.4.5.2.13 INTRA_LT_CCLM, INTRA_L_CCLM and INTRA_T_CCLM 인트라 예측 모드의 사양(Specification of INTRA_LT_CCLM, INTRA_L_CCLM and INTRA_T_CCLM intra prediction mode)
예측 샘플 predSamples[x][y](여기서 x = 0... nTbW - 1, y = 0... nTbH - 1)들이 다음과 같이 유도된다:
- numSampL 및 numSampT 양자 모두 0이면, 다음이 적용된다:
predSamples[x][y] = 1 << (BitDepth - 1) (359)
- 그렇지 않으면 다음 순서의 단계들이 적용된다:
1. 동치(collocated) 루마 샘플 pY[x][y](여기서 x = 0... nTbW * SubWidthC - 1, y = 0... nTbH * SubHeightC - 1)들은 위치(xTbY + x, yTbY + y)들에서의 디블록킹 필터 처리에 앞서 재현된 루마 샘플들과 같게 설정된다.
2. 이웃 루마 샘플 pY[x][y]들은 다음과 같이 유도된다:
- numSampL이 0보다 크면, 이웃 좌측 루마 샘플 pY[x][y](여기서 x = -1... -3, y = 0... SubHeightC*numSampL - 1)들은 위치(xTbY + x, yTbY +y)들에서의 디블록킹 필터 처리 전에 재현 루마 샘플들과 같게 설정된다.
- availT가 FALSE이면, 이웃 상측 루마 샘플 pY[x][y](여기서 x = -[[1]] SubWidthC ... SubWidthC * [[numSampT]] nTbW - 1, y = -1... -2)들은 루마 샘플 pY[x][0]들과 같게 설정된다.
- availL이 FALSE이면, 이웃 좌측 루마 샘플 pY[x][y](여기서 x = -1... -3, y = -1... SubHeightC * numSampL - 1)들은 루마 샘플 pY[0][y]들과 같게 설정된다.
- numSampT가 0보다 크면, 이웃 상측 루마 샘플 pY[x][y](여기서 x = 0... SubWidthC * numSampT - 1, y = -1, -2)들은 위치(xTbY + x, yTbY + y)에서의 디블록킹 필터 처리 전에 재현 루마 샘플들과 같게 설정된다.
- availTL이 TRUE이면, 이웃 상-좌 루마 샘플 pY[x][y](여기서 x = -1, y = -1, -2)들은 위치(xTbY + x, yTbY + y)에서의 디블록킹 필터 처리 전에 재현 루마 샘플들과 같게 설정된다.
5.14. 실시예 14(Embodiment 14)
JVET-Q2001-vE에 명시된 작업 초안이 다음과 같이 변경될 수 있다
8.4.5.2.13 INTRA_LT_CCLM, INTRA_L_CCLM and INTRA_T_CCLM 인트라 예측 모드의 사양(Specification of INTRA_LT_CCLM, INTRA_L_CCLM and INTRA_T_CCLM intra prediction mode)
예측 샘플 predSamples[x][y](여기서 x = 0... nTbW - 1, y = 0... nTbH - 1)들이 다음과 같이 유도된다:
- numSampL 및 numSampT 양자 모두 0이면, 다음이 적용된다:
predSamples[x][y] = 1 << (BitDepth - 1) (359)
- 그렇지 않으면 다음 순서의 단계들이 적용된다:
1. 동치(collocated) 루마 샘플 pY[x][y](여기서 x = 0... nTbW * SubWidthC - 1, y = 0... nTbH * SubHeightC - 1)들은 위치(xTbY + x, yTbY + y)들에서의 디블록킹 필터 처리에 앞서 재현된 루마 샘플들과 같게 설정된다.
2. 이웃 루마 샘플 pY[x][y]들은 다음과 같이 유도된다:
- numSampL이 0보다 크면, 이웃 좌측 루마 샘플 pY[x][y](여기서 x = -1... -3, y = 0... SubHeightC*numSampL - 1)들은 위치(xTbY + x, yTbY +y)들에서의 디블록킹 필터 처리 전에 재현 루마 샘플들과 같게 설정된다.
- availT가 FALSE이 sps_chroma_vertical_collocated_flag이 0이면 , 이웃 상측 루마 샘플 pY[x][y](여기서 x = -[[1]] SubWidthC ... SubWidthC * [[numSampT]] nTbW - 1, y = -1... -2)들은 루마 샘플 pY[x][0]들과 같게 설정된다.
- availL이 FALSE이면, 이웃 좌측 루마 샘플 pY[x][y](여기서 x = -1... -3, y = -1... SubHeightC * numSampL - 1)들은 루마 샘플 pY[0][y]들과 같게 설정된다.
- numSampT가 0보다 크면, 이웃 상측 루마 샘플 pY[x][y](여기서 x = 0... SubWidthC * numSampT - 1, y = -1, -2)들은 위치(xTbY + x, yTbY + y)에서의 디블록킹 필터 처리 전에 재현 루마 샘플들과 같게 설정된다.
- availTL이 TRUE이면, 이웃 상-좌 루마 샘플 pY[x][y](여기서 x = -1, y = -1, -2)들은 위치(xTbY + x, yTbY + y)에서의 디블록킹 필터 처리 전에 재현 루마 샘플들과 같게 설정된다.
5.15. 실시예 15(Embodiment 15)
JVET-Q2001-vE9에 명시된 작업 초안이 다음과 같이 변경될 수 있다
8.4.5.2.13 INTRA_LT_CCLM, INTRA_L_CCLM and INTRA_T_CCLM 인트라 예측 모드의 사양(Specification of INTRA_LT_CCLM, INTRA_L_CCLM and INTRA_T_CCLM intra prediction mode)
예측 샘플 predSamples[x][y](여기서 x = 0... nTbW - 1, y = 0... nTbH - 1)들이 다음과 같이 유도된다:
- numSampL 및 numSampT 양자 모두 0이면, 다음이 적용된다:
predSamples[x][y] = 1 << (BitDepth - 1) (359)
- 그렇지 않으면 다음 순서의 단계들이 적용된다:
1. 동치(collocated) 루마 샘플 pY[x][y](여기서 x = 0... nTbW * SubWidthC - 1, y = 0... nTbH * SubHeightC - 1)들은 위치(xTbY + x, yTbY + y)들에서의 디블록킹 필터 처리에 앞서 재현된 루마 샘플들과 같게 설정된다.
2. 이웃 루마 샘플 pY[x][y]들은 다음과 같이 유도된다:
- numSampL이 0보다 크면, 이웃 좌측 루마 샘플 pY[x][y](여기서 x = -1... -3, y = 0... SubHeightC*numSampL - 1)들은 위치(xTbY + x, yTbY +y)들에서의 디블록킹 필터 처리 전에 재현 루마 샘플들과 같게 설정된다.
- availT가 FALSE이면, 이웃 상측 루마 샘플 pY[x][y](여기서 x = -1... SubWidthC * numSampT - 1, y = -1... -2)들은 루마 샘플 pY[x][0]들과 같게 설정된다.
- availL이 FALSE이면, 이웃 좌측 루마 샘플 pY[x][y](여기서 x = -1... -3, y = -[[1]] SubHeightC ... SubHeightC * [[numSampL]] nTbH - 1)들은 루마 샘플 pY[0][y]들과 같게 설정된다.
- numSampT가 0보다 크면, 이웃 상측 루마 샘플 pY[x][y](여기서 x = 0... SubWidthC * numSampT - 1, y = -1, -2)들은 위치(xTbY + x, yTbY + y)에서의 디블록킹 필터 처리 전에 재현 루마 샘플들과 같게 설정된다.
- availTL이 TRUE이면, 이웃 상-좌 루마 샘플 pY[x][y](여기서 x = -1, y = -1, -2)들은 위치(xTbY + x, yTbY + y)에서의 디블록킹 필터 처리 전에 재현 루마 샘플들과 같게 설정된다.
5.16. 실시예 16(Embodiment 16)
JVET-Q2001-vE에 명시된 작업 초안이 다음과 같이 변경될 수 있다
8.4.5.2.13 INTRA_LT_CCLM, INTRA_L_CCLM and INTRA_T_CCLM 인트라 예측 모드의 사양(Specification of INTRA_LT_CCLM, INTRA_L_CCLM and INTRA_T_CCLM intra prediction mode)
예측 샘플 predSamples[x][y](여기서 x = 0... nTbW - 1, y = 0... nTbH - 1)들이 다음과 같이 유도된다:
- numSampL 및 numSampT 양자 모두 0이면, 다음이 적용된다:
predSamples[x][y] = 1 << (BitDepth - 1) (359)
- 그렇지 않으면 다음 순서의 단계들이 적용된다:
1. 동치(collocated) 루마 샘플 pY[x][y](여기서 x = 0... nTbW * SubWidthC - 1, y = 0... nTbH * SubHeightC - 1)들은 위치(xTbY + x, yTbY + y)들에서의 디블록킹 필터 처리에 앞서 재현된 루마 샘플들과 같게 설정된다.
2. 이웃 루마 샘플 pY[x][y]들은 다음과 같이 유도된다:
- numSampL이 0보다 크면, 이웃 좌측 루마 샘플 pY[x][y](여기서 x = -1... -3, y = 0... SubHeightC*numSampL - 1)들은 위치(xTbY + x, yTbY +y)들에서의 디블록킹 필터 처리 전에 재현 루마 샘플들과 같게 설정된다.
- availT가 FALSE이면, 이웃 상측 루마 샘플 pY[x][y](여기서 x = -1... SubWidthC * numSampT - 1, y = -1... -2)들은 루마 샘플 pY[x][0]들과 같게 설정된다.
- [[availL이 FALSE이면, 이웃 좌측 루마 샘플 pY[x][y](여기서 x = -1... -3, y = -1... SubHeightC * numSampL - 1)들은 루마 샘플 pY[0][y]들과 같게 설정된다.]]
- numSampT가 0보다 크면, 이웃 상측 루마 샘플 pY[x][y](여기서 x = 0... SubWidthC * numSampT - 1, y = -1, -2)들은 위치(xTbY + x, yTbY + y)에서의 디블록킹 필터 처리 전에 재현 루마 샘플들과 같게 설정된다.
- availL이 FALSE이면, 이웃 좌측 루마 샘플 pY[x][y](여기서 x = -1... -3, y = -SubHeightC... SubHeightC * nTbH - 1)들은 루마 샘플 pY[0][y]들과 같게 설정된다.
- availTL이 TRUE이면, 이웃 상-좌 루마 샘플 pY[x][y](여기서 x = -1, y = -1, -2)들은 위치(xTbY + x, yTbY + y)에서의 디블록킹 필터 처리 전에 재현 루마 샘플들과 같게 설정된다.
5.17. 실시예 17(Embodiment 17)
JVET-Q2001-vE에 명시된 작업 초안이 다음과 같이 변경될 수 있다
8.4.5.2.13 INTRA_LT_CCLM, INTRA_L_CCLM and INTRA_T_CCLM 인트라 예측 모드의 사양(Specification of INTRA_LT_CCLM, INTRA_L_CCLM and INTRA_T_CCLM intra prediction mode)
이 프로세스에 대한 입력들은:
- 인트라 예측 모드 predModeIntra,
- 현재 픽처의 상-좌 샘플에 대한 현재 변환 블록의 상좌 샘플의 샘플 위치(xTbC, yTbC),
- 변환 블록 폭을 명시하는 변수 nTbW,
- 변환 블록 높이를 명시하는 변수 nTbH,
- 현재 블록의 색상 성분을 명시하는 변수 cIdx,
- 크로마 이웃 샘플들 p[x][y], 여기서 x = -1, y = 0... 2 * nTbH - 1 및 x = 0... 2 * nTbW - 1, y = -1.
이 프로세스의 출력은 예측된 샘플들 predSamples[x][y]인데, 여기서 x = 0... nTbW - 1, y = 0... nTbH - 1.
현재 루마 위치(xTbY, yTbY)는 다음과 같이 유도된다:
(xTbY, yTbY) = (xTbC<<(SubWidthC - 1), yTbC << (SubHeightC - 1)) (351)
변수 availL, availT, 및 availTL들은 다음과 같이 유도된다:
- 6.4.4 절(clause)에 명시된 바와 같은 인접 블록 사용 가능성에 대한 유도 프로세스는, (xTbY, yTbY)로 설정된 현재 루마 위치(xCurr, yCurr), 이웃 루마 위치 (xTbY - 1, yTbY), FALSE로 설정된 checkPredModeY, 및 cIdx를 입력으로 하여 실행되어지고, 출력은 availL 로 할당된다.
- 6.4.4 절(clause)에 명시된 바와 같은 인접 블록 사용 가능성에 대한 유도 프로세스는, (xTbY, yTbY)로 설정된 현재 루마 위치(xCurr, yCurr), 이웃 루마 위치 (xTbY, yTbY - 1), FALSE로 설정된 checkPredModeY, 및 cIdx를 입력으로 하여 실행되어지고, 출력은 availT 로 할당된다.
- availL이 true이고 availT가 true이면, 다음이 적용된다:
- 6.4.4 절(clause)에 명시된 바와 같은 인접 블록 사용 가능성에 대한 유도 프로세스는, (xTbY, yTbY)로 설정된 현재 루마 위치(xCurr, yCurr), 이웃 루마 위치 (xTbY - 1, yTbY - 1), FALSE로 설정된 checkPredModeY, 및 cIdx를 입력으로 하여 실행되어지고, 출력은 availTL로 할당된다.
- 그렇지 않으면 availTL이 false로 설정된다.
[[ - 변수 availTL은 다음과 같이 유도된다:
availTL = availL && availT (352) ]]
5.18. 실시예 18(Embodiment 18)
JVET-Q2001-vE에 명시된 작업 초안이 다음과 같이 변경될 수 있다
8.4.5.2.13 INTRA_LT_CCLM, INTRA_L_CCLM and INTRA_T_CCLM 인트라 예측 모드의 사양(Specification of INTRA_LT_CCLM, INTRA_L_CCLM and INTRA_T_CCLM intra prediction mode)
예측 샘플 predSamples[x][y](여기서 x = 0... nTbW - 1, y = 0... nTbH - 1)들이 다음과 같이 유도된다:
- numSampL 및 numSampT 양자 모두 0이면, 다음이 적용된다:
predSamples[x][y] = 1 << (BitDepth - 1) (359)
- 그렇지 않으면 다음 순서의 단계들이 적용된다:
1. 동치(collocated) 루마 샘플 pY[x][y](여기서 x = 0... nTbW * SubWidthC - 1, y = 0... nTbH * SubHeightC - 1)들은 위치(xTbY + x, yTbY + y)들에서의 디블록킹 필터 처리에 앞서 재현된 루마 샘플들과 같게 설정된다.
2. 이웃 루마 샘플 pY[x][y]들은 다음과 같이 유도된다:
- numSampL이 0보다 크면, 이웃 좌측 루마 샘플 pY[x][y](여기서 x = -1... -3, y = 0... SubHeightC*numSampL - 1)들은 위치(xTbY + x, yTbY +y)들에서의 디블록킹 필터 처리 전에 재현 루마 샘플들과 같게 설정된다.
- availT가 FALSE이면, 이웃 상측 루마 샘플 pY[x][y](여기서 x = -1... SubWidthC * numSampT - 1, y = -1... -2)들은 루마 샘플 pY[x][0]들과 같게 설정된다.
- [[availL이 FALSE이면, 이웃 좌측 루마 샘플 pY[x][y](여기서 x = -1... -3, y = -1... SubHeightC * numSampL - 1)들은 루마 샘플 pY[0][y]들과 같게 설정된다.]]
- numSampT가 0보다 크면, 이웃 상측 루마 샘플 pY[x][y](여기서 x = 0... SubWidthC * numSampT - 1, y = -1, -2)들은 위치(xTbY + x, yTbY + y)에서의 디블록킹 필터 처리 전에 재현 루마 샘플들과 같게 설정된다.
[[- availTL이 TRUE이면, 이웃 상-좌 루마 샘플 pY[x][y](여기서 x = -1, y = -1, -2)들은 위치(xTbY + x, yTbY + y)에서의 디블록킹 필터 처리 전에 재현 루마 샘플들과 같게 설정된다.]]
- availL 및 availT 양자 모두 TURE이면, 다음이 적용된다:
- availTL이 TRUE이면, 이웃 상-좌 루마 샘플 pY[x][y](여기서 x = -1, -2, y = -1, -2)들이 위치(xTbY+ x, yTbY + y)에서의 디블록킹 필터 프로세스 이전의 재현 루마 샘플들과 같게 설정된다.
- 그렇지 않으면, 이웃 상-좌 루마 샘플 pY[x][y](여기서 x = -1, -2, y = -1, -2)들이 루마 샘플 pY[0][y]들과 같게 설정된다.
5.19. 실시예 19(Embodiment 19)
JVET-P2001-v9에 명시된 작업 초안이 다음과 같이 변경될 수 있다
8.4.5.2.13 INTRA_LT_CCLM, INTRA_L_CCLM and INTRA_T_CCLM 인트라 예측 모드의 사양(Specification of INTRA_LT_CCLM, INTRA_L_CCLM and INTRA_T_CCLM intra prediction mode)
예측 샘플 predSamples[x][y](여기서 x = 0... nTbW - 1, y = 0... nTbH - 1)들이 다음과 같이 유도된다:
- numSampL 및 numSampT 양자 모두 0이면, 다음이 적용된다:
predSamples[x][y] = 1 << (BitDepth - 1) (359)
- 그렇지 않으면 다음 순서의 단계들이 적용된다:
1. 동치(collocated) 루마 샘플 pY[x][y](여기서 x = 0... nTbW * SubWidthC - 1, y = 0... nTbH * SubHeightC - 1)들은 위치(xTbY + x, yTbY + y)들에서의 디블록킹 필터 처리에 앞서 재현된 루마 샘플들과 같게 설정된다.
2. 이웃 루마 샘플 pY[x][y]들은 다음과 같이 유도된다:
- numSampL이 0보다 크면, 이웃 좌측 루마 샘플 pY[x][y](여기서 x = -1... -3, y = 0... SubHeightC*numSampL - 1)들은 위치(xTbY + x, yTbY +y)들에서의 디블록킹 필터 처리 전에 재현 루마 샘플들과 같게 설정된다.
- availT가 FALSE이면, 이웃 상측 루마 샘플 pY[x][y](여기서 x = -1... SubWidthC * numSampT - 1, y = -1... -2)들은 루마 샘플 pY[x][0]들과 같게 설정된다.
- [[availL이 FALSE이면, 이웃 좌측 루마 샘플 pY[x][y](여기서 x = -1... -3, y = -1... SubHeightC * numSampL - 1)들은 루마 샘플 pY[0][y]들과 같게 설정된다.]]
- numSampT가 0보다 크면, 이웃 상측 루마 샘플 pY[x][y](여기서 x = 0... SubWidthC * numSampT - 1, y = -1, -2)들은 위치(xTbY + x, yTbY + y)에서의 디블록킹 필터 처리 전에 재현 루마 샘플들과 같게 설정된다.
[[- availTL이 TRUE이면, 이웃 상-좌 루마 샘플 pY[x][y](여기서 x = -1, y = -1, -2)들은 위치(xTbY + x, yTbY + y)에서의 디블록킹 필터 처리 전에 재현 루마 샘플들과 같게 설정된다.]]
- availL 및 availT 양자 모두 TURE이면, 다음이 적용된다:
- availTL이 TRUE이면, 이웃 상-좌 루마 샘플 pY[x][y](여기서 x = -1, -2, y = -1, -2)들이 위치(xTbY+ x, yTbY + y)에서의 디블록킹 필터 프로세스 이전의 재현 루마 샘플들과 같게 설정된다.
- 그렇지 않으면, 이웃 상-좌 루마 샘플 pY[x][y](여기서 x = -1, -2, y = -1, -2)들이 루마 샘플 pY[x][0]들과 같게 설정된다.
5.20. 실시예 20(Embodiment 20)
JVET-Q2001-vE에 명시된 작업 초안이 다음과 같이 변경될 수 있다
8.4.5.2.13 INTRA_LT_CCLM, INTRA_L_CCLM and INTRA_T_CCLM 인트라 예측 모드의 사양(Specification of INTRA_LT_CCLM, INTRA_L_CCLM and INTRA_T_CCLM intra prediction mode)
이 프로세스에 대한 입력들은:
- 인트라 예측 모드 predModeIntra,
- 현재 픽처의 상-좌 샘플에 대한 현재 변환 블록의 상좌 샘플의 샘플 위치(xTbC, yTbC),
- 변환 블록 폭을 명시하는 변수 nTbW,
- 변환 블록 높이를 명시하는 변수 nTbH,
- 현재 블록의 색상 성분을 명시하는 변수 cIdx,
- 크로마 이웃 샘플들 p[x][y], 여기서 x = -1, y = 0... 2 * nTbH - 1 및 x = 0... 2 * nTbW - 1, y = -1.
이 프로세스의 출력은 예측된 샘플들 predSamples[x][y]인데, 여기서 x = 0... nTbW - 1, y = 0... nTbH - 1.
현재 루마 위치(xTbY, yTbY)는 다음과 같이 유도된다:
(xTbY, yTbY) = (xTbC<<(SubWidthC - 1), yTbC << (SubHeightC - 1)) (351)
변수 availL, availT, 및 availTL들은 다음과 같이 유도된다:
- 6.4.4 절(clause)에 명시된 바와 같은 인접 블록 사용 가능성에 대한 유도 프로세스는, (xTbY, yTbY)로 설정된 현재 루마 위치(xCurr, yCurr), 이웃 루마 위치 (xTbY - 1, yTbY), FALSE로 설정된 checkPredModeY, 및 cIdx를 입력으로 하여 실행되어지고, 출력은 availL 로 할당된다.
- 6.4.4 절(clause)에 명시된 바와 같은 인접 블록 사용 가능성에 대한 유도 프로세스는, (xTbY, yTbY)로 설정된 현재 루마 위치(xCurr, yCurr), 이웃 루마 위치 (xTbY, yTbY - 1), FALSE로 설정된 checkPredModeY, 및 cIdx를 입력으로 하여 실행되어지고, 출력은 availT 로 할당된다.
- SubWidthC 또는 SubHeightC가 2이면 다음이 적용된다:
- 6.4.4 절(clause)에 명시된 바와 같은 인접 블록 사용 가능성에 대한 유도 프로세스는, (xTbY, yTbY)로 설정된 현재 루마 위치(xCurr, yCurr), 이웃 루마 위치 (xTbY - 1, yTbY - 1), FALSE로 설정된 checkPredModeY, 및 cIdx를 입력으로 하여 실행되어지고, 출력은 availTL 로 할당된다.
- 그렇지 않으면 availTL이 false와 같게 설정된다.
[[ - 변수 availTL은 다음과 같이 유도된다:
availTL = availL && availT (352) ]]
,,,
예측 샘플 predSamples[x][y](여기서 x = 0... nTbW - 1, y = 0... nTbH - 1)들은 다음과 같이 유도된다:
- numSampL 및 numSampT 양자 모두 0이면, 다음이 적용된다:
predSamples[x][y] = 1 << (BitDepth - 1) (359)
- 그렇지 않으면 다음 순서의 단계들이 적용된다:
1. 동치(collocated) 루마 샘플 pY[x][y](여기서 x = 0... nTbW * SubWidthC - 1, y = 0... nTbH * SubHeightC - 1)들은 위치(xTbY + x, yTbY + y)들에서의 디블록킹 필터 처리에 앞서 재현된 루마 샘플들과 같게 설정된다.
2. 이웃 루마 샘플 pY[x][y]들은 다음과 같이 유도된다:
- numSampL이 0보다 크면, 이웃 좌측 루마 샘플 pY[x][y](여기서 x = -1... -3, y = 0... SubHeightC*numSampL - 1)들은 위치(xTbY + x, yTbY +y)들에서의 디블록킹 필터 처리 전에 재현 루마 샘플들과 같게 설정된다.
- availT가 FALSE이면, 이웃 상측 루마 샘플 pY[x][y](여기서 x = -1... SubWidthC * numSampT - 1, y = -1... -2)들은 루마 샘플 pY[x][0]들과 같게 설정된다.
- [[availL이 FALSE이면, 이웃 좌측 루마 샘플 pY[x][y](여기서 x = -1... -3, y = -1... SubHeightC * numSampL - 1)들은 루마 샘플 pY[0][y]들과 같게 설정된다.]]
- numSampT가 0보다 크면, 이웃 상측 루마 샘플 pY[x][y](여기서 x = 0... SubWidthC * numSampT - 1, y = -1, -2)들은 위치(xTbY + x, yTbY + y)에서의 디블록킹 필터 처리 전에 재현 루마 샘플들과 같게 설정된다.
- availTL이 TRUE이 고 (SubWidthC 또는 SubHeightC가 2이면) , 이웃 상-좌 루마 샘플 pY[x][y](여기서 x = -1, y = -1, -2)들은 위치(xTbY + x, yTbY + y)에서의 디블록킹 필터 처리 전에 재현 루마 샘플들과 같게 설정된다.
5.21. 실시예 21(Embodiment 21)
JVET-Q2001-vE에 명시된 작업 초안이 다음과 같이 변경될 수 있다
8.4.5.2.13 INTRA_LT_CCLM, INTRA_L_CCLM and INTRA_T_CCLM 인트라 예측 모드의 사양(Specification of INTRA_LT_CCLM, INTRA_L_CCLM and INTRA_T_CCLM intra prediction mode)
예측 샘플 predSamples[x][y](여기서 x = 0... nTbW - 1, y = 0... nTbH - 1)들은 다음과 같이 유도된다:
- numSampL 및 numSampT 양자 모두 0이면, 다음이 적용된다:
predSamples[x][y] = 1 << (BitDepth - 1) (359)
- 그렇지 않으면 다음 순서의 단계들이 적용된다:
1. 동치(collocated) 루마 샘플 pY[x][y](여기서 x = 0... nTbW * SubWidthC - 1, y = 0... nTbH * SubHeightC - 1)들은 위치(xTbY + x, yTbY + y)들에서의 디블록킹 필터 처리에 앞서 재현된 루마 샘플들과 같게 설정된다.
2. 이웃 루마 샘플 pY[x][y]들은 다음과 같이 유도된다:
- numSampL이 0보다 크면, 이웃 좌측 루마 샘플 pY[x][y](여기서 x = -1... -3, y = 0... SubHeightC*numSampL - 1)들은 위치(xTbY + x, yTbY +y)들에서의 디블록킹 필터 처리 전에 재현 루마 샘플들과 같게 설정된다.
- availT가 FALSE이 고 (SubWidthC 또는 SubHeightC가 2이면) , 이웃 상측 루마 샘플 pY[x][y](여기서 x = -1... SubWidthC * numSampT - 1, y = -1... -2)들은 루마 샘플 pY[x][0]들과 같게 설정된다.
- availL이 FALSE이 고 (SubWidthC 또는 SubHeightC가 2이면) , 이웃 좌측 루마 샘플 pY[x][y](여기서 x = -1... -3, y = -1... SubHeightC * numSampL - 1)들은 루마 샘플 pY[0][y]들과 같게 설정된다.
- numSampT가 0보다 크면, 이웃 상측 루마 샘플 pY[x][y](여기서 x = 0... SubWidthC * numSampT - 1, y = -1, -2)들은 위치(xTbY + x, yTbY + y)에서의 디블록킹 필터 처리 전에 재현 루마 샘플들과 같게 설정된다.
- availTL이 TRUE이면, 이웃 상-좌 루마 샘플 pY[x][y](여기서 x = -1, y = -1, -2)들은 위치(xTbY + x, yTbY + y)에서의 디블록킹 필터 처리 전에 재현 루마 샘플들과 같게 설정된다.
5.22. 실시예 22(Embodiment 22)
JVET-Q2001-vE 에 명시된 작업 초안이 다음과 같이 변경될 수 있다
8.4.5.2.13 INTRA_LT_CCLM, INTRA_L_CCLM and INTRA_T_CCLM 인트라 예측 모드의 사양(Specification of INTRA_LT_CCLM, INTRA_L_CCLM and INTRA_T_CCLM intra prediction mode)
예측 샘플 predSamples[x][y](여기서 x = 0... nTbW - 1, y = 0... nTbH - 1)들은 다음과 같이 유도된다:
- numSampL 및 numSampT 양자 모두 0이면, 다음이 적용된다:
predSamples[x][y] = 1 << (BitDepth - 1) (359)
- 그렇지 않으면 다음 순서의 단계들이 적용된다:
1. 동치(collocated) 루마 샘플 pY[x][y](여기서 x = 0... nTbW * SubWidthC - 1, y = 0... nTbH * SubHeightC - 1)들은 위치(xTbY + x, yTbY + y)들에서의 디블록킹 필터 처리에 앞서 재현된 루마 샘플들과 같게 설정된다.
2. 이웃 루마 샘플 pY[x][y]들은 다음과 같이 유도된다:
- numSampL이 0보다 크면, 이웃 좌측 루마 샘플 pY[x][y](여기서 x = -1... -3, y = 0... SubHeightC*numSampL - 1)들은 위치(xTbY + x, yTbY +y)들에서의 디블록킹 필터 처리 전에 재현 루마 샘플들과 같게 설정된다.
- availT가 FALSE이면, 이웃 상측 루마 샘플 pY[x][y](여기서 x = [[-1]] 0 ... SubWidthC * numSampT - 1, y = -1... -2)들은 루마 샘플 pY[x][0]들과 같게 설정된다.
- availL이 FALSE이면, 이웃 좌측 루마 샘플 pY[x][y](여기서 x = [[-1]] 0 ... -3, y = -1... SubHeightC * numSampL - 1)들은 루마 샘플 pY[0][y]들과 같게 설정된다.
- numSampT가 0보다 크면, 이웃 상측 루마 샘플 pY[x][y](여기서 x = 0... SubWidthC * numSampT - 1, y = -1, -2)들은 위치(xTbY + x, yTbY + y)에서의 디블록킹 필터 처리 전에 재현 루마 샘플들과 같게 설정된다.
- availTL이 TRUE이면, 이웃 상-좌 루마 샘플 pY[x][y](여기서 x = -1, y = -1, -2)들은 위치(xTbY + x, yTbY + y)에서의 디블록킹 필터 처리 전에 재현 루마 샘플들과 같게 설정된다.
- availT가 true이면, 이웃 상-좌 루마 샘플 pY[x][y](여기서 x = -1, -2, y = -1, -2)들이 루마 샘플 pY[0][y]들과 같게 설정된다.
- 그렇지 않고 availL이 true이면, 이웃 상-좌 루마 샘플 pY[x][y](여기서 x = -1, -2, y = -1, -2)들이 루마 샘플 pY[x][0]들과 같게 설정된다.
5.23. 실시예 23(Embodiment 23)
JVET-Q2001-vE에 명시된 작업 초안이 다음과 같이 변경될 수 있다
8.4.5.2.13 INTRA_LT_CCLM, INTRA_L_CCLM and INTRA_T_CCLM 인트라 예측 모드의 사양(Specification of INTRA_LT_CCLM, INTRA_L_CCLM and INTRA_T_CCLM intra prediction mode)
이 프로세스에 대한 입력들은:
- 인트라 예측 모드 predModeIntra,
- 현재 픽처의 상-좌 샘플에 대한 현재 변환 블록의 상좌 샘플의 샘플 위치(xTbC, yTbC),
- 변환 블록 폭을 명시하는 변수 nTbW,
- 변환 블록 높이를 명시하는 변수 nTbH,
- 현재 블록의 색상 성분을 명시하는 변수 cIdx,
- 크로마 이웃 샘플들 p[x][y], 여기서 x = -1, y = 0... 2 * nTbH - 1 및 x = 0... 2 * nTbW - 1, y = -1.
이 프로세스의 출력은 예측된 샘플들 predSamples[x][y]인데, 여기서 x = 0... nTbW - 1, y = 0... nTbH - 1.
현재 루마 위치(xTbY, yTbY)는 다음과 같이 유도된다:
(xTbY, yTbY) = (xTbC<<(SubWidthC - 1), yTbC << (SubHeightC - 1)) (351)
변수 availL, availT, 및 availTL들은 다음과 같이 유도된다:
- 6.4.4 절(clause)에 명시된 바와 같은 인접 블록 사용 가능성에 대한 유도 프로세스는, (xTbY, yTbY)로 설정된 현재 루마 위치(xCurr, yCurr), 이웃 루마 위치 (xTbY - 1, yTbY), FALSE로 설정된 checkPredModeY, 및 cIdx를 입력으로 하여 실행되어지고, 출력은 availL 로 할당된다.
- 6.4.4 절(clause)에 명시된 바와 같은 인접 블록 사용 가능성에 대한 유도 프로세스는, (xTbY, yTbY)로 설정된 현재 루마 위치(xCurr, yCurr), 이웃 루마 위치 (xTbY, yTbY - 1), FALSE로 설정된 checkPredModeY, 및 cIdx를 입력으로 하여 실행되어지고, 출력은 availT 로 할당된다.
- availL이 true이고 availT가 true이면, 다음이 적용된다:
- 6.4.4 절(clause)에 명시된 바와 같은 인접 블록 사용 가능성에 대한 유도 프로세스는, (xTbY, yTbY)로 설정된 현재 루마 위치(xCurr, yCurr), 이웃 루마 위치 (xTbY - 1, yTbY - 1), FALSE로 설정된 checkPredModeY, 및 cIdx를 입력으로 하여 실행되어지고, 출력은 availTL 로 할당된다.
- 그렇지 않으면 availTL이 false로 설정된다.
[[- 변수 availTL은 다음과 같이 유도된다:
availTL = availL && availT (352) ]]
...
예측 샘플 predSamples[x][y](여기서 x= 0... nTbW - 1, y = 0.. nTbH - 1)들은 다음과 같이 유도된다:
- numSampL 및 numSampT 모두 0이면 다음이 적용된다:
predSamples[x][y] = 1 << (BitDepth - 1) (359)
- 그렇지 않으면 다음 순서의 단계들이 적용된다:
1. 동치(collocated) 루마 샘플 pY[x][y](여기서 x = 0... nTbW * SubWidthC - 1, y = 0... nTbH * SubHeightC - 1)들은 위치(xTbY + x, yTbY + y)들에서의 디블록킹 필터 처리에 앞서 재현된 루마 샘플들과 같게 설정된다.
2. 이웃 루마 샘플 pY[x][y]들은 다음과 같이 유도된다:
- numSampL이 0보다 크면, 이웃 좌측 루마 샘플 pY[x][y](여기서 x = -1... -3, y = 0... SubHeightC*numSampL - 1)들은 위치(xTbY + x, yTbY +y)들에서의 디블록킹 필터 처리 전에 재현 루마 샘플들과 같게 설정된다.
- availT가 FALSE이면, 이웃 상측 루마 샘플 pY[x][y](여기서 x = -1... SubWidthC * numSampT - 1, y = -1... -2)들은 루마 샘플 pY[x][0]들과 같게 설정된다.
- availL이 FALSE이면, 이웃 좌측 루마 샘플 pY[x][y](여기서 x = -1... -3, y = -1... SubHeightC * numSampL - 1)들은 루마 샘플 pY[0][y]들과 같게 설정된다.
- numSampT가 0보다 크면, 이웃 상측 루마 샘플 pY[x][y](여기서 x = 0... SubWidthC * numSampT - 1, y = -1, -2)들은 위치(xTbY + x, yTbY + y)에서의 디블록킹 필터 처리 전에 재현 루마 샘플들과 같게 설정된다.
[[ - availTL이 TRUE이면, 이웃 상-좌 루마 샘플 pY[x][y](여기서 x = -1, y = -1, -2)들은 위치(xTbY + x, yTbY + y)에서의 디블록킹 필터 처리 전에 재현 루마 샘플들과 같게 설정된다. ]]
- availL 및 availT 양자 모두 TURE이면, 다음이 적용된다:
- availTL이 TRUE이면, 이웃 상측 루마 샘플 pY[x][y](여기서 x = -1. -2, y = -1, -2)들은 위치(xTbY + x, yTbY + y)에서의 디블록킹 필터 처리 이전의 재현 루마 샘플들과 같게 설정된다.
- 그렇지 않으면, 이웃 상측 루마 샘플 pY[x][y](여기서 x = -1. -2, y = -1, -2)들은 루마 샘플 pY[0][y]들과 같게 설정된다.
5.24. 실시예 24(Embodiment 24)
JVET-Q2001-vE에 명시된 작업 초안이 다음과 같이 변경될 수 있다
8.4.5.2.13 INTRA_LT_CCLM, INTRA_L_CCLM and INTRA_T_CCLM 인트라 예측 모드의 사양(Specification of INTRA_LT_CCLM, INTRA_L_CCLM and INTRA_T_CCLM intra prediction mode)
이 프로세스에 대한 입력들은:
- 인트라 예측 모드 predModeIntra,
- 현재 픽처의 상-좌 샘플에 대한 현재 변환 블록의 상좌 샘플의 샘플 위치(xTbC, yTbC),
- 변환 블록 폭을 명시하는 변수 nTbW,
- 변환 블록 높이를 명시하는 변수 nTbH,
- 현재 블록의 색상 성분을 명시하는 변수 cIdx,
- 크로마 이웃 샘플들 p[x][y], 여기서 x = -1, y = 0... 2 * nTbH - 1 및 x = 0... 2 * nTbW - 1, y = -1.
이 프로세스의 출력은 예측된 샘플들 predSamples[x][y]인데, 여기서 x = 0... nTbW - 1, y = 0... nTbH - 1.
현재 루마 위치(xTbY, yTbY)는 다음과 같이 유도된다:
(xTbY, yTbY) = (xTbC<<(SubWidthC - 1), yTbC << (SubHeightC - 1)) (351)
변수 availL, availT, 및 availTL들은 다음과 같이 유도된다:
- 6.4.4 절(clause)에 명시된 바와 같은 인접 블록 사용 가능성에 대한 유도 프로세스는, (xTbY, yTbY)로 설정된 현재 루마 위치(xCurr, yCurr), 이웃 루마 위치 (xTbY - 1, yTbY), FALSE로 설정된 checkPredModeY, 및 cIdx를 입력으로 하여 실행되어지고, 출력은 availL 로 할당된다.
- 6.4.4 절(clause)에 명시된 바와 같은 인접 블록 사용 가능성에 대한 유도 프로세스는, (xTbY, yTbY)로 설정된 현재 루마 위치(xCurr, yCurr), 이웃 루마 위치 (xTbY, yTbY - 1), FALSE로 설정된 checkPredModeY, 및 cIdx를 입력으로 하여 실행되어지고, 출력은 availT 로 할당된다.
- availL이 true이고 availT가 true이면, 다음이 적용된다:
- 6.4.4 절(clause)에 명시된 바와 같은 인접 블록 사용 가능성에 대한 유도 프로세스는, (xTbY, yTbY)로 설정된 현재 루마 위치(xCurr, yCurr), 이웃 루마 위치 (xTbY - 1, yTbY - 1), FALSE로 설정된 checkPredModeY, 및 cIdx를 입력으로 하여 실행되어지고, 출력은 availTL 로 할당된다.
- 그렇지 않으면 availTL은 false로 설정된다.
[[- 변수 availTL은 다음과 같이 유도된다:
availTL = availL && availT (352) ]]
...
예측 샘플 predSamples[x][y](여기서 x= 0... nTbW - 1, y = 0.. nTbH - 1)들은 다음과 같이 유도된다:
- numSampL 및 numSampT 모두 0이면 다음이 적용된다:
predSamples[x][y] = 1 << (BitDepth - 1) (359)
- 그렇지 않으면 다음 순서의 단계들이 적용된다:
1. 동치(collocated) 루마 샘플 pY[x][y](여기서 x = 0... nTbW * SubWidthC - 1, y = 0... nTbH * SubHeightC - 1)들은 위치(xTbY + x, yTbY + y)들에서의 디블록킹 필터 처리에 앞서 재현된 루마 샘플들과 같게 설정된다.
2. 이웃 루마 샘플 pY[x][y]들은 다음과 같이 유도된다:
- numSampL이 0보다 크면, 이웃 좌측 루마 샘플 pY[x][y](여기서 x = -1... -3, y = 0... SubHeightC*numSampL - 1)들은 위치(xTbY + x, yTbY +y)들에서의 디블록킹 필터 처리 전에 재현 루마 샘플들과 같게 설정된다.
- availT가 FALSE이면, 이웃 상측 루마 샘플 pY[x][y](여기서 x = -1... SubWidthC * numSampT - 1, y = -1... -2)들은 루마 샘플 pY[x][0]들과 같게 설정된다.
- availL이 FALSE이면, 이웃 좌측 루마 샘플 pY[x][y](여기서 x = -1... -3, y = -1... SubHeightC * numSampL - 1)들은 루마 샘플 pY[0][y]들과 같게 설정된다.
- numSampT가 0보다 크면, 이웃 상측 루마 샘플 pY[x][y](여기서 x = 0... SubWidthC * numSampT - 1, y = -1, -2)들은 위치(xTbY + x, yTbY + y)에서의 디블록킹 필터 처리 전에 재현 루마 샘플들과 같게 설정된다.
[[ - availTL이 TRUE이면, 이웃 상-좌 루마 샘플 pY[x][y](여기서 x = -1, y = -1, -2)들은 위치(xTbY + x, yTbY + y)에서의 디블록킹 필터 처리 전에 재현 루마 샘플들과 같게 설정된다. ]]
- availL 및 availT 양자 모두 TURE이면, 다음이 적용된다:
- availTL이 TRUE이면, 이웃 상-좌 루마 샘플 pY[x][y](여기서 x = -1. -2, y = -1, -2)들은 위치(xTbY + x, yTbY + y)에서의 디블록킹 필터 처리 전에 재현 루마 샘플들과 같게 설정된다.
- 그렇지 않으면, 이웃 상-좌 루마 샘플 pY[x][y](여기서 x = -1. -2, y = -1, -2)들은 루마 샘플 pY[x][0]들과 같게 설정된다.
5.25. 실시예 25(Embodiment 25)
JVET-Q2001-vE에 명시된 작업 초안이 다음과 같이 변경될 수 있다
8.4.5.2.13 INTRA_LT_CCLM, INTRA_L_CCLM and INTRA_T_CCLM 인트라 예측 모드의 사양(Specification of INTRA_LT_CCLM, INTRA_L_CCLM and INTRA_T_CCLM intra prediction mode)
이 프로세스에 대한 입력들은:
- 인트라 예측 모드 predModeIntra,
- 현재 픽처의 상-좌 샘플에 대한 현재 변환 블록의 상좌 샘플의 샘플 위치(xTbC, yTbC),
- 변환 블록 폭을 명시하는 변수 nTbW,
- 변환 블록 높이를 명시하는 변수 nTbH,
- 현재 블록의 색상 성분을 명시하는 변수 cIdx,
- 크로마 이웃 샘플들 p[x][y], 여기서 x = -1, y = 0... 2 * nTbH - 1 및 x = 0... 2 * nTbW - 1, y = -1.
이 프로세스의 출력은 예측된 샘플들 predSamples[x][y]인데, 여기서 x = 0... nTbW - 1, y = 0... nTbH - 1.
현재 루마 위치(xTbY, yTbY)는 다음과 같이 유도된다:
(xTbY, yTbY) = (xTbC<<(SubWidthC - 1), yTbC << (SubHeightC - 1)) (351)
변수 availL, availT, 및 availTL들은 다음과 같이 유도된다:
- 6.4.4 절(clause)에 명시된 바와 같은 인접 블록 사용 가능성에 대한 유도 프로세스는, (xTbY, yTbY)로 설정된 현재 루마 위치(xCurr, yCurr), 이웃 루마 위치 (xTbY - 1, yTbY), FALSE로 설정된 checkPredModeY, 및 cIdx를 입력으로 하여 실행되어지고, 출력은 availL 로 할당된다.
- 6.4.4 절(clause)에 명시된 바와 같은 인접 블록 사용 가능성에 대한 유도 프로세스는, (xTbY, yTbY)로 설정된 현재 루마 위치(xCurr, yCurr), 이웃 루마 위치 (xTbY, yTbY - 1), FALSE로 설정된 checkPredModeY, 및 cIdx를 입력으로 하여 실행되어지고, 출력은 availT 로 할당된다.
- 6.4.4 절(clause)에 명시된 바와 같은 인접 블록 사용 가능성에 대한 유도 프로세스는, (xTbY, yTbY)로 설정된 현재 루마 위치(xCurr, yCurr), 이웃 루마 위치 (xTbY - 1, yTbY - 1), FALSE로 설정된 checkPredModeY, 및 cIdx를 입력으로 하여 실행되어지고, 출력은 availTL 로 할당된다.
[[ - 변수 availTL은 다음과 같이 유도된다:
availTL = availL && availT (352)]]
...
예측 샘플 predSamples[x][y](여기서 x= 0... nTbW - 1, y = 0.. nTbH - 1)들은 다음과 같이 유도된다:
- numSampL 및 numSampT 모두 0이면 다음이 적용된다:
predSamples[x][y] = 1 << (BitDepth - 1) (359)
- 그렇지 않으면 다음 순서의 단계들이 적용된다:
1. 동치(collocated) 루마 샘플 pY[x][y](여기서 x = 0... nTbW * SubWidthC - 1, y = 0... nTbH * SubHeightC - 1)들은 위치(xTbY + x, yTbY + y)들에서의 디블록킹 필터 처리에 앞서 재현된 루마 샘플들과 같게 설정된다.
2. 이웃 루마 샘플 pY[x][y]들은 다음과 같이 유도된다:
- numSampL이 0보다 크면, 이웃 좌측 루마 샘플 pY[x][y](여기서 x = -1... -3, y = 0... SubHeightC*numSampL - 1)들은 위치(xTbY + x, yTbY +y)들에서의 디블록킹 필터 처리 전에 재현 루마 샘플들과 같게 설정된다.
- availT가 FALSE이면, 이웃 상측 루마 샘플 pY[x][y](여기서 x = -1... SubWidthC * numSampT - 1, y = -1... -2)들은 루마 샘플 pY[x][0]들과 같게 설정된다.
- availL이 FALSE이면, 이웃 좌측 루마 샘플 pY[x][y](여기서 x = -1... -3, y = -1... SubHeightC * numSampL - 1)들은 루마 샘플 pY[0][y]들과 같게 설정된다.
- numSampT가 0보다 크면, 이웃 상측 루마 샘플 pY[x][y](여기서 x = 0... SubWidthC * numSampT - 1, y = -1, -2)들은 위치(xTbY + x, yTbY + y)에서의 디블록킹 필터 처리 전에 재현 루마 샘플들과 같게 설정된다.
[[ - availTL이 TRUE이면, 이웃 상-좌 루마 샘플 pY[x][y](여기서 x = -1, y = -1, -2)들은 위치(xTbY + x, yTbY + y)에서의 디블록킹 필터 처리 전에 재현 루마 샘플들과 같게 설정된다. ]]
- availL 및 availT 양자 모두 TURE이면, 다음이 적용된다:
- availTL이 TRUE이면, 이웃 상-좌 루마 샘플 pY[x][y](여기서 x = -1. -2, y = -1, -2)들은 위치(xTbY + x, yTbY + y)에서의 디블록킹 필터 처리 전에 재현 루마 샘플들과 같게 설정된다.
- 그렇지 않으면, 이웃 상-좌 루마 샘플 pY[x][y](여기서 x = -1. -2, y = -1, -2)들은 루마 샘플 pY[0][y]들과 같게 설정된다.
5.26. 실시예 26(Embodiment 26)
JVET-Q2001-vE에 명시된 작업 초안이 다음과 같이 변경될 수 있다
8.4.5.2.13 INTRA_LT_CCLM, INTRA_L_CCLM and INTRA_T_CCLM 인트라 예측 모드의 사양(Specification of INTRA_LT_CCLM, INTRA_L_CCLM and INTRA_T_CCLM intra prediction mode)
이 프로세스에 대한 입력들은:
- 인트라 예측 모드 predModeIntra,
- 현재 픽처의 상-좌 샘플에 대한 현재 변환 블록의 상좌 샘플의 샘플 위치(xTbC, yTbC),
- 변환 블록 폭을 명시하는 변수 nTbW,
- 변환 블록 높이를 명시하는 변수 nTbH,
- 현재 블록의 색상 성분을 명시하는 변수 cIdx,
- 크로마 이웃 샘플들 p[x][y], 여기서 x = -1, y = 0... 2 * nTbH - 1 및 x = 0... 2 * nTbW - 1, y = -1.
이 프로세스의 출력은 예측된 샘플들 predSamples[x][y]인데, 여기서 x = 0... nTbW - 1, y = 0... nTbH - 1.
현재 루마 위치(xTbY, yTbY)는 다음과 같이 유도된다:
(xTbY, yTbY) = (xTbC<<(SubWidthC - 1), yTbC << (SubHeightC - 1)) (351)
변수 availL, availT, 및 availTL들은 다음과 같이 유도된다:
- 6.4.4 절(clause)에 명시된 바와 같은 인접 블록 사용 가능성에 대한 유도 프로세스는, (xTbY, yTbY)로 설정된 현재 루마 위치(xCurr, yCurr), 이웃 루마 위치 (xTbY - 1, yTbY), FALSE로 설정된 checkPredModeY, 및 cIdx를 입력으로 하여 실행되어지고, 출력은 availL 로 할당된다.
- 6.4.4 절(clause)에 명시된 바와 같은 인접 블록 사용 가능성에 대한 유도 프로세스는, (xTbY, yTbY)로 설정된 현재 루마 위치(xCurr, yCurr), 이웃 루마 위치 (xTbY, yTbY - 1), FALSE로 설정된 checkPredModeY, 및 cIdx를 입력으로 하여 실행되어지고, 출력은 availT 로 할당된다.
- 6.4.4 절(clause)에 명시된 바와 같은 인접 블록 사용 가능성에 대한 유도 프로세스는, (xTbY, yTbY)로 설정된 현재 루마 위치(xCurr, yCurr), 이웃 루마 위치 (xTbY - 1, yTbY - 1), FALSE로 설정된 checkPredModeY, 및 cIdx를 입력으로 하여 실행되어지고, 출력은 availTL 로 할당된다.
[[ - 변수 availTL은 다음과 같이 유도된다:
availTL = availL && availT (352)]]
...
예측 샘플 predSamples[x][y](여기서 x= 0... nTbW - 1, y = 0.. nTbH - 1)들은 다음과 같이 유도된다:
- numSampL 및 numSampT 모두 0이면 다음이 적용된다:
predSamples[x][y] = 1 << (BitDepth - 1) (359)
- 그렇지 않으면 다음 순서의 단계들이 적용된다:
1. 동치(collocated) 루마 샘플 pY[x][y](여기서 x = 0... nTbW * SubWidthC - 1, y = 0... nTbH * SubHeightC - 1)들은 위치(xTbY + x, yTbY + y)들에서의 디블록킹 필터 처리에 앞서 재현된 루마 샘플들과 같게 설정된다.
2. 이웃 루마 샘플 pY[x][y]들은 다음과 같이 유도된다:
- numSampL이 0보다 크면, 이웃 좌측 루마 샘플 pY[x][y](여기서 x = -1... -3, y = 0... SubHeightC*numSampL - 1)들은 위치(xTbY + x, yTbY +y)들에서의 디블록킹 필터 처리 전에 재현 루마 샘플들과 같게 설정된다.
- availT가 FALSE이면, 이웃 상측 루마 샘플 pY[x][y](여기서 x = -1... SubWidthC * numSampT - 1, y = -1... -2)들은 루마 샘플 pY[x][0]들과 같게 설정된다.
- availL이 FALSE이면, 이웃 좌측 루마 샘플 pY[x][y](여기서 x = -1... -3, y = -1... SubHeightC * numSampL - 1)들은 루마 샘플 pY[0][y]들과 같게 설정된다.
- numSampT가 0보다 크면, 이웃 상측 루마 샘플 pY[x][y](여기서 x = 0... SubWidthC * numSampT - 1, y = -1, -2)들은 위치(xTbY + x, yTbY + y)에서의 디블록킹 필터 처리 전에 재현 루마 샘플들과 같게 설정된다.
[[ - availTL이 TRUE이면, 이웃 상-좌 루마 샘플 pY[x][y](여기서 x = -1, y = -1, -2)들은 위치(xTbY + x, yTbY + y)에서의 디블록킹 필터 처리 전에 재현 루마 샘플들과 같게 설정된다. ]]
- availL 및 availT 양자 모두 TURE이면, 다음이 적용된다:
- availTL이 TRUE이면, 이웃 상-좌 루마 샘플 pY[x][y](여기서 x = -1. -2, y = -1, -2)들은 위치(xTbY + x, yTbY + y)에서의 디블록킹 필터 처리 전에 재현 루마 샘플들과 같게 설정된다.
- 그렇지 않으면, 이웃 상-좌 루마 샘플 pY[x][y](여기서 x = -1. -2, y = -1, -2)들은 루마 샘플 pY[x][0]들과 같게 설정된다.
5.27. 실시예 27(Embodiment 27)
JVET-P2001-v9에 명시된 작업 초안이 다음과 같이 변경될 수 있다
8.4.5.2.13 INTRA_LT_CCLM, INTRA_L_CCLM and INTRA_T_CCLM 인트라 예측 모드의 사양(Specification of INTRA_LT_CCLM, INTRA_L_CCLM and INTRA_T_CCLM intra prediction mode)
예측 샘플 predSamples[x][y](여기서 x= 0... nTbW - 1, y = 0.. nTbH - 1)들은 다음과 같이 유도된다:
- numSampL 및 numSampT 모두 0이면 다음이 적용된다:
predSamples[x][y] = 1 << (BitDepth - 1) (359)
- 그렇지 않으면 다음 순서의 단계들이 적용된다:
1. 동치(collocated) 루마 샘플 pY[x][y](여기서 x = 0... nTbW * SubWidthC - 1, y = 0... nTbH * SubHeightC - 1)들은 위치(xTbY + x, yTbY + y)들에서의 디블록킹 필터 처리에 앞서 재현된 루마 샘플들과 같게 설정된다.
2. 이웃 루마 샘플 pY[x][y]들은 다음과 같이 유도된다:
- numSampL이 0보다 크면, 이웃 좌측 루마 샘플 pY[x][y](여기서 x = -1... -3, y = 0... SubHeightC*numSampL - 1)들은 위치(xTbY + x, yTbY +y)들에서의 디블록킹 필터 처리 전에 재현 루마 샘플들과 같게 설정된다.
- availT가 FALSE이면, 이웃 상측 루마 샘플 pY[x][y](여기서 x = -1... SubWidthC * numSampT - 1, y = -1... -2)들은 루마 샘플 pY[x][0]들과 같게 설정된다.
- availL이 FALSE이면, 이웃 좌측 루마 샘플 pY[x][y](여기서 x = -1... -3, y = -1... SubHeightC * numSampL - 1)들은 루마 샘플 pY[0][y]들과 같게 설정된다.
- numSampT가 0보다 크면, 이웃 상측 루마 샘플 pY[x][y](여기서 x = 0... SubWidthC * numSampT - 1, y = -1, -2)들은 위치(xTbY + x, yTbY + y)에서의 디블록킹 필터 처리 전에 재현 루마 샘플들과 같게 설정된다.
- availTL이 TRUE이면, 이웃 상-좌 루마 샘플 pY[x][y](여기서 x = -1, y = -1, -2)들은 위치(xTbY + x, yTbY + y)에서의 디블록킹 필터 처리 전에 재현 루마 샘플들과 같게 설정된다.
3. 다운샘플링된 동치 루마 샘플 pDsY[x][y](여기서 x = 0... nTbW - 1, y = 0... nTbH - 1)들은 다음과 같이 유도된다:
- SubWidthC 및 SubHeightC 양자 모두 1이면, 다음이 적용된다:
- pDsY[x][y](여기서 x = 1... nTbW - 1, y = 1... nTbH - 1)는 다음과 같이 유도된다:
pDstY[x][y] = pY[x][y] (360)
- 그렇지 않으면 다음이 적용된다:
- 1차원 필터계수 행렬 F1 및 F2와 2차원 필터 계수 행렬 F3 및 F4는 다음과 같이 명시된다:
F1[0] = 2, F1[1] = 0 (361)
F2[0] = 1, F2[1]  = 2, F2[2] = 1 (362)
F3[i][j] = F4[i][j] = 0(여기서 I = 0... 2, j = 0... 2 (363)
- SubWidthC 및 SubHeightC 양자 모두 2이면, 다음이 적용된다:
F1[0] = 1, F1[1] = 1 (364)
F3[0][1] = 1, F3[1][1] = 4, F3[2][1] = 1, F3[1][0] = 1, F3[1][2] = 1 (365)
F4[0][1] = 1, F4[1][1] = 2, F4[2][1] = 1 (366)
F4[0][2] = 1, F4[1][2] = 2, F4[2][2] = 1 (367)
- 그렇지 않으면 다음이 적용된다:
F3[0][1] = 2, F3[1][1] = [[8]] 4, F3[2][1] = 2, (368)
F4[0][1] = 2, F4[1][1] = 4, F4[2][1] = 2, (369)
- sps_chroma_vertical_collocated_flag이 1이면, 다음이 적용된다:
- pDsY[x][y](여기서 x = 0... nTbW - 1, y = 0... nTbH - 1)응 다음과 같이 유도된다:
pDsY[x][y] = (F3[1][0] * pY[SubWidthC * x][SubHeightC * y - 1] + F3[0][1] * pY[SubWidthC * x - 1][SubHeightC * y] +
F3[1][1] * pY[SubWidthC * x][SubHeightC * y] +
F3[2][1] * pY[SubWidthC * x + 1 ][ SubHeightC * y] + F3[1][2] * pY[SubWidthC * x][SubHeightC * y + 1] + 4) >> 3 (370)
- 그렇지 않으면(sps_chroma_vertical_collocated_flag이 0이면), 다음이 적용된다:
- pDsY[x][y](여기서 x = 0... nTbW - 1, y = 0... nTbH - 1)는 다음과 같이 유도된다:
pDsY[x][y] = (F4[0][1] * pY[SubWidthC * x - 1][SubHeightC * y] +
F4[0][2] * pY[SubWidthC * x - 1][SubHeightC * y + 1] +
F4[1][1] * pY[SubWidthC * x][SubHeightC * y] +
F4[1][2] * pY[SubWidthC * x][SubHeightC * y + 1] +
F4[2][1] * pY[SubWidthC * x + 1][SubHeightC * y] +
F4[2][2] * pY[SubWidthC * x + 1][SubHeightC * y + 1] + 4) >> 3 (371)
5.28. 실시예 28(Embodiment 28)
JVET-Q2001-vE에 명시된 작업 초안이 다음과 같이 변경될 수 있다
8.4.5.2.13 INTRA_LT_CCLM, INTRA_L_CCLM and INTRA_T_CCLM 인트라 예측 모드의 사양(Specification of INTRA_LT_CCLM, INTRA_L_CCLM and INTRA_T_CCLM intra prediction mode)
이 프로세스에 대한 입력들은:
- 인트라 예측 모드 predModeIntra,
- 현재 픽처의 상-좌 샘플에 대한 현재 변환 블록의 상좌 샘플의 샘플 위치(xTbC, yTbC),
- 변환 블록 폭을 명시하는 변수 nTbW,
- 변환 블록 높이를 명시하는 변수 nTbH,
- 현재 블록의 색상 성분을 명시하는 변수 cIdx,
- 크로마 이웃 샘플들 p[x][y], 여기서 x = -1, y = 0... 2 * nTbH - 1 및 x = 0... 2 * nTbW - 1, y = -1.
이 프로세스의 출력은 예측된 샘플들 predSamples[x][y]인데, 여기서 x = 0... nTbW - 1, y = 0... nTbH - 1.
현재 루마 위치(xTbY, yTbY)는 다음과 같이 유도된다:
(xTbY, yTbY) = (xTbC<<(SubWidthC - 1), yTbC << (SubHeightC - 1)) (351)
변수 availL, availT, 및 availTL들은 다음과 같이 유도된다:
- 6.4.4 절(clause)에 명시된 바와 같은 인접 블록 사용 가능성에 대한 유도 프로세스는, (xTbY, yTbY)로 설정된 현재 루마 위치(xCurr, yCurr), 이웃 루마 위치 (xTbY - 1, yTbY), FALSE로 설정된 checkPredModeY, 및 cIdx를 입력으로 하여 실행되어지고, 출력은 availL 로 할당된다.
- 6.4.4 절(clause)에 명시된 바와 같은 인접 블록 사용 가능성에 대한 유도 프로세스는, (xTbY, yTbY)로 설정된 현재 루마 위치(xCurr, yCurr), 이웃 루마 위치 (xTbY, yTbY - 1), FALSE로 설정된 checkPredModeY, 및 cIdx를 입력으로 하여 실행되어지고, 출력은 availT 로 할당된다.
- 변수 availTL은 다음과 같이 유도된다:
availTL = availL && availT (352)
- 사용 가능한 상-우 이웃 크로마 샘플들의 수는 다음과 같이 유도된다:
- 변수 numTopRight가 0과 같게 설정되고 availTR이 TRUE와 같게 설정된다.
- predModeIntra가 INTRA_T_CCLM과 같을 때, availTR이 FALSE이거나 x가 2 * nTbW - 1이 될 때까지 다음이 x = nTbW... 2 * nTbW - 1에 적용된다:
- 6.4.4 절(clause)에 명시된 바와 같은 인접 블록 사용 가능성에 대한 유도 프로세스는, (xTbY, yTbY)로 설정된 현재 루마 위치(xCurr, yCurr), 이웃 루마 위치 (xTbY + x, yTbY - 1), FALSE로 설정된 checkPredModeY, 및 cIdx를 입력으로 하여 실행되어지고, 출력은 availTR 로 할당된다.
- availTR이 TRUE일 때, numTopRight가 1만큼 증분된다.
- 사용 가능한 좌-하(left-below) 이웃 크로마 샘플들의 수 numLeftBelow는 다음과 같이 유도된다:
- 변수 numLeftBelow가 0과 같게 설정되고 availLB가 TRUE와 같게 설정된다.
- predModeIntra가 INTRA_L_CCLM일 때, availLB가 FALSE이거나 y가 2 * nTbH - 1이 될 때까지 ekdmaa이 y = nTbH... 2 * nTbH - 1에 적용되고:
- 6.4.4 절(clause)에 명시된 바와 같은 인접 블록 사용 가능성에 대한 유도 프로세스는, (xTbY, yTbY)로 설정된 현재 루마 위치(xCurr, yCurr), 이웃 루마 위치 (xTbY - 1, yTbY + y), FALSE로 설정된 checkPredModeY, 및 cIdx를 입력으로 하여 실행되어지고, 출력은 availLB 로 할당된다.
- availLB가 TRUE일 때, numLeftBelow가 1만큼 증분된다.
상측 및 상-우측 상의 사용 가능한 이웃 크로마 샘플들의 수 numSampT와 좌측 및 좌-하측 상의 사용 가능한 이웃 크로마 샘플들의 수 numSampL은 다음과 같이 유도된다:
- predModeIntra가 INTRA_LT_CCLM이면, 다음이 적용된다:
numSampT = availT ? nTbW : 0 (353)
numSampL = availL ? nTbH : 0 (354)
- 그렇지 않으면 다음이 적용된다:
numSampT = (availT && predModeIntra = = INTRA_T_CCLM) ? (nTbW + Min(numTopRight, nTbH)) : 0 (355)
numSampL = (availL && predModeIntra = = INTRA_L_CCLM) ? (nTbH + Min(numLeftBelow, nTbW)) : 0 (356)
변수 bCTUboundary는 다음과 같이 유도된다:
bCTUboundary = (yTbY & (CtbSizeY - 1) = = 0) ? TRUE : FALSE (357)
변수 cntN와 N이 L 및 T로 치환된 행렬(array) pickPosN은 다음과 같이 유도되는데 :
- 변수 numIs4N은 다음과 같이 유도된다:
numIs4N = ((availT && availL && predModeIntra = = INTRA_LT_CCLM) ? 0 : 1) (358)
- 변수 startPosN이 numSampN >> (2 + numIs4N)과 같게 설정된다.
- 변수 pickStepN 이 Max(1, numSampN >> (1 + numIs4N))과 같게 설정된다.
- availN이 TRUE이고 predModeIntra가 INTRA_LT_CCLM 또는 INTRA_N_CCLM이면, 다음 할당이 이뤄지는데:
- cntN이 Min(numSampN, (1 + numIs4N) << 1)와 같게 설정된다.
- pickPosN[pos]가 (startPosN = pos * pickStepN)와 같게 설정되는데, 여기서 pos = 0... cntN - 1.
- 그렇지 않으면 cntN이 0과 같게 설정된다.
변수 bVerticalCollocated가 0으로 설정된다.
예측 샘플 predSamples[x][y](여기서 x= 0... nTbW - 1, y = 0.. nTbH - 1)들은 다음과 같이 유도된다:
- numSampL 및 numSampT 모두 0이면 다음이 적용된다:
predSamples[x][y] = 1 << (BitDepth - 1) (359)
- 그렇지 않으면 다음 순서의 단계들이 적용된다:
1. 동치(collocated) 루마 샘플 pY[x][y](여기서 x = 0... nTbW * SubWidthC - 1, y = 0... nTbH * SubHeightC - 1)들은 위치(xTbY + x, yTbY + y)들에서의 디블록킹 필터 처리에 앞서 재현된 루마 샘플들과 같게 설정된다.
2. 이웃 루마 샘플 pY[x][y]들은 다음과 같이 유도된다:
- numSampL이 0보다 크면, 이웃 좌측 루마 샘플 pY[x][y](여기서 x = -1... -3, y = 0... SubHeightC*numSampL - 1)들은 위치(xTbY + x, yTbY +y)들에서의 디블록킹 필터 처리 전에 재현 루마 샘플들과 같게 설정된다.
- availT가 FALSE이면, 이웃 상측 루마 샘플 pY[x][y](여기서 x = -1... SubWidthC * numSampT - 1, y = -1... -2)들은 루마 샘플 pY[x][0]들과 같게 설정된다.
- availL이 FALSE이면, 이웃 좌측 루마 샘플 pY[x][y](여기서 x = -1... -3, y = -1... SubHeightC * numSampL - 1)들은 루마 샘플 pY[0][y]들과 같게 설정된다.
- numSampT가 0보다 크면, 이웃 상측 루마 샘플 pY[x][y](여기서 x = 0... SubWidthC * numSampT - 1, y = -1, -2)들은 위치(xTbY + x, yTbY + y)에서의 디블록킹 필터 처리 전에 재현 루마 샘플들과 같게 설정된다.
- availTL이 TRUE이면, 이웃 상-좌 루마 샘플 pY[x][y](여기서 x = -1, y = -1, -2)들은 위치(xTbY + x, yTbY + y)에서의 디블록킹 필터 처리 전에 재현 루마 샘플들과 같게 설정된다.
3. 다운샘플링된 동치 루마 샘플 pDsY[x][y](여기서 x = 0... nTbW - 1, y = 0... nTbH - 1)들은 다음과 같이 유도된다:
- SubWidthC 및 SubHeightC 양자 모두 1이면, 다음이 적용된다:
- pDsY[x][y](여기서 x = 1... nTbW - 1, y = 1... nTbH - 1)는 다음과 같이 유도된다:
pDstY[x][y] = pY[x][y] (360)
- 그렇지 않으면 다음이 적용된다:
- 1차원 필터계수 행렬 F1 및 F2와 2차원 필터 계수 행렬 F3 및 F4는 다음과 같이 명시된다:
F1[0] = 2, F1[1] = 0 (361)
F2[0] = 1, F2[1]  = 2, F2[2] = 1 (362)
F3[i][j] = F4[i][j] = 0(여기서 I = 0... 2, j = 0... 2 (363)
- SubWidthC 및 SubHeightC 양자 모두 2이면, 다음이 적용된다:
F1[0] = 1, F1[1] = 1 (364)
F3[0][1] = 1, F3[1][1] = 4, F3[2][1] = 1, F3[1][0] = 1, F3[1][2] = 1 (365)
F4[0][1] = 1, F4[1][1] = 2, F4[2][1] = 1 (366)
F4[0][2] = 1, F4[1][2] = 2, F4[2][2] = 1 (367)
bVerticalCollocated = sps_chroma_vertical_collocated_flag
- 그렇지 않으면 다음이 적용된다:
F3[1][1] = 8 (368)
F4[0][1] = 2, F4[1][1] = 4, F4[2][1] = 2, (369)
bVerticalCollocated = 0
- [[sps_chroma_vertical_collocated_flag]] bVerticalCollocated 가 1이면, 다음이 적용된다:
- pDsY[x][y](여기서 x = 0... nTbW - 1, y = 0... nTbH - 1)응 다음과 같이 유도된다:
pDsY[x][y] = (F3[1][0] * pY[SubWidthC * x][SubHeightC * y - 1] + F3[0][1] * pY[SubWidthC * x - 1][SubHeightC * y] +
F3[1][1] * pY[SubWidthC * x][SubHeightC * y] +
F3[2][1] * pY[SubWidthC * x + 1 ][ SubHeightC * y] + F3[1][2] * pY[SubWidthC * x][SubHeightC * y + 1] + 4) >> 3 (370)
- 그렇지 않으면([[sps_chroma_vertical_collocated_flag이]] bVerticalCollocated 가 0이면), 다음이 적용된다:
- pDsY[x][y](여기서 x = 0... nTbW - 1, y = 0... nTbH - 1)는 다음과 같이 유도된다:
pDsY[x][y] = (F4[0][1] * pY[SubWidthC * x - 1][SubHeightC * y] +
F4[0][2] * pY[SubWidthC * x - 1][SubHeightC * y + 1] +
F4[1][1] * pY[SubWidthC * x][SubHeightC * y] +
F4[1][2] * pY[SubWidthC * x][SubHeightC * y + 1] +
F4[2][1] * pY[SubWidthC * x + 1][SubHeightC * y] +
F4[2][2] * pY[SubWidthC * x + 1][SubHeightC * y + 1] + 4) >> 3 (371)
4. numSampL가 0보다 크면, 선택된 좌측 크로마 샘플 pSelC[idx]들은 p[-1][pickPosL[idx]](여기서 idx = 0... cntL = 1)와 같게 설정되고, 선택된 다운샘플링된 이웃 좌측 루마 샘플 pSelDsY[idx](여기서 idx = 0... cntL - 1)들은 다음과 같이 유도된다:
- 변수 y가 pickPosL[idx]와 같게 설정된다.
- SubWidthC 및 SubHeightC 양자 모두 1이면, 다음이 적용된다:
pSelDsY[idx] = pY[-1][y] (372)
- 그렇지 않으면 다음이 적용된다:
- [[sps_chroma_vertical_collocated_flag이]] bVerticalCollocated 가 1이면 다음이 적용된다:
pSelDsY[idx] = (F3[1][0] * pY[-SubWidthC][SubHeightC * y - 1] +
F3[0][1] * pY[-SubWidthC][SubHeightC * y] +
F3[1][1] * pY[-SubWidthC][SubHeightC * y] +
F3[2][1] * pY[1 - SubWidthC][SubHeightC * y] +
F3[1][2] * pY[-SubWidthC][SubHeightC * y + 1] + 4 ) >> 3 (373)
- 그렇지 않으면([[sps_chroma_vertical_collocated_flag이]] bVerticalCollocated 가 0이면) 다음이 적용된다:
pSelDsY[idx] = (F4[0][1] * pY[-1 - SubWidthC][SubHeightC * y]+
F4[0][2] * pY[-1 - SubWidthC][SubHeightC * y + 1] +
F4[1][1] * pY[-SubWidthC][SubHeightC * y] +
F4[1][2] * pY[-SubWidthC][SubHeightC * y + 1] +
F4[2][1] * pY[1 - SubWidthC][SubHeightC * y ] +
F4[2][2] * pY[1 - SubWidthC][SubHeightC * y + 1] + 4) >> 3 (374)
5. numSampT가 0보다 크면, 선택된 이웃 상측 크로마 샘플 pSelC[idx]들은 p[pickPosT[idx - cntL]][-1](여기서 idx = [[0]] cntL ... cntL + cntT - 1)과 같게 설정되고, 다운샘플링된 이웃 상측 루마 샘플 pSelDsY[idx](여기서 idx = 0... cntL + cntT - 1)들은 다음과 같이 명시되는데:
- 변수 x는 pickPosT[idx - cntL]와 같게 설정된다.
- SubWidthC 및 SubHeightC 양자 모두 1이면. 다음이 적용된다:
pSelDsY[idx] = pY[x][-1] (375)
- 그렇지 않으면 다음이 적용된다:
- [[sps_chroma_vertical_collocated_flag이]] bVerticalCollocated 가 1이면, 다음이 적용된다:
- bCTUboundary가 FALSE이면, 다음이 적용된다:
pSelDsY[idx] = (F3[1][0] * pY[SubWidthC * x][-1 - SubHeightC]+
F3[0][1] * pY[SubWidthC * x - 1][-SubHeightC] +
F3[1][1] * pY[SubWidthC * x][-SubHeightC] +
F3[2][1] * pY[SubWidthC * x + 1][-SubHeightC] +
F3[1][2] * pY[SubWidthC * x][1 - SubHeightC] + 4) >> 3 (376)
- 그렇지 않으면(bCTUboundary가 TRUE이면), 다음이 적용된다:
pSelDsY[idx] = (F2[0] * pY[SubWidthC * x - 1][-1] +
F2[1] * pY[SubWidthC * x][-1] +
F2[2] * pY[SubWidthC * x + 1][-1] + 2) >> 2 (377)
- 그렇지 않으면([[sps_chroma_vertical_collocated_flag이]] bVerticalCollocated 가 0이면), 다음이 적용된다:
- bCTUboundary가 FALSE이면, 다음이 적용된다:
pSelDsY[idx] = (F4[0][1] * pY[SubWidthC * x - 1][-1] +
F4[0][2] * pY[SubWidthC * x - 1][-2] +
F4[1][1] * pY[SubWidthC * x][-1] +
F4[1][2] * pY[SubWidthC * x][-2] +
F4[2][1] * pY[SubWidthC * x + 1][-1] +
F4[2][2] * pY[SubWidthC * x + 1][-2] + 4) >> 3(378)
- 그렇지 않으면(bCTUboundary가 TRUE이면), 다음이 적용된다:
pSelDsY[idx] = (F2[0] * pY[SubWidthC * x - 1][-1] +
F2[1] * pY[SubWidthC * x][-1] +
F2[2] * pY[SubWidthC * x + 1][-1] + 2) >> 2 (379)
6. cntT + cntL이 0이 아니면, 변수 minY, maxY, minC, 및 maxC들이 다음과 같이 유도된다:
- cntT + cntL가 2이면, pSelComp[3]이 pSelComp[0]와 같게 설정되고, pSelComp[2]가 pSelComp[1]와 같게 설정되며, pSelComp[0]이 pSelComp[1]와 같게 설정되고, 그리고 pSelComp[1]가 pSelComp[3]와 같게 설정되는데 여기서 Comp는 DsY 및 C로 치환된다.
- 행렬 minGrpIdx 및 maxGrpIdx들은 다음과 같이 유도된다:
minGrpIdx[0] = 0 (380)
minGrpIdx[1] = 2 (381)
maxGrpIdx[0] = 1 (382)
maxGrpIdx[1] = 3 (383)
- pSelDsY[minGrpIdx[0]]이 pSelDsY[minGrpIdx[1]]보다 크면, minGrpIdx[0]과 minGrpIdx[1]들이 다음과 같이 스왑된다(swapped):
(minGrpIdx[0], minGrpIdx[1]) = Swap(minGrpIdx[0], minGrpIdx[1]) (384)
- pSelDsY[maxGrpIdx[0]]이 pSelDsY[maxGrpIdx[1]]보다 크면, maxGrpIdx[0]과 maxGrpIdx[1]들이 다음과 같이 스왑된다:
(maxGrpIdx[0], maxGrpIdx[1]) = Swap(maxGrpIdx[0], maxGrpIdx[1]) (385)
- pSelDsY[minGrpIdx[0]]이 pSelDsY[maxGrpIdx[1]]보다 크면, 행렬 minGrpIdx와 maxGrpIdx들이 다음과 같이 스왑된다:
(minGrpIdx, maxGrpIdx) = Swap(minGrpIdx, maxGrpIdx) (386)
- pSelDsY[minGrpIdx[1]]이 pSelDsY[maxGrpIdx[0]]보다 크면, minGrpIdx[1]와 maxGrpIdx[0]들이 다음과 같이 스왑된다:
(minGrpIdx[1], maxGrpIdx[0]) = Swap(minGrpIdx[1], maxGrpIdx[0]) (387)
- 변수 maxY, maxC, minY, 및 minC들은 다음과 같이 유도된다:
maxY = (pSelDsY[maxGrpIdx[0]] + pSelDsY[maxGrpIdx[1]] + 1) >> 1 (388)
maxC = (pSelC[maxGrpIdx[0]] + pSelC[maxGrpIdx[1]] + 1) >> 1 (389)
minY = (pSelDsY[minGrpIdx[0]] + pSelDsY[minGrpIdx[1]] + 1) >> 1 (390)
minC = (pSelC[minGrpIdx[0]] + pSelC[minGrpIdx[1]] + 1) >> 1 (391)
7. 변수 a, b, 및 k들은 다음과 같이 유도된다:
- numSampL이 0이고, numSampT가 0이면 다음이 적용된다:
k = 0 (392)
a = 0 (393)
b = 1 << (BitDepth - 1) (394)
- 그렇지 않으면 다음이 적용된다:
diff = maxY - minY (395)
- diff가 0이 아니면, 다음이 적용된다:
diffC = maxC - minC (396)
x = Floor(Log2(diff)) (397)
normDiff = ((diff << 4) >> x) & 15 (398)
x += (normDiff ! = 0) ? 1 : 0 (399)
y = Abs(diffC) > 0 ? Floor(Log2(Abs(diffC))) + 1 : 0 (400)
a = (diffC * (divSigTable[normDiff] | 8) + 2y - 1) >> y (401)
k = ((3 + x - y) < 1) 1 : 3 + x - y (402)
a = ((3 + x - y) < 1) ? Sign(a) * 15 : a (403)
b = minC - ((a * minY) >> k) (404)
여기서 divSigTable[ ]은 다음과 같이 명시된다:
divSigTable[ ] = { 0, 7, 6, 5, 5, 4, 4, 3, 3, 2, 2, 1, 1, 1, 1, 0 } (405)
- 그렇지 않으면(diff가 0이면), 다음이 적용된다:
k = 0 (406)
a = 0 (407)
b = minC (408)
8. 예측 샘플 predSamples[x][y](여기서 x = 0... nTbW - 1, y = 0... nTbH - 1)들은 다음과 같이 유도된다:
predSamples[x][y] = Clip1(((pDsY[x][y] * a) >> k) + b) (409)
참고(NOTE) - 이 프로세스는 sps_chroma_vertical_collocated_flag을 사용한다. 그러니 구현을 간략화하기 위해 sps_chroma_horizontal_collocated_flag을 사용하지 않는다.
5.29. 실시예 29(Embodiment 29)
JVET-QP2001-vE에 명시된 작업 초안이 다음과 같이 변경될 수 있다
8.4.5.2.13 INTRA_LT_CCLM, INTRA_L_CCLM and INTRA_T_CCLM 인트라 예측 모드의 사양(Specification of INTRA_LT_CCLM, INTRA_L_CCLM and INTRA_T_CCLM intra prediction mode)
예측 샘플 predSamples[x][y](여기서 x= 0... nTbW - 1, y = 0.. nTbH - 1)들은 다음과 같이 유도된다:
- numSampL 및 numSampT 모두 0이면 다음이 적용된다:
predSamples[x][y] = 1 << (BitDepth - 1) (359)
- 그렇지 않으면 다음 순서의 단계들이 적용된다:
1. 동치(collocated) 루마 샘플 pY[x][y](여기서 x = 0... nTbW * SubWidthC - 1, y = 0... nTbH * SubHeightC - 1)들은 위치(xTbY + x, yTbY + y)들에서의 디블록킹 필터 처리에 앞서 재현된 루마 샘플들과 같게 설정된다.
2. 이웃 루마 샘플 pY[x][y]들은 다음과 같이 유도된다:
- [[numSampL이 0보다 크면]] availL이 TRUE이면 , 이웃 좌측 루마 샘플 pY[x][y](여기서 x = -1... -3, y = 0... SubHeightC * max( numSampL , nTbH) - 1)들은 위치(xTbY + x, yTbY +y)들에서의 디블록킹 필터 처리 전에 재현 루마 샘플들과 같게 설정된다.
- availT가 FALSE이면, 이웃 상측 루마 샘플 pY[x][y](여기서 x = -1... SubWidthC * numSampT - 1, y = -1... -2)들은 루마 샘플 pY[x][0]들과 같게 설정된다.
- availL이 FALSE이면, 이웃 좌측 루마 샘플 pY[x][y](여기서 x = -1... -3, y = -1... SubHeightC * numSampL - 1)들은 루마 샘플 pY[0][y]들과 같게 설정된다.
- [[numSampL이 0보다 크면]] availT이 TRUE이면 , 이웃 상측 루마 샘플 pY[x][y](여기서 x = 0... SubWidthC * max( numSampL , nTbW) - 1) - 1, y = -1, -2)들은 위치(xTbY + x, yTbY + y)에서의 디블록킹 필터 처리 전에 재현 루마 샘플들과 같게 설정된다.
- availTL이 TRUE이면, 이웃 상-좌 루마 샘플 pY[x][y](여기서 x = -1, y = -1, -2)들은 위치(xTbY + x, yTbY + y)에서의 디블록킹 필터 처리 전에 재현 루마 샘플들과 같게 설정된다.
5.30. 실시예 30(Embodiment 30)
JVET-Q2001-vE에 명시된 작업 초안이 다음과 같이 변경될 수 있다
8.4.5.2.13 INTRA_LT_CCLM, INTRA_L_CCLM and INTRA_T_CCLM 인트라 예측 모드의 사양(Specification of INTRA_LT_CCLM, INTRA_L_CCLM and INTRA_T_CCLM intra prediction mode)
예측 샘플 predSamples[x][y](여기서 x= 0... nTbW - 1, y = 0.. nTbH - 1)들은 다음과 같이 유도된다:
- numSampL 및 numSampT 모두 0이면 다음이 적용된다:
predSamples[x][y] = 1 << (BitDepth - 1) (359)
- 그렇지 않으면 다음 순서의 단계들이 적용된다:
1. 동치(collocated) 루마 샘플 pY[x][y](여기서 x = 0... nTbW * SubWidthC - 1, y = 0... nTbH * SubHeightC - 1)들은 위치(xTbY + x, yTbY + y)들에서의 디블록킹 필터 처리에 앞서 재현된 루마 샘플들과 같게 설정된다.
2. 이웃 루마 샘플 pY[x][y]들은 다음과 같이 유도된다:
- numSampL이 0보다 크면, 이웃 좌측 루마 샘플 pY[x][y](여기서 x = -1... -3, y = 0... SubHeightC * numSampL - 1)들은 위치(xTbY + x, yTbY +y)들에서의 디블록킹 필터 처리 전에 재현 루마 샘플들과 같게 설정된다.
- numSampL이 0이고 availL이 TRUE이면, 이웃 좌측 루마 샘플 pY[x][y](여기서 x = -1, y = 0... SubHeightC * nTbH - 1)들은 위치(xTbY + x, yTbY + y)들에서의 디블록킹 필터 프로세스 이전의 재현 루마 샘플들과 같게 설정된다.
- availT가 FALSE이면, 이웃 상측 루마 샘플 pY[x][y](여기서 x = -1... SubWidthC * numSampT - 1, y = -1... -2)들은 루마 샘플 pY[x][0]들과 같게 설정된다.
- availL이 FALSE이면, 이웃 좌측 루마 샘플 pY[x][y](여기서 x = -1... -3, y = -1... SubHeightC * numSampL - 1)들은 루마 샘플 pY[0][y]들과 같게 설정된다.
- numSampL이 0보다 크면, 이웃 상측 루마 샘플 pY[x][y](여기서 x = 0... SubWidthC * numSampL - 1) - 1, y = -1, -2)들은 위치(xTbY + x, yTbY + y)에서의 디블록킹 필터 처리 전에 재현 루마 샘플들과 같게 설정된다.
- numSampT가 0이고 availT가 TRUE이면, 이웃 상측 루마 샘플 pY[x][y](여기서 x = 0... SubWidthC * nTbW - 1, y = - 1)들은 위치(xTbY + x, yTbY + y)들에서의 디블록킹 필터 프로세스 이전의 재현 루마 샘플들과 같게 설정된다.
- availTL이 TRUE이면, 이웃 상-좌 루마 샘플 pY[x][y](여기서 x = -1, y = -1, -2)들은 위치(xTbY + x, yTbY + y)에서의 디블록킹 필터 처리 전에 재현 루마 샘플들과 같게 설정된다.
5.31. 실시예 31(Embodiment 31)
JVET-Q2001-vE에 명시된 작업 초안이 다음과 같이 변경될 수 있다
8.4.5.2.13 INTRA_LT_CCLM, INTRA_L_CCLM and INTRA_T_CCLM 인트라 예측 모드의 사양(Specification of INTRA_LT_CCLM, INTRA_L_CCLM and INTRA_T_CCLM intra prediction mode)
이 프로세스에 대한 입력들은:
- 인트라 예측 모드 predModeIntra,
- 현재 픽처의 상-좌 샘플에 대한 현재 변환 블록의 상좌 샘플의 샘플 위치(xTbC, yTbC),
- 변환 블록 폭을 명시하는 변수 nTbW,
- 변환 블록 높이를 명시하는 변수 nTbH,
- 현재 블록의 색상 성분을 명시하는 변수 cIdx,
- 크로마 이웃 샘플들 p[x][y], 여기서 x = -1, y = 0... 2 * nTbH - 1 및 x = 0... 2 * nTbW - 1, y = -1.
이 프로세스의 출력은 예측된 샘플들 predSamples[x][y]인데, 여기서 x = 0... nTbW - 1, y = 0... nTbH - 1.
현재 루마 위치(xTbY, yTbY)는 다음과 같이 유도된다:
(xTbY, yTbY) = (xTbC<<(SubWidthC - 1), yTbC << (SubHeightC - 1)) (351)
변수 availL, availT, 및 availTL들은 다음과 같이 유도된다:
- 6.4.4 절(clause)에 명시된 바와 같은 인접 블록 사용 가능성에 대한 유도 프로세스는, (xTbY, yTbY)로 설정된 현재 루마 위치(xCurr, yCurr), 이웃 루마 위치 (xTbY - 1, yTbY), FALSE로 설정된 checkPredModeY, 및 cIdx를 입력으로 하여 실행되어지고, 출력은 availL 로 할당된다.
- 6.4.4 절(clause)에 명시된 바와 같은 인접 블록 사용 가능성에 대한 유도 프로세스는, (xTbY, yTbY)로 설정된 현재 루마 위치(xCurr, yCurr), 이웃 루마 위치 (xTbY, yTbY - 1), FALSE로 설정된 checkPredModeY, 및 cIdx를 입력으로 하여 실행되어지고, 출력은 availT 로 할당된다.
- 변수 availTL은 다음과 같이 유도된다:
availTL = availL && availT (352)
- 사용 가능한 상-우 이웃 크로마 샘플들의 수는 다음과 같이 유도된다:
- 변수 numTopRight가 0과 같게 설정되고 availTR이 TRUE와 같게 설정된다.
- predModeIntra가 INTRA_T_CCLM,과 같을 때, availTR이 FALSE이거나 x가 2 * nTbW - 1이 될 때까지 다음이 x = nTbW... 2 * nTbW - 1에 적용된다:
- 6.4.4 절(clause)에 명시된 바와 같은 인접 블록 사용 가능성에 대한 유도 프로세스는, (xTbY, yTbY)로 설정된 현재 루마 위치(xCurr, yCurr), 이웃 루마 위치 (xTbY + x, yTbY - 1), FALSE로 설정된 checkPredModeY, 및 cIdx를 입력으로 하여 실행되어지고, 출력은 availTR 로 할당된다.
- availTR이 TRUE일 때, numTopRight가 1만큼 증분된다.
- 사용 가능한 좌-하(left-below) 이웃 크로마 샘플들의 수 numLeftBelow는 다음과 같이 유도된다:
- 변수 numLeftBelow가 0과 같게 설정되고 availLB가 TRUE와 같게 설정된다.
- predModeIntra가 INTRA_L_CCLM일 때, availLB가 FALSE이거나 y가 2 * nTbH - 1이 될 때까지 ekdmaa이 y = nTbH... 2 * nTbH - 1에 적용되고:
- 6.4.4 절(clause)에 명시된 바와 같은 인접 블록 사용 가능성에 대한 유도 프로세스는, (xTbY, yTbY)로 설정된 현재 루마 위치(xCurr, yCurr), 이웃 루마 위치 (xTbY - 1, yTbY + y), FALSE로 설정된 checkPredModeY, 및 cIdx를 입력으로 하여 실행되어지고, 출력은 availLB 로 할당된다.
- availLB가 TRUE일 때, numLeftBelow가 1만큼 증분된다.
상측 및 상-우측 상의 사용 가능한 이웃 크로마 샘플들의 수 numSampT와 좌측 및 좌-하측 상의 사용 가능한 이웃 크로마 샘플들의 수 numSampL은 다음과 같이 유도된다:
- predModeIntra가 INTRA_LT_CCLM이면, 다음이 적용된다:
numSampT = availT ? nTbW : 0 (353)
numSampL = availL ? nTbH : 0 (354)
- 그렇지 않으면 다음이 적용된다:
numSampT = (availT && predModeIntra = = INTRA_T_CCLM) ? (nTbW + Min(numTopRight, nTbH)) : 0 (355)
numSampL = (availL && predModeIntra = = INTRA_L_CCLM) ? (nTbH + Min(numLeftBelow, nTbW)) : 0 (356)
변수 bCTUboundary는 다음과 같이 유도된다:
bCTUboundary = (yTbY & (CtbSizeY - 1) = = 0) ? TRUE : FALSE (357)
변수 cntN와 N이 L 및 T로 치환된 행렬(array) pickPosN은 다음과 같이 유도되는데 :
- 변수 numIs4N은 다음과 같이 유도된다:
numIs4N = ((availT && availL && predModeIntra = = INTRA_LT_CCLM) ? 0 : 1) (358)
- 변수 startPosN이 numSampN >> (2 + numIs4N)과 같게 설정된다.
- 변수 pickStepN 이 Max(1, numSampN >> (1 + numIs4N))과 같게 설정된다.
- availN이 TRUE이고 predModeIntra가 INTRA_LT_CCLM 또는 INTRA_N_CCLM이면, 다음 할당이 이뤄지는데:
- cntN이 Min(numSampN, (1 + numIs4N) << 1)와 같게 설정된다.
- pickPosN[pos]가 (startPosN = pos * pickStepN)와 같게 설정되는데, 여기서 pos = 0... cntN - 1.
- 그렇지 않으면 cntN이 0과 같게 설정된다.
변수 bVerticalCollocated가 0으로 설정된다.
예측 샘플 predSamples[x][y](여기서 x= 0... nTbW - 1, y = 0.. nTbH - 1)들은 다음과 같이 유도된다:
- numSampL 및 numSampT 모두 0이면 다음이 적용된다:
predSamples[x][y] = 1 << (BitDepth - 1) (359)
- 그렇지 않으면 다음 순서의 단계들이 적용된다:
1. 동치(collocated) 루마 샘플 pY[x][y](여기서 x = 0... nTbW * SubWidthC - 1, y = 0... nTbH * SubHeightC - 1)들은 위치(xTbY + x, yTbY + y)들에서의 디블록킹 필터 처리에 앞서 재현된 루마 샘플들과 같게 설정된다.
2. 이웃 루마 샘플 pY[x][y]들은 다음과 같이 유도된다:
- numSampL이 0보다 크면, 이웃 좌측 루마 샘플 pY[x][y](여기서 x = -1... -3, y = 0... SubHeightC*numSampL - 1)들은 위치(xTbY + x, yTbY +y)들에서의 디블록킹 필터 처리 전에 재현 루마 샘플들과 같게 설정된다.
- availT가 FALSE이면, 이웃 상측 루마 샘플 pY[x][y](여기서 x = -1... SubWidthC * numSampT - 1, y = -1... -2)들은 루마 샘플 pY[x][0]들과 같게 설정된다.
- availL이 FALSE이면, 이웃 좌측 루마 샘플 pY[x][y](여기서 x = -1... -3, y = -1... SubHeightC * numSampL - 1)들은 루마 샘플 pY[0][y]들과 같게 설정된다.
- numSampT가 0보다 크면, 이웃 상측 루마 샘플 pY[x][y](여기서 x = 0... SubWidthC * numSampT - 1, y = -1, -2)들은 위치(xTbY + x, yTbY + y)에서의 디블록킹 필터 처리 전에 재현 루마 샘플들과 같게 설정된다.
- availTL이 TRUE이면, 이웃 상-좌 루마 샘플 pY[x][y](여기서 x = -1, y = -1, -2)들은 위치(xTbY + x, yTbY + y)에서의 디블록킹 필터 처리 전에 재현 루마 샘플들과 같게 설정된다.
3. 다운샘플링된 동치 루마 샘플 pDsY[x][y](여기서 x = 0... nTbW - 1, y = 0... nTbH - 1)들은 다음과 같이 유도된다:
- SubWidthC 및 SubHeightC 양자 모두 1이면, 다음이 적용된다:
- pDsY[x][y](여기서 x = 1... nTbW - 1, y = 1... nTbH - 1)는 다음과 같이 유도된다:
pDstY[x][y] = pY[x][y] (360)
- 그렇지 않으면 다음이 적용된다:
- 1차원 필터계수 행렬 F1 및 F2와 2차원 필터 계수 행렬 F3 및 F4는 다음과 같이 명시된다:
F1[0] = 2, F1[1] = 0 (361)
F2[0] = 1, F2[1]  = 2, F2[2] = 1 (362)
F3[i][j] = F4[i][j] = 0(여기서 I = 0... 2, j = 0... 2 (363)
- SubWidthC 및 SubHeightC 양자 모두 2이면, 다음이 적용된다:
F1[0] = 1, F1[1] = 1 (364)
F3[0][1] = 1, F3[1][1] = 4, F3[2][1] = 1, F3[1][0] = 1, F3[1][2] = 1 (365)
F4[0][1] = 1, F4[1][1] = 2, F4[2][1] = 1 (366)
F4[0][2] = 1, F4[1][2] = 2, F4[2][2] = 1 (367)
bVerticalCollocated = sps_chroma_vertical_collocated_flag
- 그렇지 않으면 다음이 적용된다:
F3[1][1] = 8 (368)
F4[0][1] = 2, F4[1][1] = 4, F4[2][1] = 2, (369)
bVerticalCollocated = 0
- [[sps_chroma_vertical_collocated_flag이]] bVerticalCollocated 가 1이면, 다음이 적용된다:
- pDsY[x][y](여기서 x = 0... nTbW - 1, y = 0... nTbH - 1)응 다음과 같이 유도된다:
pDsY[x][y] = (F3[1][0] * pY[SubWidthC * x][SubHeightC * y - 1] + F3[0][1] * pY[SubWidthC * x - 1][SubHeightC * y] +
F3[1][1] * pY[SubWidthC * x][SubHeightC * y] +
F3[2][1] * pY[SubWidthC * x + 1 ][ SubHeightC * y] + F3[1][2] * pY[SubWidthC * x][SubHeightC * y + 1] + 4) >> 3 (370)
- 그렇지 않으면([[sps_chroma_vertical_collocated_flag이]] bVerticalCollocated 가 0이면), 다음이 적용된다:
- pDsY[x][y](여기서 x = 0... nTbW - 1, y = 0... nTbH - 1)는 다음과 같이 유도된다:
pDsY[x][y] = (F4[0][1] * pY[SubWidthC * x - 1][SubHeightC * y] +
F4[0][2] * pY[SubWidthC * x - 1][SubHeightC * y + 1] +
F4[1][1] * pY[SubWidthC * x][SubHeightC * y] +
F4[1][2] * pY[SubWidthC * x][SubHeightC * y + 1] +
F4[2][1] * pY[SubWidthC * x + 1][SubHeightC * y] +
F4[2][2] * pY[SubWidthC * x + 1][SubHeightC * y + 1] + 4) >> 3 (371)
4. numSampL가 0보다 크면, 선택된 좌측 크로마 샘플 pSelC[idx]들은 p[-1][pickPosL[idx]](여기서 idx = 0... cntL = 1)와 같게 설정되고, 선택된 다운샘플링된 이웃 좌측 루마 샘플 pSelDsY[idx](여기서 idx = 0... cntL - 1)들은 다음과 같이 유도된다:
- 변수 y가 pickPosL[idx]와 같게 설정된다.
- SubWidthC 및 SubHeightC 양자 모두 1이면, 다음이 적용된다:
pSelDsY[idx] = pY[-1][y] (372)
- 그렇지 않으면 다음이 적용된다:
- [[sps_chroma_vertical_collocated_flag이]] bVerticalCollocated 가 1이면 다음이 적용된다:
pSelDsY[idx] = (F3[1][0] * pY[-SubWidthC][SubHeightC * y - 1] +
F3[0][1] * pY[-SubWidthC][SubHeightC * y] +
F3[1][1] * pY[-SubWidthC][SubHeightC * y] +
F3[2][1] * pY[1 - SubWidthC][SubHeightC * y] +
F3[1][2] * pY[-SubWidthC][SubHeightC * y + 1] + 4 ) >> 3 (373)
- 그렇지 않으면([[sps_chroma_vertical_collocated_flag이]] bVerticalCollocated 가 0이면) 다음이 적용된다:
pSelDsY[idx] = (F4[0][1] * pY[-1 - SubWidthC][SubHeightC * y]+
F4[0][2] * pY[-1 - SubWidthC][SubHeightC * y + 1] +
F4[1][1] * pY[-SubWidthC][SubHeightC * y] +
F4[1][2] * pY[-SubWidthC][SubHeightC * y + 1] +
F4[2][1] * pY[1 - SubWidthC][SubHeightC * y ] +
F4[2][2] * pY[1 - SubWidthC][SubHeightC * y + 1] + 4) >> 3 (374)
5. numSampT가 0보다 크면, 선택된 이웃 상측 크로마 샘플 pSelC[idx]들은 p[pickPosT[idx - cntL]][-1](여기서 idx = cntL... cntL + cntT - 1)과 같게 설정되고, 다운샘플링된 이웃 상측 루마 샘플 pSelDsY[idx](여기서 idx = [[0]] cntL ... cntL + cntT - 1)들은 다음과 같이 명시되는데:
- 변수 x는 pickPosT[idx - cntL]와 같게 설정된다.
- SubWidthC 및 SubHeightC 양자 모두 1이면. 다음이 적용된다:
pSelDsY[idx] = pY[x][-1] (375)
- 그렇지 않으면 다음이 적용된다:
- [[sps_chroma_vertical_collocated_flag이]] bVerticalCollocated 가 1이면, 다음이 적용된다:
- bCTUboundary가 FALSE이면, 다음이 적용된다:
pSelDsY[idx] = (F3[1][0] * pY[SubWidthC * x][-1 - SubHeightC]+
F3[0][1] * pY[SubWidthC * x - 1][-SubHeightC] +
F3[1][1] * pY[SubWidthC * x][-SubHeightC] +
F3[2][1] * pY[SubWidthC * x + 1][-SubHeightC] +
F3[1][2] * pY[SubWidthC * x][1 - SubHeightC] + 4) >> 3 (376)
- 그렇지 않으면(bCTUboundary가 TRUE이면), 다음이 적용된다:
pSelDsY[idx] = (F2[0] * pY[SubWidthC * x - 1][-1] +
F2[1] * pY[SubWidthC * x][-1] +
F2[2] * pY[SubWidthC * x + 1][-1] + 2) >> 2 (377)
- 그렇지 않으면([[sps_chroma_vertical_collocated_flag이]] bVerticalCollocated 가 0이면), 다음이 적용된다:
- bCTUboundary가 FALSE이면, 다음이 적용된다:
pSelDsY[idx] = (F4[0][1] * pY[SubWidthC * x - 1][-1] +
F4[0][2] * pY[SubWidthC * x - 1][-2] +
F4[1][1] * pY[SubWidthC * x][-1] +
F4[1][2] * pY[SubWidthC * x][-2] +
F4[2][1] * pY[SubWidthC * x + 1][-1] +
F4[2][2] * pY[SubWidthC * x + 1][-2] + 4) >> 3(378)
- 그렇지 않으면(bCTUboundary가 TRUE이면), 다음이 적용된다:
pSelDsY[idx] = (F2[0] * pY[SubWidthC * x - 1][-1] +
F2[1] * pY[SubWidthC * x][-1] +
F2[2] * pY[SubWidthC * x + 1][-1] + 2) >> 2 (379)
6. cntT + cntL이 0이 아니면, 변수 minY, maxY, minC, 및 maxC들이 다음과 같이 유도된다:
- cntT + cntL가 2이면, pSelComp[3]이 pSelComp[0]와 같게 설정되고, pSelComp[2]가 pSelComp[1]와 같게 설정되며, pSelComp[0]이 pSelComp[1]와 같게 설정되고, 그리고 pSelComp[1]가 pSelComp[3]와 같게 설정되는데 여기서 Comp는 DsY 및 C로 치환된다.
- 행렬 minGrpIdx 및 maxGrpIdx들은 다음과 같이 유도된다:
minGrpIdx[0] = 0 (380)
minGrpIdx[1] = 2 (381)
maxGrpIdx[0] = 1 (382)
maxGrpIdx[1] = 3 (383)
- pSelDsY[minGrpIdx[0]]이 pSelDsY[minGrpIdx[1]]보다 크면, minGrpIdx[0]과 minGrpIdx[1]들이 다음과 같이 스왑된다(swapped):
(minGrpIdx[0], minGrpIdx[1]) = Swap(minGrpIdx[0], minGrpIdx[1]) (384)
- pSelDsY[maxGrpIdx[0]]이 pSelDsY[maxGrpIdx[1]]보다 크면, maxGrpIdx[0]과 maxGrpIdx[1]들이 다음과 같이 스왑된다:
(maxGrpIdx[0], maxGrpIdx[1]) = Swap(maxGrpIdx[0], maxGrpIdx[1]) (385)
- pSelDsY[minGrpIdx[0]]이 pSelDsY[maxGrpIdx[1]]보다 크면, 행렬 minGrpIdx와 maxGrpIdx들이 다음과 같이 스왑된다:
(minGrpIdx, maxGrpIdx) = Swap(minGrpIdx, maxGrpIdx) (386)
- pSelDsY[minGrpIdx[1]]이 pSelDsY[maxGrpIdx[0]]보다 크면, minGrpIdx[1]와 maxGrpIdx[0]들이 다음과 같이 스왑된다:
(minGrpIdx[1], maxGrpIdx[0]) = Swap(minGrpIdx[1], maxGrpIdx[0]) (387)
- 변수 maxY, maxC, minY, 및 minC들은 다음과 같이 유도된다:
maxY = (pSelDsY[maxGrpIdx[0]] + pSelDsY[maxGrpIdx[1]] + 1) >> 1 (388)
maxC = (pSelC[maxGrpIdx[0]] + pSelC[maxGrpIdx[1]] + 1) >> 1 (389)
minY = (pSelDsY[minGrpIdx[0]] + pSelDsY[minGrpIdx[1]] + 1) >> 1 (390)
minC = (pSelC[minGrpIdx[0]] + pSelC[minGrpIdx[1]] + 1) >> 1 (391)
7. 변수 a, b, 및 k들은 다음과 같이 유도된다:
- numSampL이 0이고, numSampT가 0이면 다음이 적용된다:
k = 0 (392)
a = 0 (393)
b = 1 << (BitDepth - 1) (394)
- 그렇지 않으면 다음이 적용된다:
diff = maxY - minY (395)
- diff가 0이 아니면, 다음이 적용된다:
diffC = maxC - minC (396)
x = Floor(Log2(diff)) (397)
normDiff = ((diff << 4) >> x) & 15 (398)
x += (normDiff ! = 0) ? 1 : 0 (399)
y = Abs(diffC) > 0 ? Floor(Log2(Abs(diffC))) + 1 : 0 (400)
a = (diffC * (divSigTable[normDiff] | 8) + 2y - 1) >> y (401)
k = ((3 + x - y) < 1) 1 : 3 + x - y (402)
a = ((3 + x - y) < 1) ? Sign(a) * 15 : a (403)
b = minC - ((a * minY) >> k) (404)
여기서 divSigTable[ ]은 다음과 같이 명시된다:
divSigTable[ ] = { 0, 7, 6, 5, 5, 4, 4, 3, 3, 2, 2, 1, 1, 1, 1, 0 } (405)
- 그렇지 않으면(diff가 0이면), 다음이 적용된다:
k = 0 (406)
a = 0 (407)
b = minC (408)
8. 예측 샘플 predSamples[x][y](여기서 x = 0... nTbW - 1, y = 0... nTbH - 1)들은 다음과 같이 유도된다:
predSamples[x][y] = Clip1(((pDsY[x][y] * a) >> k) + b) (409)
참고(NOTE) - 이 프로세스는 sps_chroma_vertical_collocated_flag을 사용한다. 그러니 구현을 간략화하기 위해 sps_chroma_horizontal_collocated_flag을 사용하지 않는다.
도 9는 비디오 처리 장치(900)의 블록도이다. 장치(900)는 이 명세서에 기재된 하나 이상의 방법들을 구현하는 데 사용될 수 있다. 장치(900)는 스마트폰, 태블릿, 컴퓨터, 사물인터넷(Internet of Things; IoT) 수신기 등으로 구현될 수 있다. 장치(900)는 하나 이상의 프로세서(902)들, 하나 이상의 메모리(904)들, 및 비디오 처리 하드웨어(906)를 포함할 수 있다. 프로세서(들)(902)는 이 명세서에 기재된 하나 이상의 방법들을 구현하도록 구성될 수 있다. 메모리(메모리들)(904)는 이 명세서에 기재된 방법 및 기법들을 구현하는 데 사용되는 데이터 및 코드(code)를 저장하는 데 사용될 수 있다. 비디오 처리 하드웨어(906)는 하드웨어 회로 내에서 (예를 들어 이전 섹션에 열거된 것들 등) 이 명세서에 기재된 일부 기법들을 구현하는 데 사용될 수 있다.
도 10은 비디오 인코더의 블록도를 보인다.
도 11은 비디오를 처리하는 방법(1100)의 흐름도이다. 이 방법(1100)은 비디오의 크로마 블록과 이 비디오의 코딩된 표현 간의 변환을 위해, 다운샘플링 필터를 사용하여 동치(collocated) 루마 블록의 N(여기서 N은 양의 정수)줄 위의 이웃 라인들에서 생성된 다운샘플링된 동치 이웃 상측 루마 샘플들을 사용하여 교차 성분 선형 모델(cross-component linear model)의 파라미터들을 유도하는 단계(1102)와, 상기 교차 성분 선형 모델을 사용하여 생성된 예측된 크로마 블록을 사용하여 변환을 수행하는 단계(1104)를 포함한다.
도 12는 본 발명 기법들이 구현되는 예시적 비디오 처리 시스템의 블록도이다.
도 12는 이 명세서에 기재된 다양한 기법들이 구현될 수 있는 예시적 비디오 처리 시스템(1200)을 보이는 블록도이다. 다양한 구현예들은 시스템(1200)의 컴포넌트들의 일부 또는 전부를 포함할 수 있다. 시스템(1200)은 비디오 콘텐츠(video content)를 수신하기 위한 입력(1202)을 포함할 수 있다. 이 비디오 콘텐츠는 미가공(raw), 즉 압축되지 않은 포맷, 예를 들어 8 또는 10 비트 다중 성분(multi-component) 화소값들로 수신되거나, 압축 또는 인코딩된 포맷이 될 수 있다. 입력(122)은 네트워크 인터페이스(network interface), 주변기기 인터페이스(peripheral bus interface), 또는 저장장치 인터페이스(storage interface)를 나타낼 수 있다. 네트워크 인터페이스의 예들은 이더넷(Ethernet), 수동 광 네트워크(passive optical network; PON) 등의 유선 인터페이스와 Wi-Fi 또는 휴대폰 인터페이스(cellular interface) 등의 무선 인터페이스를 포함한다.
시스템(1200)은 이 명세서에 기재된 다양한 코딩 또는 인코딩 방법들을 구현할 수 있는 코딩 컴포넌트(coding component; 1204)를 포함할 수 있다. 코딩 컴포넌트(1204)는 입력(1202)로부터의 비디오의 코딩 컴포넌트(1204)의 출력으로의 평균 비트 전송속도(average bitrate)를 저감시켜 비디오의 코딩된 표현(coded representation)을 산출할 수 있다. 이에 따라 코딩 기법들은 때로 비디오 압축 또는 비디오 변환코딩(transcoding) 기법으로 지칭된다. 코딩 컴포넌트(1204)의 출력은 컴포넌트(1206)로 표현된 바와 같이 저장되거나, 연결된 통신을 통해 전송될 수 있다. 입력(1202)에서 수신된 비디오의 저장 또는 통신되는 비트스트림 (또는 코딩된) 표현은 컴포넌트(1208)에 사용되어 디스플레이 인터페이스(display interface; 1210)로 전송되는 화소값 또는 화상 표시 가능한(displayable) 비디오를 생성한다. 비트스트림 표현으로부터 사용자가 볼 수 있는 비디오를 생성하는 프로세스는 때로 비디오 압축해제로 지칭된다. 또한 어떤 비디오 처리 작동들이 "코딩(coding)" 작동 또는 툴로 지칭된다면, 이 코딩 툴 또는 작동들이 인코더 또는 대응 디코딩 툴에서 사용되거나 코딩의 결과를 반전시키는 작동이 디코더에 의해 수행된다는 것을 이해해야 할 것이다.
주변기기 버스 인터페이스 또는 디스플레이 인터페이스의 예는 범용 직렬 버스(universal serial bus; USB) 또는 고화질 멀티미디어 인터페이스(high definition multimedia interface; HDMI) 또는 디스플레이포트(Displayport)를 포함할 수 있다. 저장장치 인터페이스의 예는 SATA(직렬 고급 기술 결합; serial advanced technology attachment), PCI, IDE 인터페이스 등을 포함한다. 이 명세서에 기재된 기법들은 휴대폰, 랩탑, 스마트폰 등의 전자기기 또는 디지털 데이터 처리 및/또는 비디오 디스플레이를 수행할 수 있는 다른 기기로 구현될 수 있다.
도 14는 본 발명의 기법들을 활용할 수 있는 예시적 비디오 시스템(100)을 도시하는 블록도이다.
도 14에 도시된 바와 같이, 비디오 코딩 시스템(100)은 소스 디바이스(source device; 110)와 목적지 디바이스(destination device; 120)를 포함한다. 소스 디바이스(110)는 인코딩된 비디오 데이터를 생성할 수 있어 비디오 인코딩 장치로 지칭될 수 있다. 목적지 디바이스(120)는 소스 디바이스(110)로 인코딩된 비디오 데이터를 디코딩할 수 있어서 비디오 디코딩 장치로 지칭될 수 있다.
소스 디바이스(110)는 비디오 소스(112)와, 비디오 인코더(114)와, 및 입출력(I/O) 인터페이스(116)를 포함할 수 있다.
비디오 소스(112)는 비디오 캡처 장치, 비디오 콘텐츠 제공자로부터 비디오 데이터를 수신하는 인터페이스, 및/또는 비디오 콘텐츠를 생성하는 컴퓨터 그래픽 시스템, 또는 이러한 소스들의 조합을 포함할 수 있다. 비디오 데이터는 하나 이상의 픽처(picture)들을 포함할 수 있다. 비디오 인코더(114)는 비디오 소스(112)로부터의 비디오 데이터를 인코딩하여 비트스트림을 생성한다. 이 비트스트림은 비디오 데이터의 코딩된 표현을 형성하는 비트들의 시퀀스를 포함할 수 있다. 이 비트스트림은 코딩된 픽처들과 관련 데이터를 포함할 수 있다. 코딩된 픽처은 픽처의 코딩된 표현이다. 관련 데이터는 시퀀스 파라미터 세트(set)들, 픽처 파라미터 세트들, 및 다른 신택스 구조들을 포함할 수 있다. I/O 인터페이스(116)는 변조기/복조기(모뎀) 및/또는 송신기를 포함할 수 있다. 인코딩된 비디오 데이터는 I/O 인터페이스(116)을 거치고 네트워크(130a)을 통해 목적지 디바이스(120)에 직접 전송될 수 있다. 인코딩된 비디오 데이터는 또한 원격 장치(destination device 120)에 액세스(access)되도록 저장 매체/서버(130b)에 저장될 수 있다.
목적지 디바이스(120)는 I/O 인터페이스(126), 비디오 디코더(124), 및 디스플레이 장치(122)를 포함할 수 있다.
I/O 인터페이스(126)는 수신기 및/또는 모뎀을 포함할 수 있다. I/O 인터페이스(126)는 소스 디바이스(110) 또는 저장매체/서버(130b)로부터 인코딩된 비디오 데이터를 취득한다. 비디오 디코더(124)가 인코딩된 비디오 데이터를 디코딩할 수 있다. 디스플레이 장치(122)는 목적지 디바이스(120)와 통합되거나, 외부 디스플레이 장치에 접속하도록 구성된 목적지 디바이스(120) 외부에 존재할 수 있다.
비디오 인코더(114) 및 비디오 디코더(124)는 고효율 비디오 코딩(High Efficiency Video Coding; HEVC) 표준, 다목적 비디오 코딩(Versatile Video Coding; VVC) 표준, 및 다른 현재 및/또는 미래 표준들 등의 비디오 압축 표준에 따라 작동될 수 있다.
도 15는 비디오 인코더(200)의 예를 보이는 블록도인데, 이는 도 14에 도시된 시스템(100)의 비디오 인코더(114)가 될 수 있다.
비디오 인코더(200)는 본 발명 기법들의 일부 또는 전부를 수행하도록 구성될 수 있다. 도 15의 예에서, 비디오 인코더(200)는 복수의 기능 컴포넌트들을 포함할 수 있다. 이 명세서에 기재된 기법들은 비디오 인코더(200)의 여러 컴포넌트들 간에 공유될 수 있다. 일부 예들에서, 프로세서는 이 명세서에 기재된 기법들의 일부 또는 전부를 수행하도록 구성될 수 있다.
비디오 인코더(200)의 기능 컴포넌트들은 분할부(partition unit; 201), 모드 선택부(203)을 포함할 수 있는 예측부(predication unit; 202), 움직임 추정부(motion estimation unit; 204), 움직임 보상부(motion compensation unit; 205)과 인트라 예측부(intra prediction unit; 206), 잔차 생성부(residual generation unit; 207), 변환부(transform unit; 208), 양자화부(quantization unit; 209), 역양자화부(inverse quantization unit; 210), 역변환부(inverse transform unit; 211), 재현부(reconstruction unit; 212), 버퍼(buffer; 213), 및 엔트로피 인코딩부(entropy encoding unit; 214).
다른 예들에서, 비디오 인코더(200)는 더 많거나 더 적거나 다른 기능 컴포넌트를 포함할 수 있다. 하나의 예에서, 예측부(202)는 인트라 블록 복사(intra block copy; IBC)부를 포함할 수 있다. 이 IBC부는, 적어도 하나의 참조 픽처(reference picture)가 현재 비디오 블록이 위치한 픽처인 IBC 모드에서의 예측을 수행할 수 있다.
또한 움직임 추정부(204)과 움직임 보상부(205) 등의 일부 컴포넌트들은 고도로 통합되지만(highly integrated), 도 15의 예에서는 설명의 목적상 분리 표시되어 있다.
분할부(201)는 픽처을 하나 이상의 비디오 블록들로 구획할 수 있다. 비디오 인코더(200) 및 비디오 디코더(300)는 다양한 비디오 블록 크기들을 지원할 수 있다.
모드 선택부(203)는 예를 들어 오류 결과들에 기반하여 인트라(intra) 또는 인터(inter)의 코딩 모드들 중의 하나를 선택하고, 결과적인 인트라 또는 인터 코딩된 블록을 잔차 생성부(207)에 공급하여 잔차 블록 데이터를 생성하고 재현부(212)에 공급하여 참조 픽처으로 사용될 인코딩될 블록을 재현할 수 있다. 일부 예들에서, 모드 선택부(203)는 예측이, 인터 예측 시그널링 및 인트라 예측 시그널링에 기반하는 인트라 및 인터 예측 조합(combination of intra and inter predication; CIIP) 모드를 선택할 수 있다. 모드 선택부(203)는 또한 인터 예측의 경우 블록에 대한 (예를 들어 부분화소(sub-pixel) 또는 정수 화소 정밀도로) 움직임 벡터의 해상도(resolution)도 선택할 수 있다.
현재 비디오 블록에 인터 예측을 수행하기 위해, 움직임 추정부(204)는 버퍼(213)로부터의 하나 이상의 참조 프레임들을 현재 비디오 블록에 비교함으로써 현재 비디오 블록에 대한 움직임 정보를 생성할 수 있다. 움직임 보상부(205)는 움직임 정보와 현재 비디오 블록에 연계된 픽처 이외의 버퍼(213)로부터의 픽처들의 디코딩된 샘플들을 기반으로 현재 비디오 블록에 대한 예측된 비디오 블록을 결정할 수 있다.
움직임 추정부(204) 및 움직임 보상부(205)는 예를 들어 현재 비디오 블록이 I 슬라이스, P 슬라이스, 또는 B 슬라이스인지에 따라 현재 비디오 블록에 대해 다른 작동들을 수행할 수 있다.
일부 예들에서, 움직임 추정부(204)는 현재 비디오 블록에 대해 단방향(uni-directional) 예측을 수행할 수 있는데, 움직임 추정부(204)는 현재 비디오 블록에 대한 참조 비디오 블록의 예측으로 리스트 0 또는 리스트 1의 참조 픽처들을 검색할 수 있다, 그러면 움직임 추정부(204)는, 참조 비디오 블록을 포함하는 리스트 0 또는 리스트 1의 참조 픽처과 현재 비디오 블록과 참조 비디오 블록 산의 공간적 변위를 나타내는 움직임 벡터를 가리키는 참조 인덱스(reference index)를 생성할 수 있다. 움직임 추정부(204)는 참조 인덱스와, 예측 방향 지표(prediction direction indicator)와, 및 현재 비디오 블록에 대한 움직임 정보로서의 움직임 벡터를 출력할 수 있다. 움직임 보상부(205)는 현재 비디오 블록의 움직임 벡터로 지시되는 참조 비디오 블록에 기반하여 현재 비디오 블록의 예측된 비디오 블록을 생성할 수 있다.
다른 예들에서, 움직임 추정부(204)는 현재 비디오 블록에 대한 양방향 예측을 수행할 수 있는데, 움직임 추정부(204)는 현재 비디오 블록에 대한 참조 비디오 블록에 대해 리스트 0에서 참조 픽처들을 검색하고 또한 현재 비디오 블록에 대한 다른 참조 비디오 블록에 대해 리스트 1에서 참조 픽처들을 검색할 수 있다. 그러면 움직임 추정부(204)은 참조 비디오 블록들을 포함하는 리스트 0 및 리스트 1의 참조 픽처들을 나타내는 참조 인덱스들과 참조 비디오 블록들과 현재 비디오 블록 간의 공간적 변위들을 나타내는 움직임 벡터들을 생성할 수 있다. 움직임 추정부(204)는 현재 비디오 블록에 대한 움직임 정보로서 현재 비디오 블록의 참조 인덱스들과 움직임 벡터들을 출력할 수 있다. 움직임 보상부(205)는 현재 비디오 블록의 움직임 정보로 나타내진 참조 비디오 블록들에 기반하여 현재 비디오 블록의 예측된 비디오 블록을 생성할 수 있다.
일부 예들에서, 움직임 추정부(204)은 디코더의 디코딩을 위한 움직임 정보의 풀세트(full set)를 출력할 수 있다.
일부 예들에서, 움직임 추정부(204)는 현재 비디오에 대한 움직임 정보의 풀세트를 출력하지 않을 수 있다. 대신, 움직임 추정부(204)는 다른 비디오 블록의 움직임 정보에 대한 현재 비디오 블록의 움직임 정보를 시그널링할 수 있다. 예를 들어, 움직임 추정부(204)는 이웃 비디오 블록의 움직임 정보에 충분히 유사한 현재 비디오 블록의 움직임 정보를 결정할 수 있다.
하나의 예에서, 움직임 추정부(204)는 현재 비디오 블록에 연계된 신택스 구조 내에, 현재 비디오 블록이 다른 비디오 블록과 동일한 움직임 정보를 갖는 비디오 디코더(300)를 가리키는 값을 표시할 수 있다.
다른 예에서, 움직임 추정부(204)는 현재 비디오 블록에 연계된 신택스 구조 내에, 다른 비디오 블록과 움직임 벡터 차이(motion vector difference; MVD)를 식별할 수 있다. 움직임 벡터 차이는 현재 비디오 블록의 움직임 벡터와 지시된 비디오 블록의 움직임 벡터 간의 차이를 나타낸다. 비디오 디코더(300)는 지시된 비디오 블록의 움직임 벡터와 움직임 벡터 차이를 사용하여 현재 비디오 블록의 움직임 벡터를 결정할 수 있다.
전술한 바와 같이, 비디오 인코더(200)는 움직임 벡터를 예측적으로(predictively) 시그널링할 수 있다. 비디오 인코더(200)로 구현될 수 있는 예측적 시그널링 기법의 2가지 예들은 고급 움직임 벡터 예측(advanced motion vector predication; AMVP)과 머지 모드 시그널링을 포함한다.
인트라 예측부(206)는 현재 비디오 블록에 대한 인트라 예측을 수행할 수 있다. 인트라 예측부(206)가 현재 비디오 블록에 대한 인트라 예측을 수행할 때, 인트라 예측부(206)는 동일한 픽처 내의 다른 비디오 블록들의 디코딩된 샘플들에 기반하여 현재 비디오 블록에 대한 예측 데이터를 생성할 수 있다. 현재 비디오 블록에 대한 예측 데이터는 예측된 비디오 블록과 여러 가지 신택스 요소들을 포함할 수 있다.
잔차 생성부(207)는 현재 비디오 블록의 예측된 비디오 블록(들)을 현재 비디오 블록으로부터 차감(예를 들어 마이너스 부호로 표시)함으로써 잔차 데이터를 생성할 수 있다. 현재 비디오 블록의 잔차 데이터는 현재 비디오 블록 내의 샘플들의 다른 샘플 성분에 대응하는 잔차 비디오 블록들을 포함할 수 있다.
다른 예들에서는, 예를 들어 스킵 모드에서 현재 비디오 블록에 대해 현재 비디오 블록에 대한 잔차 시그널링가 없을 수 있는데, 그러면 잔차 생성부(207)는 차감 연산을 수행하지 않을 수 있다.
변환부(208)는 현재 비디오 블록에 대한 잔차 비디오 블록에 하나 이상의 변환들을 적용함으로써 현재 비디오 블록에 대한 하나 이상의 변환 계수 비디오 블록들을 생성할 수 있다.
변환부(208)가 현재 비디오 블록에 연계된 변환 계수 비디오 블록을 생성한 후, 양자화부(209)는 현재 비디오 블록에 연계된 하나 이상의 양자화 파라미터(quantization parameter; QP) 값들에 기반하여 현재 비디오 블록에 연계된 변환 계수 비디오 블록을 양자화할 수 있다.
역양자화부(210)과 역변환부(211)은 각각 변환 계수 비디오 블록에 역양자화와 역변환을 적용하여 변환 계수 비디오 블록으로부터 잔차 비디오 블록을 재현할 수 있다. 재현부(212)은 재현된 잔차 비디오 블록을, 예측부(202)로 생성된 하나 이상의 비디오 블록들로부터의 해당 샘플들에 가산(add)하여 버퍼(213)에 저장되도록 현재 비디오 블록에 연계된 재현 비디오 블록을 산출한다.
재현부(21)가 비디오 블록을 재현한 후, 루프 필터링(loop filtering) 작동이 수행되어 비디오 블록 내의 비디오 블로킹 아티팩트(video blocking artifact)들의 저감을 수행한다.
엔트로피 인코딩부(214)는 비디오 인코더(200)의 다른 기능 컴포넌트들로부터 데이터를 수신할 수 있다. 엔트로피 인코딩부(214)가 데이터를 수신하면 엔트로피 인코딩부(214)는 하나 이상의 엔트로피 인코딩 작동들을 수행하여 엔트로피 인코딩된 데이터를 생성하고 이 엔트로피 인코딩된 데이터를 포함하는 비트스트림을 출력한다.
도 16은 도 14에 도시된 시스템(100)의 비디오 디코더(114)가 될 수 있는 비디오 디코더(300)의 예를 보이는 블록도이다.
비디오 디코더(300)는 본 발명의 기법들의 일부 또는 전부를 수행하도록 구성될 수 있다. 도 16의 예에서, 비디오 디코더(300)는 복수의 기능 컴포넌트들을 포함한다. 이 명세서에 기재된 기법들은 비디오 디코더(300)의 여러 컴포넌트들 간에 공유될 수 있다. 일부 예들에서, 프로세서는 이 명세서에 기재된 기법들의 일부 또는 전부를 수행하도록 구성될 수 있다.
도 16의 예에서, 비디오 디코더(300)는 엔트로피 디코딩부(301), 움직임 보상부(302), 인트라 예측부(303), 역양자화부(304), 역변환부(305), 재현부(306), 및 버퍼(307)를 포함한다. 일부 예들에서, 비디오 디코더(300)는 비디오 인코더(200)(예를 들어 도 15)에 관해 설명한 인코딩 패스(encoding pass)에 대해 일반적으로 역(reciprocal)인 디코딩 패스를 수행할 수 있다.
엔트로피 디코딩부(301)은 인코딩된 비트스트림을 추출(retrieve)할 수 있다. 인코딩된 비트스트림은 엔트로피 코딩된 비디오 데이터(예를 들어 비디오 데이터의 인코딩된 블록들)를 포함할 수 있다. 엔트로피 디코딩부(301)은 엔트로피 코딩된 비디오 데이터를 디코딩하고, 움직임 보상부(302)는 엔트로피 디코딩된 비디오 데이터로부터 움직임 벡터들, 움직임 벡터 정밀도, 참조 픽처 리스트 인덱스들, 및 다른 움직임 정보를 포함하는 움직임 정보를 결정할 수 있다. 움직임 보상부(302)는 예를 들어 AMVP 및 머지 모드를 수행함으로써 이러한 정보를 결정할 수 있다.
움직임 보상부(302)는, 가능하기로 보간 필터(interpolation filter)들에 기반한 보간을 수행함으로써 움직임 보상된 블록들을 산출할 수 있다. 부분화소 정밀도를 갖고 사용될 보간 필터들의 식별자(identifier)들이 신택스 요소들에 포함될 수 있다.
움직임 보상부(302)는, 비디오 블록의 인코딩 동안 비디오 인코더(20)에 사용된 바와 같이 보간 필터들을 사용하여 참조 블록의 정수 미만(sub-integer) 화소들에 대함 보간 값을 연산한다. 움직임 보상부(302)는 수신된 신택스 정보에 따라 비디오 인코더(200)에 사용된 보간 필터들을 결정하여 이 보간 필터들을 사용하여 예측 블록들을 산출할 수 있다.
움직임 보상부(302)는 신택스 정보의 일부를 사용하여 인코딩된 비디오 시퀀스의 프레임(들) 및/또는 슬라이스(들)의 인코딩에 사용된 블록들의 사이즈와, 인코딩된 비디오 시퀀스의 픽처의 각 매크로블록(macroblock)이 어떻게 구획되는지를 기술하는 구획 정보와, 각 구획이 어떻게 인코딩되었는지를 나타내는 모드들과, 각 인터 코딩된 블록에 대한 하나 이상의 참조 프레임들(및 참조 프레임 리스트들)과, 및 인코딩된 비디오 시퀀스를 디코딩할 다른 정보를 결정할 수 있다.
인트라 예측부(303)는 비트스트림에 수신된 예에 대해 인트라 예측 모드를 사용하여 공간적으로 인접한 블록들로부터 예측 블록을 형성한다. 역양자화부(303)는 비트스트림에 제공되어 엔트로피 디코딩부(301)으로 디코딩된 양자화된 비디오 블록 계수를 역양자화(inverse quantize), 즉 양자화 해제한다(de-quantize). 역변환부(303)는 역변환을 적용한다.
재현부(306)는 잔차 블록들을 움직임 보상부(202) 또는 인트라 예측부(303)로 생성된 대응 예측 블록들과 합산(sum)하여 디코딩된 블록들을 형성한다. 원한다면, 블록화 아티팩트(blockiness artifact)들을 제거하기 위해 디블록킹 필터 역시 적용되어 디코딩된 블록들을 필터링한다(filter). 이어서 디코딩된 비디오 블록들은 버퍼(307)에 저장되는데, 이는 후속 움직임 보상에 참조 블록들을 제공한다.
일부 실시예들에서 선호되는 다음 조항 세트들을 이하에 제공한다.
제1 조항 세트는 이전 섹션의 항목 18 및 19에 논의된 기법들의 예시적 실시예를 보인다.
1. (예를 들어 도 17a에 보인 방법(1700) 등의) 비디오 처리 방법은: 4:2:2 칼라 포맷을 갖는 비디오의 비디오 블록과 상기 비디오의 비트스트림 간의 변환을 위해 규칙에 따라 교차 성분 선형 모델(cross-component linear model)의 파라미터를 결정하는 단계(1702); 및 상기 결정에 기반하여 변환을 수행하는 단계(1704)를 포함하고, 여기서 신택스 요소가 비디오의 크로마 샘플들이 비디오의 루마 샘플들에 대해 수직으로 천이되었는지 여부를 나타내고, 또한 여기서 위 규칙은 위 파라미터가 위 신택스 요소의 값과 독립적으로 결정될 것을 명시한다.
2. 제1항의 방법에서, 교차 성분 선형 모델의 파라미터는 교차 성분 선형 모델의 다운샘플링 필터링의 파라미터에 해당한다.
3. 제1항의 방법에서, 다운샘플링 필터링이 이웃 위쪽 루마 샘플들의 다운샘플링, 및/또는 이웃 좌측 루마 샘플들의 다운샘플링, 및/또는 루마 블록인 비디오 블록 내의 샘플들의 다운샘플링을 포함한다.
4. 제2항 또는 제3항의 방법에서, 다운샘플링 필터링이 신택스 요소의 값에 무관하게 고정 필터를 사용하여 수행된다.
5. 제4항의 방법에서, 고정 필터가 계수 [1/4, 2/4, 1/4] 또는 [2/8, 4/8, 2/8]을 갖는 3 탭(tab) 수평 필터이다.
6. (예를 들어 도 17b에 보인 방법 등의) 비디오 처리 방법은: 규칙에 따라 비디오와 상기 비디오의 비트스트림 간의 변환을 수행하는 단계를 포함하는데, 포맷 규칙은 크로마 샘플들의 위치들이 대응 루마 샘플 위치들에 대해 수직으로 천이되었는지 여부를 나타내는 필드(field)가, 비디오 4:2:2 또는 4:4:4 칼라 포맷을 갖는 것에 기인하여 디폴트값으로 설정됨을 명시한다.
7. 제6항의 방법에서, 디폴트값은 0 또는 1이다.
8. 제6항의 방법에서, 규칙은 위 필드가 존재하지 않는 경우, 필드의 값이 1로 추론된다는 것을 더 명시한다.
9. 제6항의 방법에서, 규칙은 위 필드가 존재하지 않는 경우, 필드의 값이 0으로 추론된다는 것을 더 명시한다.
10. 제1항 내지 제9항 중의 어느 한 항의 방법에서, 교차 성분 선형 모델이 선형 모드를 사용하여 다른 성분들로부터 크로마 성분의 예측값들을 유도한다.
11. 제1항 내지 제9항 중의 어느 한 항의 방법에서, 변환이 비디오의 비트스트림으로의 인코딩을 포함한다.
12. 제1항 내지 제9항 중의 어느 한 항의 방법에서, 변환이 비트스트림의 비디오로의 디코딩을 포함한다.
13. 제1항 내지 제12항 중의 어느 한 항의 방법에서, 변환이 비디오로부터의 비트스트림의 생성을 포함하고, 방법이: 비트스트림을 비일시적(non-transitory) 컴퓨터 독출 가능한(computer-readable) 기록매체(recording medium)에 저장하는 단계를 더 포함한다.
14. 제1항 내지 제12항 중의 어느 한 항의 방법을 구현하도록 구성된 프로세서를 구비하는 비디오 처리 장치.
15. 비디오의 비트스트림을 저장하는 방법은: 제1항 내지 제12항 중의 어느 한 항에 기재된 방법을 구비하고; 비트스트림을 비일시적 컴퓨터 독출 가능한 기록매체에 저장하는 단계를 더 포함한다.
16. 실행시 프로세서가 제1항 내지 제12항 중의 하나 이상에 기재된 방법을 구현하도록 유발하는 프로그램 코드를 저장하는 컴퓨터 독출 가능한 매체.
17. 전술한 방법들 중의 어느 것에 따라 생성된 비트스트림을 저장하는 컴퓨터 독출 가능한 매체.
18. 비트스트림 표현을 저장하는 비디오 처리 장치로, 여기서 비디오 처리 장치는 제1항 내지 제12항 중의 어느 한 항에 기재된 방법을 구현하도록 구성된다.
조항들의 제2 세트는 이전 섹션의 항목 20에 논의된 기법들의 예시적 실시예를 보인다.
1. (예를 들어 도 18에 보인 방법(1800) 등의) 비디오 처리 방법은: 비디오의 비디오 블록과 상기 비디오의 비트스트림 간의 변환을 위해 비디오 블록에 대한 교차 성분 선형 모델(CCLM)의 파라미터를 규칙에 따라 결정하는 단계(1802); 및 상기 결정에 기반하여 변환을 수행하는 단계(1804)를 포함하고, 여기서 규칙은 이웃 루마 샘플을 나타내는 변수가 어떤 값을 갖는 경우에만 CCLM의 파라미터의 결정에 이 변수를 사용할 것을 명시한다.
2. 제1항의 방법에서, 비디오 블록의 이웃 위쪽 루마 샘플을 나타내는 변수의 어떤 값이 디블록킹 필터 프로세스 이전의 재현 루마 샘플의 값과 같다.
3. 제2항의 방법에서, 이웃 위쪽 루마 샘플이 사용 가능한 경우, pY[x][y]로 표기되는 이웃 위쪽 루마 샘플이 위치(xTbY + x, yTbY + y)에서의 디블록킹 필터 프로세스 이전의 재현 루마 샘플의 값과 같도록 설정되고, 여기서 (xTbY, yTbY)가 상기 비디오 블록의 상-좌 위치를 나타내고 x 및 y는 정수들이다.
4. 제3항의 방법에서, x는 0 내지 SubWidthC * max(numSampT, nTbW) - 1의 범위에 있으며, 여기서 nTbW는 비디오 블록의 폭을 표기하고, SubWidthC는 비디오 블록의 폭 척도 인자(width scale factor)로 비디오 블록을 포함하는 픽처의 크로마 포맷에 따른 테이블로부터 얻어지며, numSampT는 비디오 블록의 상측 및 상-우의 사용 가능한 이웃 크로마 샘플들의 수를 가리킨다.
5. 제3항의 방법에서, y는 -1 또는 -2이다.
6. 제1항의 방법에서, 비디오 블록의 이웃 좌측 루마 샘플을 나타내는 변수의 값이 블록 해제 프로세스 이전의 재현 루마 샘플의 값과 같게 설정된다.
7. 제6항의 방법에서, 이웃 좌측 루마 샘플이 사용 가능한 경우, pY[x][y]로 표기되는 이웃 좌측 루마 샘플이 위치(xTbY + x, yTbY + y)에서의 디블록킹 필터 프로세스 이전의 재현 루마 샘플의 값과 같도록 설정되고, 여기서 (xTbY, yTbY)가 비디오 블록의 상-좌 위치를 나타내고 x 및 y는 정수들이다.
8. 제7항의 방법에서, x는 -1 내지 -3의 범위에 있다.
9. 제7항의 방법에서, y는 0 내지 SubHeightC * max(numSampL, nTbH) - 1의 범위에 있으며, 여기서 nTbH는 비디오 블록의 높이를 표기하고, SubHeightC는 비디오 블록의 높이 척도 인자(height scale factor)로 비디오 블록을 포함하는 픽처의 크로마 포맷에 따른 테이블로부터 얻어지며, numSampL은 비디오 블록의 좌측 및 좌-하의 사용 가능한 이웃 크로마 샘플들의 수를 가리킨다.
10. 제1항 내지 제9항 중의 어느 한 항의 방법에서, 교차 성분 선형 모델은 선형 모드를 사용하여 다른 성분으로부터 크로마 성분의 예측값들을 유도한다.
11. 제1항 내지 제9항 중의 어느 한 항의 방법에서, 변환이 비디오의 비트스트림으로의 인코딩을 포함한다.
12. 제1항 내지 제9항 중의 어느 한 항의 방법에서, 변환이 비트스트림으로부터의 비디오의 디코딩을 포함한다.
13. 제1항 내지 제12항 중의 어느 한 항의 방법에서, 변환이 비디오로부터의 비트스트림의 생성을 포함하고, 방법은 비트스트림을 비일시적 컴퓨터 독출 가능한 기록매체에 저장하는 단계를 더 포함한다.
14. 제1항 내지 제12항 중의 어느 한 항에 기재된 방법을 구현하도록 구성된 프로세서를 구비하는 비디오 처리 장치.
15. 비디오의 비트스트림을 저장하는 방법은 제1항 내지 제12항 중의 어느 한 항에 기재된 방법을 포함하고, 비트스트림을 비일시적 컴퓨터 독출 가능한 기록매체에 저장하는 단계를 더 포함한다.
16. 실행시 제1항 내지 제12항 중의 하나 이상에 기재된 방법을 구현하도록 하는 프로그램 코드를 저장하는 컴퓨터 독출 가능한 매체.
17. 전술한 방법들 중의 어느 하나에 따라 생성된 비트스트림을 저장하는 컴퓨터 독출 가능한 매체.
18. 비트스트림을 저장하는 비디오 처리 장치로, 이 비디오 처리 장치는 제1항 내지 제12항 중의 어느 한 항에 기재된 방법을 구현하도록 구성된다.
조항들의 제3 세트는 이전 섹션의 항목 21-26에 논의된 기법들의 예시적 실시예들을 보인다.
1. (예를 들어 도 19a에 보인 방법(1900) 등의) 비디오 처리 방법은: 비디오 유닛을 포함하는 비디오와 상기 비디오의 비트스트림 간의 변환을 위해 제1 코딩 툴이 규칙에 따라 인에이블되었는지 여부를 결정하는 단계(1902), 여기서 상기 규칙은 제1 코딩 툴과 제2 코딩 툴이 서로 배타적으로 인에이블됨을 명시하고, 상기 제1 코딩 툴 또는 상기 제2 코딩 툴은 부호 데이터 은닉 툴(sign data hiding tool)을 포함하며; 및 상기 판단에 따라 변환을 수행하는 단계(1904)를 포함한다.
2. 제1항의 방법에서, 비디오 유닛은 시퀀스, 픽처, 슬라이스, 타일, 브릭, 또는 부분픽처(subpicture)에 해당한다.
3. 제1항 또는 제2항의 방법에서, 위 규칙은 블록 차분 펄스 코딩 변조(block differential pulse-code modulation; BDPCM) 툴을 포함하는 제2 코딩 툴이 비디오 유닛에 대해 인에이블된 경우 부호 데이터 은닉 툴을 포함하는 제1 코딩 툴을 디스에이블시키도록 명시한다.
4. 제1항 또는 제2항의 방법에서, 위 규칙은 부호 데이터 은닉 툴을 포함하는 제2 코딩 툴이 비디오 유닛에 대해 인에이블된 경우 블록 차분 펄스 코딩 변조(BDPCM) 툴을 포함하는 제1 코딩 툴을 디스에이블시키도록 명시한다.
5. 제1항 또는 제2항의 방법에서, 위 규칙은 아이덴티티 변환(identity transform)만을 적용하는 제2 코딩 툴이 비디오 유닛에 대해 인에이블된 경우 부호 데이터 은닉 툴을 포함하는 제1 코딩 툴을 디스에이블시키도록 명시한다.
6. 제1항 또는 제2항의 방법에서, 위 규칙은 부호 데이터 은닉 툴을 포함하는 제2 코딩 툴이 비디오 유닛에 대해 인에이블된 경우 아이덴티티 변환만을 적용하는 제1 코딩 툴을 디스에이블시키도록 명시한다.
7. 제5항 또는 제6항의 방법에서, 아이덴티티 변환만을 적용하는 제2 코딩 툴 또는 아이덴티티 변환만을 적용하는 제1 코딩 툴이, 변환 스킵 모드 툴 또는 다른 코딩 툴들을 구비한다.
8. (예를 들어 도 19b에 보인 방법(1910) 등의) 비디오 처리 방법은: 비디오 유닛을 포함하는 비디오와 상기 비디오의 비트스트림 간의 변환을 위해 제1 코딩 툴이 규칙에 따라 인에이블되었는지 여부를 결정하는 단계(1912), 여기서 상기 규칙은 제1 코딩 툴과 제2 코딩 툴이 서로 배타적으로 인에이블됨을 명시하고, 상기 제1 코딩 툴 또는 상기 제2 코딩 툴은 종속 양자화 툴(dependent quantization tool)을 포함하며; 및 상기 결정에 따라 변환을 수행하는 단계(1914)를 포함한다.
9. 제8항의 방법에서, 비디오 유닛은 시퀀스, 픽처, 슬라이스, 타일, 브릭, 또는 부분픽처에 해당한다.
10. 제8항 또는 제9항의 방법에서, 위 규칙은 블록 차분 펄스 코딩 변조(BDPCM) 툴을 포함하는 제2 코딩 툴이 비디오 유닛에 대해 인에이블된 경우 종속 양자화 툴을 포함하는 제1 코딩 툴을 디스에이블시키도록 명시한다.
11. 제8항 또는 제9항의 방법에서, 위 규칙은 종속 양자화 툴을 포함하는 제2 코딩 툴이 비디오 유닛에 대해 인에이블된 경우 블록 차분 펄스 코딩 변조(BDPCM) 툴을 포함하는 제1 코딩 툴을 디스에이블시키도록 명시한다.
12. 제8항 또는 제9항의 방법에서, 위 규칙은 아이덴티티 변환만을 적용하는 제2 코딩 툴이 비디오 유닛에 대해 인에이블된 경우 종속 양자화 툴을 포함하는 제1 코딩 툴을 디스에이블시키도록 명시한다.
13. 제8항 또는 제9항의 방법에서, 위 규칙은 종속 양자화 툴을 포함하는 제2 코딩 툴이 비디오 유닛에 대해 인에이블된 경우 아이덴티티 변환만을 적용하는 제1 코딩 툴을 디스에이블시키도록 명시한다.
14. 제8항 또는 제9항의 방법에서, 아이덴티티 변환만을 적용하는 제2 코딩 툴 또는 아이덴티티 변환만을 적용하는 제1 코딩 툴이 변환 스킵 모드 툴 또는 다른 코딩 툴들을 포함한다.
15. (예를 들어 도 19c에 보인 방법(1920) 등의) 비디오 처리 방법은: 하나 이상의 슬라이스들을 갖는 하나 이상의 픽처들을 포함하는 비디오와 상기 비디오의 비트스트림 간의 변환을 규칙에 따라 수행하는 단계(1922)를 포함하고, 여기서 규칙은 슬라이스의 슬라이스 종류가 그 슬라이스에 대한 참조 픽처 리스트의 참조 픽처 엔트리들에 종속된다는 것을 명시한다.
16. 제15항의 방법에서, 규칙이 참조 픽처 리스트 0의 참조 픽처 엔트리들의 수가 0이고 참조 픽처 리스트 1의 참조 픽처 엔트리들의 수가 0인 경우 슬라이스의 슬라이스 종류가 I 슬라이스라고 명시한다.
17. 제15항의 방법에서, 규칙이 참조 픽처 리스트 0의 참조 픽처 엔트리들의 수가 0보다 크고 참조 픽처 리스트 1의 참조 픽처 엔트리들의 수가 0인 경우 슬라이스의 슬라이스 종류가 P 슬라이스라고 명시한다.
18. 제15항의 방법에서, 규칙이 참조 픽처 리스트 0의 참조 픽처 엔트리들의 수가 0보다 크고 참조 픽처 리스트 1의 참조 픽처 엔트리들의 수가 0 경우 슬라이스의 슬라이스 종류가 B 슬라이스가 아니라고 명시한다.
19. 제16항 내지 제18항 중의 어느 한 항의 방법에서, 슬라이스 종류가 비트스트림에 포함되지 않는다.
20. 제15항의 방법에서, 슬라이스 종류가 시그널링 또는 추론되기 전에 참조 픽처 엔트리들이 시그널링 또는 추론된다.
21. 제15항의 방법에서, 참조 픽처 엔트리들이 슬라이스를 포함하는 픽처에 연계된 픽처 헤더(picture header)에 포함된다.
22. (예를 들어 도 19d에 보인 방법(1930) 등의) 비디오 처리 방법은: 하나 이상의 슬라이스들을 갖는 하나 이상의 픽처들을 포함하는 비디오와 상기 비디오의 비트스트림 간의 변환을 규칙에 따라 수행하는 단계(1932)를 포함하고, 여기서 규칙은 적응형 파라미터 세트(adaptation parameter set; APS)들 내의 허용된 필터들의 수 또는 APS들의 수가 비디오의 코딩된 정보에 종속된다는 것을 명시한다.
23. 제22항의 방법에서, 코딩된 정보가 픽처의 부분픽처들의 수를 포함한다.
24. 제22항의 방법에서, APS들 내의 허용된 필터들의 수가 픽처 유닛 내의 모든 적응형 파라미터 세트(APS) 네트워크 추상 계층(network abstraction layer; NAL) 유닛들 내의 루마 적응형 루프 필터(adaptive loop filter; ALF)들, 크로마 ALF들, 및 교차 성분 ALF들의 수를 포함한다.
25. 제22항의 방법에서, APS들 내의 허용된 필터들의 수가 픽처 유닛 내의 모든 적응형 파라미터 세트(APS) 네트워크 추상 계층(NAL) 유닛들 내의 루마 성분에 대한 적응형 루프 필터(ALF) 클래스(class)들의 수, 크로마 성분에 대한 대체적 필터들의 수, 및/또는 교차 성분 필터들의 수를 포함한다.
26. 제22항의 방법에서, APS들은 ALF APS들, 스케일링 리스트(scaling list) APS들, 및/또는 LMCS(크로마 스케일링을 갖는 루마 매핑: luma mapping with chroma scaling) APS들에 대응한다.
27. 제22항의 방법에서, APS 식별자를 시그널링할 방법 및/또는 비디오 유닛에 사용될 APS들의 수는 APS들 내의 허용된 필터들의 수에 좌우된다.
28. 제1항 내지 제27항 중의 어느 한 항의 방법에서, 변환은 비디오의 비트스트림으로의 인코딩을 포함한다.
29. 제1항 내지 제27항 중의 어느 한 항의 방법에서, 변환은 비트스트림으로부터 비디오로의 디코딩을 포함한다.
30. 제1항 내지 제27항 중의 어느 한 항의 방법에서, 변환이 비디오로부터의 비트스트림의 생성을 포함하고, 상기 방법은 상기 비트스트림을 비일시적 컴퓨터 독출 가능한 기록매체에 저장하는 단계를 더 포함한다.
31. 제1항 내지 제30항 중의 하나 이상의 항에 기재된 방법을 구현하도록 구성된 프로세서를 포함하는 비디오 처리 장치.
32. 비디오의 비트스트림을 저장하는 방법은, 제1항 내지 제30항 중의 하나 이상의 항에 기재된 방법을 구비하고, 비트스트림을 비일시적 컴퓨터 독출 가능한 기록매체에 저장하는 단계를 더 포함한다.
33. 실행시 프로세서가 제1항 내지 제30항 중의 하나 이상의 항에 기재된 방법을 구현하도록 하는 프로그램 코드를 저장하는 컴퓨터 독출 가능한 매체.
34. 전술한 방법들 중의 하나 이상에 따라 생성된 비트스트림을 저장하는 컴퓨터 독출 가능한 매체.
35. 비트스트림을 저장하는 비디오 처리 장치로, 이 비디오 처리 장치는 제1항 내지 제30항 중의 하나 이상의 항에 기재된 방법을 구현하도록 구성된다.
본 발명의 일부 실시예들은 비디오 처리 툴 또는 모드를 인에이블시키는 결정 또는 판단(decision or determination)을 내리는 단계를 포함한다. 하나의 예에서, 비디오 처리 툴 또는 모드가 인에이블되면 인코더는 비디오의 블록의 처리에서 툴 또는 모드를 사용 또는 구현하지만 툴 또는 모드의 사용에 기반하여 결과적인 비트스트림을 반드시 수정하는 것은 아니다. 즉 비디오의 블록으로부터 비디오의 비트스트림 표현으로의 변환은 결정 또는 판단에 기반하여 인에이블되었을 때 비디오 처리 툴 또는 모드를 사용할 것이다. 다른 예에서, 비디오 처리 툴 또는 모드가 인에이블되면, 디코더는 비디오 처리 툴 또는 모드에 기반하여 비트스트림이 수정되었다는 지식을 갖고 비트스트림을 처리할 것이다. 즉 비디오의 비트스트림 표현으로부터 비디오의 블록으로의 변환이, 결정 또는 판단에 기반하여 인에이블된 비디오 처리 툴 또는 모드를 사용하여 수행될 것이다.
본 발명의 일부 실시예들은 비디오 처리 툴 또는 모드를 디스에이블시키는 결정 또는 판단을 내리는 단계를 포함한다. 하나의 예에서, 비디오 처리 툴 또는 모드가 디스에이블되면, 인코더는 비디오의 블록의 이 비디오의 비트스트림 표현으로의 변환에 그 툴 또는 모드를 사용하지 않을 것이다. 다른 예에서, 비디오 처리 툴 또는 모드가 디스에이블되면, 디코더는 비디오 처리 툴 또는 모드에 기반하여 비트스트림이 인에이블되었다는 지식을 갖고 비트스트림을 처리할 것이다.
개시된 것 및 다른 해법, 예, 실시예들, 및 이 명세서에 기재된 기능적 움직임들은 이 명세서에 개시된 구조들 및 그 구조적 등가물들, 그리고 그 하나 이상의 조합들을 포함하여 디지털 전자 회로, 컴퓨터 소프트웨어, 펌웨어, 또는 하드웨어로 구현될 수 있다. 개시된 것 및 다른 실시예들은 하나 이상의 컴퓨터 프로그램 제품, 즉 데이터 처리 장치로 실행되거나 그 작동을 제어하도록 실행되는 컴퓨터 독출 가능한 매체 상에 인코딩된 하나 이상의 컴퓨터 프로그램 명령들의 모듈들로 구현될 수 있다. 컴퓨터 독출 가능한 매체는 기계 독출 가능한(machine-readable) 저장장치, 기계 독출 가능한 기판, 메모리 소자, 기계 독출 가능한 전파되는 시그널링(propagated signal)를 일으키는(effecting) 물질의 조성, 또는 그 하나 이상의 조합이 될 수 있다. "데이터 처리 장치(data processing apparatus)"라는 용어는 예를 들어 프로그래밍 가능한 프로세서, 컴퓨터, 또는 다중 프로세서들 또는 컴퓨터들을 포함하는, 데이터를 처리하는 모든 장치, 기기, 및 기계들을 포괄한다. 장치는 하드웨어에 추가하여, 예를 들어 포로세서 펌웨어, 프로토콜 스택(protocol stack), 데이터베이스 관리 시스템, 운영체제(operating system), 또는 그 하나 이상의 조합을 구성하는 코드 등 논의 중인(in question) 컴퓨터 프로그램에 대한 실행 환경을 생성하는 코드를 포함할 수 있다. 전파 시그널링는 예를 들어 기계 생성의 전자, 광학, 또는 전자기 시그널링 등, 적적할 수신 장치로 전송하도록 정보를 인코딩하여 생성한 인공적으로 생성된 시그널링이다.
(프로그램, 소프트웨어, 소프트웨어 응용(프로그램), 스크립트(script), 또는 코드로도 알려진) 컴퓨터 프로그램은 컴파일 또는 해석 언어를 포함하는 어떤 형태의 프로그래밍 언어로 기록될 수 있는데, 이는 독립(stand-alone) 프로그램으로, 또는 모듈, 컴포넌트, 서브루틴, 또는 컴퓨팅 환경에 사용되기에 적합한 다른 유닛으로 전개될 수 있다. 컴퓨터 프로그램이 반드시 파일 시스템의 파일에 해당하는 것은 아니다. 프로그램은 (예를 들어 마크업 언어 문서(markup language document)에 저장된 하나 이상의 스크립트들 등) 다른 프로그램 또는 데이터를 보유하는 파일의 일부에, 논의 중인 프로그램 전용의 단일한 파일에, 또는 (예를 들어 하나 이상의 모듈들, 하부 프로그램들, 또는 코드의 부분들 등) 다지점(multiple coordinated) 파일들로 저장될 수 있다. 컴퓨터 프로그램은 하나의 컴퓨터 또는 한 현장 또는 분산된 현장들에 위치하여 네트워크로 상호연결된 복수의 컴퓨터들 상에서 실행되도록 전개될 수 있다.
이 명세서에 기재된 프로세스들과 논리 흐름들은 입력 데이터에 연산하여 출력을 생성함으로써 기능들을 수행하도록 하나 이상의 컴퓨터 프로그램들을 실행하는 하나 이상의 프로그래밍 가능한 프로세서들에 의해 수행될 수 있다. 이 프로세스들과 논리 흐름들은 또한 장치에 의해 수행될 수 있고, 예를 들어 FPGA(field programmable gate array; 현장 프로그래밍 가능한 게이트 어레이) 또는 ASIC (application specific integrated circuit; 주문형 집적회로) 등의 특수 목적 논리 회로로 구현될 수도 있다.
컴퓨터 프로그램의 실행에 접합한 프로세서들은 예를 들어 일반 및 특수 목적 양자의 마이크로프로세서들, 및 모든(any) 종류의 디지털 컴퓨터의 하나 이상의 프로세서들을 포함한다. 일반적으로, 프로세서는 독출 전용 메모리(read only memory) 또는 랜덤 액세스 메모리 또는 양자로부터 명령들과 데이터를 수신할 것이다. 컴퓨터의 필수 요소들은 명령들을 수행하는 프로세서와 명령들 및 데이터를 저장하는 하나 이상의 메모리 장치들이다. 일반적으로, 컴퓨터는 데이터를 수신하거나 데이터를 전송하거나 또는 양자를 위해, 예를 들어 자기, 자기 광학 디스크, 또는 광학 디스크 등 데이터의 저장을 위한 하나 이상의 대용량 기억장치(mass storage device)들 역시 포함하거나 작동상 연결될 것이다. 그러나 컴퓨터가 이러한 장치를 가질 필요는 없다. 컴퓨터 프로그램 명령들과 데이터를 저장하기에 적합한 컴퓨터 독출 가능한 매체는 예를 들어, 예를 들어 EPROM, EEPROM 등의 반도체 메모리 소자 및 플래시 메모리 소자; 예를 들어 내장 하드 디스크 또는 외장 디스크 등의 자기 디스크; 및 CD ROM 및 DVD-ROM 디스크 등을 포함하는 모든 형태의 비휘발성 메모리, 매체, 및 메모리 소자들을 포함한다. 이 프로세서와 메모리는 특수 목적 논리 회로로 보완되거나 이에 포함될 수 있다.
이 명세서가 많은 상세들을 포함하고 있지만, 이들은 어떤 주제나 청구될 내용의 범위를 한정하는 것으로 해석되어서는 안 되며, 오히려 특정한 기법들의 특정한 실시예에 대해 특정될 수 있는 특징들의 설명으로 해석되어야 할 것이다. 별도의 실시예들의 맥락으로 이 명세서에 기재된 어떤 특징들은 단일한 실시예에 조합되어 구현될 수도 있다. 역으로 단일한 실시예의 맥락으로 기재된 여러 특징들도 별도로 또는 어떤 적절한 부분조합으로 복수의 실시예들에 구현될 수 있다. 뿐만 아니라, 특징들이 어떤 조합으로 작동된다고 설명되고 처음 그렇게 청구되었더라도 청구된 조합으로부터의 하나 이상의 특징들은 어떤 경우에 조합으로부터 제외되어 청구된 조합이 부분조합 또는 부분조합의 변형을 대상으로 할 수도 있다.
마찬가지로, 작동들이 도면들에서 특정한 순서로 도시되었지만, 이러한 작동들이 원하는 결과를 달성하기 위해 도시된 특정한 순서 또는 순차적 순서로 수행되거나 모든 도시된 작동들이 수행될 것을 요구하는 것으로 이해되어서는 안 된다. 또한 이 명세서에 기재된 실시예들의 여러 시스템 컴포넌트들의 분리는 이러한 분리가 모든 실시예들에 요구되는 것으로 이해되어서는 안 된다.
약간의 구현예와 예들만이 설명되었지만, 이 명세서에 설명 및 도시된 것들에 기반하여 다른 구현, 개선, 및 변형들이 이뤄질 수 있다.

Claims (35)

  1. 비디오 유닛을 포함하는 비디오와 상기 비디오의 비트스트림 간의 변환을 위해 제1 코딩 툴이 규칙에 따라 인에이블되었는지 여부를 결정하는 단계, 여기서 상기 규칙은 제1 코딩 툴과 제2 코딩 툴이 서로 배타적으로 인에이블됨을 명시하고, 상기 제1 코딩 툴 또는 상기 제2 코딩 툴은 부호 데이터 은닉 툴(sign data hiding tool)을 포함함, 및
    상기 판단에 따라 변환을 수행하는 단계를 포함하는, 비디오 처리 방법.
  2. 제1항에 있어서,
    상기 비디오 유닛은 시퀀스, 픽처, 슬라이스, 타일, 브릭, 또는 부분픽처(subpicture)에 해당하는, 비디오 처리 방법.
  3. 제1항 또는 제2항 중 어느 한 항에 있어서,
    상기 규칙은 블록 차분 펄스 코딩 변조(block differential pulse-code modulation; BDPCM) 툴을 포함하는 상기 제2 코딩 툴이 비디오 유닛에 대해 인에이블된 경우, 상기 부호 데이터 은닉 툴을 포함하는 상기 제1 코딩 툴을 디스에이블시키도록 명시하는, 비디오 처리 방법.
  4. 제1항 또는 제2항 중 어느 한 항에 있어서,
    상기 규칙은 상기 부호 데이터 은닉 툴을 포함하는 제2 코딩 툴이 비디오 유닛에 대해 인에이블된 경우, 블록 차분 펄스 코딩 변조(BDPCM) 툴을 포함하는 상기 제1 코딩 툴을 디스에이블시키도록 명시하는, 비디오 처리 방법.
  5. 제1항 또는 제2항 중 어느 한 항에 있어서,
    상기 규칙은 아이덴티티 변환(identity transform)만을 적용하는 상기 제2 코딩 툴이 비디오 유닛에 대해 인에이블된 경우, 상기 부호 데이터 은닉 툴을 포함하는 상기 제1 코딩 툴을 디스에이블시키도록 명시하는, 비디오 처리 방법.
  6. 제1항 또는 제2항 중 어느 한항에 있어서,
    상기 규칙은 상기 부호 데이터 은닉 툴을 포함하는 상기 제2 코딩 툴이 비디오 유닛에 대해 인에이블된 경우, 아이덴티티 변환만을 적용하는 상기 제1 코딩 툴을 디스에이블시키도록 명시하는, 비디오 처리 방법.
  7. 제5항 또는 제6항 중 어느 한 항에 있어서,
    상기 아이덴티티 변환만을 적용하는 상기 제2 코딩 툴 또는 상기 아이덴티티 변환만을 적용하는 제1 코딩 툴이, 변환 스킵 모드 툴 또는 다른 코딩 툴들을 포함하는, 비디오 처리 방법.
  8. 비디오 유닛을 포함하는 비디오와 상기 비디오의 비트스트림 간의 변환을 위해 제1 코딩 툴이 규칙에 따라 인에이블되었는지 여부를 결정하는 단계, 여기서 상기 규칙은 제1 코딩 툴과 제2 코딩 툴이 서로 배타적으로 인에이블됨을 명시하고, 상기 제1 코딩 툴 또는 상기 제2 코딩 툴은 종속 양자화 툴(dependent quantization tool)을 포함함; 및
    상기 결정에 따라 변환을 수행하는 단계를 포함하는, 비디오 처리 방법.
  9. 제8항에 있어서,
    상기 비디오 유닛은 시퀀스, 픽처, 슬라이스, 타일, 브릭, 또는 부분픽처에 해당하는, 비디오 처리 방법.
  10. 제8항 또는 제9항 중 어느 한 항에 있어서,
    상기 규칙은 블록 차분 펄스 코딩 변조(BDPCM) 툴을 포함하는 제2 코딩 툴이 비디오 유닛에 대해 인에이블된 경우, 상기 종속 양자화 툴을 포함하는 제1 코딩 툴을 디스에이블시키도록 명시하는, 비디오 처리 방법.
  11. 제8항 또는 제9항 중 어느 한 항에 있어서,
    상기 규칙은 상기 종속 양자화 툴을 포함하는 제2 코딩 툴이 비디오 유닛에 대해 인에이블된 경우, 블록 차분 펄스 코딩 변조(BDPCM) 툴을 포함하는 제1 코딩 툴을 디스에이블시키도록 명시하는, 비디오 처리 방법.
  12. 제8항 또는 제9항 중 어느 한 항에 있어서,
    상기 규칙은 아이덴티티 변환만을 적용하는 제2 코딩 툴이 비디오 유닛에 대해 인에이블된 경우, 상기 종속 양자화 툴을 포함하는 제1 코딩 툴을 디스에이블시키도록 명시하는, 비디오 처리 방법.
  13. 제8항 또는 제9항 중 어느 한 항에 있어서,
    상기 규칙은 상기 종속 양자화 툴을 포함하는 제2 코딩 툴이 비디오 유닛에 대해 인에이블된 경우, 상기 아이덴티티 변환만을 적용하는 제1 코딩 툴을 디스에이블시키도록 명시하는, 비디오 처리 방법.
  14. 제8항 또는 제9항 중 어느 한 항에 있어서,
    상기 아이덴티티 변환만을 적용하는 제2 코딩 툴 또는 상기 아이덴티티 변환만을 적용하는 제1 코딩 툴이, 변환 스킵 모드 툴 또는 다른 코딩 툴들을 포함하는, 비디오 처리 방법.
  15. 하나 이상의 슬라이스들을 갖는 하나 이상의 픽처들을 포함하는 비디오와 상기 비디오의 비트스트림 간의 변환을 규칙에 따라 수행하는 단계를 포함하고,
    여기서 상기 규칙은 슬라이스의 슬라이스 종류가 그 슬라이스에 대한 참조 픽처 리스트의 참조 픽처 엔트리들에 종속됨을 명시하는, 비디오 처리 방법.
  16. 제15항에 있어서,
    상기 규칙은 참조 픽처 리스트 0의 참조 픽처 엔트리들의 수가 0이고 참조 픽처 리스트 1의 참조 픽처 엔트리들의 수가 0인 경우 슬라이스의 슬라이스 종류가 I 슬라이스라고 명시하는, 비디오 처리 방법.
  17. 제15항에 있어서,
    상기 규칙은 참조 픽처 리스트 0의 참조 픽처 엔트리들의 수가 0보다 크고 참조 픽처 리스트 1의 참조 픽처 엔트리들의 수가 0인 경우 슬라이스의 슬라이스 종류가 P 슬라이스라고 명시하는, 비디오 처리 방법.
  18. 제15항에 있어서,
    상기 규칙은 참조 픽처 리스트 0의 참조 픽처 엔트리들의 수가 0보다 크고 참조 픽처 리스트 1의 참조 픽처 엔트리들의 수가 0 경우 슬라이스의 슬라이스 종류가 B 슬라이스가 아니라고 명시하는, 비디오 처리 방법.
  19. 제16항 내지 제18항 중 어느 한 항에 있어서,
    상기 슬라이스 종류가 비트스트림에 포함되지 않는, 비디오 처리 방법.
  20. 제15항에 있어서,
    상기 슬라이스 종류가 시그널링 또는 추론되기 전에 상기 참조 픽처 엔트리들이 시그널링 또는 추론되는, 비디오 처리 방법.
  21. 제15항에 있어서,
    상기 참조 픽처 엔트리들이 슬라이스를 포함하는 픽처에 연계된 픽처 헤더(picture header)에 포함되는, 비디오 처리 방법.
  22. 하나 이상의 슬라이스들을 갖는 하나 이상의 픽처들을 포함하는 비디오와 상기 비디오의 비트스트림 간의 변환을 규칙에 따라 수행하는 단계를 포함하고,
    여기서 상기 규칙은 적응형 파라미터 세트(adaptation parameter set; APS)들 내의 허용된 필터들의 수 또는 APS들의 수가 비디오의 코딩된 정보에 종속됨을 명시하는, 비디오 처리 방법.
  23. 제22항에 있어서,
    코딩된 정보가 픽처의 부분픽처들의 수를 포함하는, 비디오 처리 방법.
  24. 제22항에 있어서,
    상기 APS들 내의 허용된 필터들의 수가 픽처 유닛 내의 모든 적응형 파라미터 세트(APS) 네트워크 추상 계층(network abstraction layer; NAL) 유닛들 내의 루마 적응형 루프 필터(adaptive loop filter; ALF)들, 크로마 ALF들, 및 교차 성분 ALF들의 수를 포함하는, 비디오 처리 방법.
  25. 제22항에 있어서,
    상기 APS들 내의 허용된 필터들의 수가 픽처 유닛 내의 모든 적응형 파라미터 세트(APS) 네트워크 추상 계층(NAL) 유닛들 내의 루마 성분에 대한 적응형 루프 필터(ALF) 클래스(class)들의 수, 크로마 성분에 대한 대체적 필터들의 수, 및/또는 교차 성분 필터들의 수를 포함하는, 비디오 처리 방법.
  26. 제22항에 있어서,
    상기 APS들은 ALF APS들, 스케일링 리스트(scaling list) APS들, 및/또는 LMCS(luma mapping with chroma scaling) APS들에 대응하는, 비디오 처리 방법.
  27. 제22항에 있어서,
    APS 식별자를 시그널링할 방법 및/또는 비디오 유닛에 사용될 APS들의 수는 APS들 내의 허용된 필터들의 수에 좌우하는, 비디오 처리 방법.
  28. 제1항 내지 제27항 중 어느 한 항에 있어서,
    상기 변환은 비디오의 비트스트림으로의 인코딩을 포함하는, 비디오 처리 방법.
  29. 제1항 내지 제27항 중 어느 한 항에 있어서,
    상기 변환은 비트스트림으로부터 비디오로의 디코딩을 포함하는, 비디오 처리 방법.
  30. 제1항 내지 제27항 중의 어느 한 항의 방법에서,
    상기 변환이 비디오로부터의 비트스트림의 생성을 포함하고, 상기 방법은 상기 비트스트림을 비일시적 컴퓨터 독출 가능한 기록매체에 저장하는 단계를 더 포함
  31. 제1항 내지 제30항 중의 하나 이상의 항에 기재된 방법을 구현하도록 구성된 프로세서를 포함하는 비디오 처리 장치.
  32. 제1항 내지 제30항 중의 어느 한 항에 기재된 방법을 포함하고, 비트스트림을 비일시적 컴퓨터 독출 가능한 기록매체에 저장하는 단계를 더 포함하는 비디오의 비트스트림 저장 방법.
  33. 실행시 프로세서가 제1항 내지 제30항 중의 어느 한 항에 기재된 방법을 구현하도록 하는 프로그램 코드가 저장된 컴퓨터 독출 가능한 매체.
  34. 전술한 방법들 중의 하나 이상에 따라 생성된 비트스트림을 저장하는 컴퓨터 독출 가능한 매체.
  35. 비트스트림을 저장하는 비디오 처리 장치로, 제1항 내지 제30항 중의 한 항 이상에 기재된 방법을 구현하도록 구성되는 비디오 처리 장치.
KR1020227036103A 2020-04-18 2021-04-19 교차 성분 예측을 위한 사용 제한 KR20230002432A (ko)

Applications Claiming Priority (3)

Application Number Priority Date Filing Date Title
CN2020085484 2020-04-18
CNPCT/CN2020/085484 2020-04-18
PCT/CN2021/088000 WO2021209065A1 (en) 2020-04-18 2021-04-19 Use restrictions for cross-component prediction

Publications (1)

Publication Number Publication Date
KR20230002432A true KR20230002432A (ko) 2023-01-05

Family

ID=78083943

Family Applications (2)

Application Number Title Priority Date Filing Date
KR1020227036104A KR20230002433A (ko) 2020-04-18 2021-04-19 교차 성분 비디오 코딩 시그널링 신택스
KR1020227036103A KR20230002432A (ko) 2020-04-18 2021-04-19 교차 성분 예측을 위한 사용 제한

Family Applications Before (1)

Application Number Title Priority Date Filing Date
KR1020227036104A KR20230002433A (ko) 2020-04-18 2021-04-19 교차 성분 비디오 코딩 시그널링 신택스

Country Status (6)

Country Link
US (4) US20230063736A1 (ko)
EP (2) EP4122194A4 (ko)
JP (3) JP2023521502A (ko)
KR (2) KR20230002433A (ko)
CN (4) CN115462081A (ko)
WO (3) WO2021209065A1 (ko)

Family Cites Families (32)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN103096057B (zh) * 2011-11-08 2016-06-29 华为技术有限公司 一种色度帧内预测方法和装置
JP6125215B2 (ja) * 2012-09-21 2017-05-10 株式会社東芝 復号装置、及び符号化装置
KR101709775B1 (ko) 2013-07-23 2017-02-23 인텔렉추얼디스커버리 주식회사 영상 부호화/복호화 방법 및 장치
US10455249B2 (en) * 2015-03-20 2019-10-22 Qualcomm Incorporated Downsampling process for linear model prediction mode
WO2017088093A1 (en) 2015-11-23 2017-06-01 Mediatek Singapore Pte. Ltd. On the smallest allowed block size in video coding
US10230961B2 (en) 2016-06-03 2019-03-12 Mediatek Inc. Method and apparatus for template-based intra prediction in image and video coding
US10484712B2 (en) 2016-06-08 2019-11-19 Qualcomm Incorporated Implicit coding of reference line index used in intra prediction
US10554974B2 (en) 2017-01-13 2020-02-04 Mediatek Inc. Method and apparatus enabling adaptive multiple transform for chroma transport blocks using control flags
US10779007B2 (en) 2017-03-23 2020-09-15 Mediatek Inc. Transform coding of video data
JP2020120141A (ja) 2017-05-26 2020-08-06 シャープ株式会社 動画像符号化装置及び動画像復号装置、フィルタ装置
WO2019047883A1 (en) 2017-09-08 2019-03-14 Fg Innovation Ip Company Limited DEVICE AND METHOD FOR ENCODING VIDEO DATA BASED ON MULTIPLE REFERENCE LINES
GB2567249A (en) 2017-10-09 2019-04-10 Canon Kk New sample sets and new down-sampling schemes for linear component sample prediction
CN118075473A (zh) 2017-11-28 2024-05-24 Lx 半导体科技有限公司 图像编码/解码方法、图像数据的传输方法和存储介质
GB2571314A (en) 2018-02-23 2019-08-28 Canon Kk Methods and devices for linear component sample prediction using a double classification
WO2019172799A1 (en) * 2018-03-07 2019-09-12 Huawei Technologies Co., Ltd Method and apparatus for detecting blocks suitable for multiple sign bit hiding
WO2020009357A1 (ko) 2018-07-02 2020-01-09 엘지전자 주식회사 Cclm에 기반한 인트라 예측 방법 및 그 장치
EP3815370A4 (en) * 2018-07-12 2021-08-11 Huawei Technologies Co., Ltd. INTRAPREDICTION USING COMPONENT LINEAR MODEL IN VIDEO ENCODING
WO2020015433A1 (en) 2018-07-15 2020-01-23 Huawei Technologies Co., Ltd. Method and apparatus for intra prediction using cross-component linear model
GB2590844B (en) 2018-08-17 2023-05-03 Beijing Bytedance Network Tech Co Ltd Simplified cross component prediction
KR20200028860A (ko) * 2018-09-07 2020-03-17 김기백 인트라 예측을 이용한 영상 부호화/복호화 방법 및 장치
WO2020053806A1 (en) * 2018-09-12 2020-03-19 Beijing Bytedance Network Technology Co., Ltd. Size dependent down-sampling in cross component linear model
WO2020056352A1 (en) * 2018-09-14 2020-03-19 Futurewei Technologies, Inc. Slicing and tiling in video coding
WO2020071616A1 (ko) * 2018-10-04 2020-04-09 엘지전자 주식회사 Cclm에 기반한 인트라 예측 방법 및 그 장치
WO2020073904A1 (en) * 2018-10-08 2020-04-16 Huawei Technologies Co., Ltd. An image processing device and method for performing deblocking
US11197005B2 (en) 2018-11-08 2021-12-07 Qualcomm Incorporated Cross-component prediction for video coding
CN117278744A (zh) 2019-02-22 2023-12-22 华为技术有限公司 使用线性模型进行帧内预测的方法及装置
CN113632464B (zh) * 2019-05-21 2023-04-28 华为技术有限公司 分量间预测的方法和设备
US11115658B2 (en) * 2019-06-25 2021-09-07 Qualcomm Incorporated Matrix intra prediction and cross-component linear model prediction harmonization for video coding
BR112022012484A2 (pt) 2019-12-30 2022-09-06 Huawei Tech Co Ltd Método e aparelho de filtragem para predição de modelo linear de componente cruzado
JP2022553444A (ja) 2019-12-30 2022-12-22 ベイジン ダジア インターネット インフォメーション テクノロジー カンパニー リミテッド 映像データをデコードするための方法、電子デバイス、非一時的なコンピュータ可読記憶媒体およびコンピュータプログラム
WO2021195500A1 (en) 2020-03-26 2021-09-30 Alibaba Group Holding Limited Method and apparatus for cross component filtering
US11638036B2 (en) 2020-04-03 2023-04-25 Qualcomm Incorporated High-level constraints for transform skip blocks in video coding

Also Published As

Publication number Publication date
WO2021209065A1 (en) 2021-10-21
KR20230002433A (ko) 2023-01-05
EP4122194A4 (en) 2023-08-16
US20240114141A1 (en) 2024-04-04
JP2023521503A (ja) 2023-05-24
EP4122194A1 (en) 2023-01-25
CN115462081A (zh) 2022-12-09
US20230063736A1 (en) 2023-03-02
EP4122204A1 (en) 2023-01-25
WO2021209063A1 (en) 2021-10-21
WO2021209064A1 (en) 2021-10-21
JP2023521502A (ja) 2023-05-24
EP4122204A4 (en) 2024-02-14
US11902529B2 (en) 2024-02-13
JP2024023524A (ja) 2024-02-21
US20230069756A1 (en) 2023-03-02
CN117596409A (zh) 2024-02-23
US20230075048A1 (en) 2023-03-09
CN115443658A (zh) 2022-12-06
US11936873B2 (en) 2024-03-19
JP7473680B2 (ja) 2024-04-23
CN115428446A (zh) 2022-12-02

Similar Documents

Publication Publication Date Title
WO2021083257A1 (en) Cross-component adaptive loop filter
WO2021083376A1 (en) Derivation of linear parameter in cross-component video coding
CN113728642A (zh) 编解码视频的量化残差差分脉冲编解码调制表示
WO2021104409A1 (en) Cross-component adaptive filtering and subblock coding
WO2021110018A1 (en) Separable secondary transform processing of coded video
KR20210154151A (ko) 코딩된 비디오에서 이차 변환의 사용
WO2020236719A2 (en) Transform design for large blocks in video coding
KR20220058551A (ko) 비디오 코딩의 양 예측 가중 샘플
US20240098266A1 (en) Using Neighboring Samples In Cross-Component Video Coding
WO2021190593A1 (en) Coded video processing using enhanced secondary transform
JP7473680B2 (ja) クロスコンポーネント予測のための利用制約

Legal Events

Date Code Title Description
A201 Request for examination