본 발명은 다양한 변경을 가할 수 있고 여러 가지 실시예를 가질 수 있는 바, 특정 실시예들을 도면에 예시하고 상세하게 설명하고자 한다. 그러나, 이는 본 발명을 특정 실시예에 한정하려고 하는 것이 아니다. 본 명세서에서 상용하는 용어는 단지 특정한 실시예를 설명하기 위해 사용된 것으로, 본 발명의 기술적 사상을 한정하려는 의도로 사용되는 것은 아니다. 단수의 표현은 문맥상 명백하게 다르게 뜻하지 않는 한, 복수의 표현을 포함한다. 본 명세서에서 "포함하다" 또는 "가지다" 등의 용어는 명세서상에 기재된 특징, 숫자, 단계, 동작, 구성 요소, 부품 또는 이들을 조합한 것이 존재함을 지정하려는 것이지, 하나 또는 그 이상의 다른 특징들이나 숫자, 단계, 동작, 구성 요소, 부품 도는 이들을 조합한 것들의 존재 또는 부가 가능성을 미리 배제하지 않는 것으로 이해되어야 한다.
한편, 본 발명에서 설명되는 도면상의 각 구성들은 서로 다른 특징적인 기능들에 관한 설명의 편의를 위해 독립적으로 도시된 것으로서, 각 구성들이 서로 별개의 하드웨어나 별개의 소프트웨어로 구현된다는 것을 의미하지는 않는다. 예컨대, 각 구성 중 두 개 이상의 구성이 합쳐져 하나의 구성을 이룰 수도 있고, 하나의 구성이 복수의 구성으로 나뉘어질 수도 있다. 각 구성이 통합 및/또는 분리된 실시예도 본 발명의 본질에서 벗어나지 않는 한 본 발명의 권리범위에 포함된다.
이하, 첨부한 도면들을 참조하여, 본 발명의 바람직한 실시예를 보다 상세하게 설명하고자 한다. 이하, 도면상의 동일한 구성 요소에 대해서는 동일한 참조 부호를 사용하고 동일한 구성 요소에 대해서 중복된 설명은 생략한다.
본 명세서에서 픽처(picture)는 일반적으로 특정 시간대의 하나의 영상을 나타내는 단위를 의미하며, 슬라이스(slice)는 코딩에 있어서 픽처의 일부를 구성하는 단위이다. 하나의 픽처는 복수의 슬라이스로 구성될 수 있으며, 필요에 따라서 픽처 및 슬라이스는 서로 혼용되어 사용될 수 있다.
픽셀(pixel) 또는 펠(pel)은 하나의 픽처(또는 영상)을 구성하는 최소의 단위를 의미할 수 있다. 또한, 특정한 픽셀의 값을 나타내는 용어로서 '샘플(sample)'이 사용될 수 있다. 샘플은 일반적으로 픽셀의 값을 나타낼 수 있으며, 휘도(luma) 성분의 픽셀 값만을 나타낼 수도 있고, 채도(chroma) 성분의 픽셀 값만을 나타낼 수도 있다.
유닛(unit)은 영상 처리의 기본 단위를 나타낸다. 유닛은 픽처의 특정 영역 및 해당 영역에 관련된 정보 중 적어도 하나를 포함할 수 있다. 유닛은 경우에 따라서 블록(block) 또는 영역(area) 등의 용어와 혼용하여 사용될 수 있다. 일반적인 경우, MxN 블록은 M개의 열과 N개의 행으로 이루어진 샘플들 또는 변환 계수(transform coefficient)들의 집합을 나타낼 수 있다.
도 1은 본 발명이 적용될 수 있는 3D 비디오의 인코딩 및 디코딩 과정을 개략적으로 설명하는 도면이다.
도 1을 참조하면, 3D 비디오 인코더는 비디오 픽처 및 뎁스 맵(depth map)과 카메라 파라미터(camera parameter)를 인코딩하여 비트스트림으로 출력할 수 있다.
뎁스 맵은 대응하는 비디오 픽처(텍스처 픽처)의 픽셀에 대하여 카메라와 피사체 간의 거리 정보(깊이 정보)로 구성될 수 있다. 예컨대, 뎁스 맵은 깊이 정보를 비트 뎁스(bit depth)에 따라 정규화한 영상일 수 있다. 이 때, 뎁스 맵은 색차 표현없이 기록된 깊이 정보로 구성될 수 있다. 뎁스 맵은 뎁스 맵 픽처 또는 뎁스 픽처로 불릴 수 있다.
일반적으로 피사체와의 거리와 디스패리티는 서로 반비례하므로, 카메라 파라미터를 이용하여 뎁스 맵의 깊이 정보로부터 뷰 간의 상관도를 나타내는 디스패리티 정보를 유도할 수 있다.
일반적인 컬러 영상 즉, 비디오 픽처(텍스처 픽처)와 함께 뎁스 맵과 카메라 파라미터를 포함하는 비트스트림은 네트워크(network) 또는 저장매체를 통해 디코더로 전송될 수 있다.
디코더 측에서는 비트스트림을 수신해서 비디오를 복원할 수 있다. 디코더 측에서 3D 비디오 디코더가 이용되는 경우, 3D 비디오 디코더는 비트스트림으로부터 비디오 픽처와 뎁스 맵 및 카메라 파라미터를 디코딩할 수 있다. 디코딩된 비디오 픽처와 뎁스 맵 그리고 카메라 파라미터를 기반으로 멀티 뷰(multi view) 디스플레이에 필요한 뷰들을 합성할(synthesize) 수도 있다. 이 때, 사용되는 디스플레이가 스테레오(stereo) 디스플레이인 경우라면, 복원된 멀티 뷰들 중에서 두 개의 뷰에 대한 픽처들을 이용하여 3D 영상을 디스플레이 할 수 있다.
스테레오 비디오 디코더가 사용되는 경우에, 스테레오 비디오 디코더는 비트스트림으로부터 양 안(eyes)에 각각 입사될 두 픽처를 복원할 수 있다. 스테레오 디스플레이에서는 왼쪽 눈에 입사되는 좌측 영상과 우측 눈에 입사되는 우측 영상의 시차(view difference) 혹은 디스패리티(disparity)를 이용해서 입체 영상을 디스플레이 할 수 있다. 스테레오 비디오 디코더와 함께 멀티 뷰 디스플레이가 사용되는 경우에는, 복원된 두 픽처를 기반으로 다른 뷰들을 생성하여 멀티 뷰를 디스플레이할 수도 있다.
2D 디코더가 사용되는 경우에는 2차원 영상을 복원해서 2D 디스플레이로 영상을 출력할 수 있다. 2D 디스플레이를 사용하지만, 디코더는 3D 비디오 디코더를 사용하거나 스테레오 비디오 디코더를 사용하는 경우에는 복원된 영상들 중 하나를 2D 디스플레이로 출력할 수도 있다.
도 1의 구성에서, 뷰 합성은 디코더 측에서 수행될 수도 있고, 디스플레이 측에서 수행될 수도 있다. 또한, 디코더와 디스플레이는 하나의 장치일 수도 있고 별도의 장치일 수 도 있다.
도 1에서는 설명의 편의를 위하여 3D 비디오 디코더와 스테레오 비디오 디코더 그리고 2D 비디오 디코더가 별도의 디코더인 것으로 설명하였으나, 하나의 디코딩 장치가 3D 비디오 디코딩, 스테레오 비디오 디코딩 그리고 2D 비디오 디코딩을 모두 수행할 수도 있다. 또한, 3D 비디오 디코딩 장치가 3D 비디오 디코딩을 수행하고, 스테레오 비디오 디코딩 장치가 스테레오 비디오 디코딩을 수행하며, 2D 비디오 디코딩 장치가 2D 비디오 디코딩을 수행할 수도 있다. 더 나아가, 멀티 뷰 디스플레이가 2D 비디오를 출력하거나 스테레오 비디오를 출력할 수도 있다.
도 2는 본 발명이 적용될 수 있는 비디오 인코딩 장치의 구성을 개략적으로 설명하는 도면이다.
도 2를 참조하면, 비디오 인코딩 장치(200)는 픽처 분할부(205), 예측부(210), 감산부(215), 변환부(220), 양자화부(225), 재정렬부(230), 엔트로피 인코딩부(235), 역양자화부(240), 역변환부(245), 가산부(250), 필터부(255) 및 메모리(260)을 포함한다.
픽처 분할부(205)는 입력된 픽처를 적어도 하나의 처리 유닛 블록(processing unit block)으로 분할할 수 있다. 이 때, 처리 유닛 블록은 코딩 유닛 블록(coding unit block), 예측 유닛 블록(prediction unit block) 또는 변환 유닛 블록(transform unit block)일 수 있다. 코딩 유닛 블록은 코딩의 유닛 블록으로서 최대(largest) 코딩 유닛 블록으로부터 쿼드 트리 구조(quad-tree structure)를 따라서 분할(split)될 수 있다. 예측 유닛 블록은 코딩 유닛 블록으로부터 파티셔닝(partitioning)되는 블록으로서, 샘플 예측의 유닛 블록일 수 있다. 이 때, 예측 유닛 블록은 서브 블록(sub block)으로 나뉠 수도 있다. 변환 유닛 블록은 코딩 유닛 블록으로부터 쿼드 트리 구조를 따라서 분할 될 수 있으며, 변환 계수를 따라서 유도하는 유닛 블록 또는 변환 계수로부터 레지듀얼 신호(residual signal)를 유도하는 유닛 블록일 수 있다.
이하, 코딩 유닛 블록은 코딩 블록(coding block, CB) 또는 코딩 유닛(coding unit, CU), 예측 유닛 블록은 예측 블록(prediction block, PB) 또는 예측 유닛(prediction unit, PU), 변환 유닛 블록은 변환 블록(transform block, TB) 또는 변환 유닛(transform unit, TU)라고 불릴 수 있다.
예측 블록 또는 예측 유닛은 픽처 내에서 블록 형태의 특정 영역을 의미할 수 있고, 예측 샘플의 어레이(array)를 포함할 수 있다. 또한, 변환 블록 또는 변환 유닛은 픽처 내에서 블록 형태의 특정 영역을 의미할 수 있고, 변환 계수 또는 레지듀얼 샘플의 어레이를 포함할 수 있다.
예측부(210)는 처리 대상 블록(이하, 현재 블록이라 함)에 대한 예측을 수행하고, 상기 현재 블록에 대한 예측 샘플들을 포함하는 예측 블록을 생성할 수 있다. 예측부(210)에서 수행되는 예측의 단위는 코딩 블록일 수 있고, 변환 블록일 수도 있고, 예측 블록일 수도 있다.
예측부(210)는 현재 블록에 인트라 예측이 적용되는지 인터 예측이 적용되는지를 결정할 수 있다. 일 예로, 예측부(210)는 CU 단위로 인트라 예측 또는 인터 예측이 적용되는지를 결정할 수 있다.
인트라 예측의 경우에, 예측부(210)는 현재 블록이 속하는 픽처(이하, 현재 픽처) 내의 현재 블록 외부의 참조 샘플을 기반으로 현재 블록에 대한 예측 샘플을 유도할 수 있다. 이 때, 예측부(210)는 (i) 현재 블록의 주변(neighboring) 참조 샘플들의 평균(average) 혹은 인터폴레이션(interpolation)을 기반으로 예측 샘플을 유도할 수 있고, (ii) 현재 블록의 주변 참조 샘플들 중 예측 샘플에 대하여 특정 (예측) 방향에 존재하는 참조 샘플을 기반으로 상기 예측 샘플을 유도할 수도 있다. (i)의 경우는 비방향성 모드, (ii)의 경우는 방향성(directional) 모드라고 불릴 수 있다. 예측부(210)는 주변 블록에 적용된 예측 모드를 이용하여, 현재 블록에 적용되는 예측 모드를 결정할 수도 있다.
인터 예측의 경우에, 예측부(210)는 참조 픽처 상에서 움직임 벡터에 의해 특정되는 샘플을 기반으로, 현재 블록에 대한 예측 샘플을 유도할 수 있다. 예측부(210)는 스킵(skip) 모드, 머지(merge) 모드, 및 MVP(motion vector prediction) 모드 중 어느 하나를 적용하여 현재 블록에 대한 예측 샘플을 유도할 수 있다. 스킵 모드와 머지 모드의 경우에, 예측부(210)는 주변 블록의 움직임 정보를 현재 블록의 움직임 정보로 이용할 수 있다. 스킵 모드의 경우, 머지 모드와 달리 예측 샘플과 원본 샘플 사이의 차(레지듀얼)이 전송되지 않는다. MVP 모드의 경우, 주변 블록의 움직임 벡터를 움직임 벡터 예측자(motion vector predictor)로 이용하여 현재 블록의 움직임 벡터 예측자로 이용하여 현재 블록의 움직임 벡터를 유도할 수 있다.
인터 예측의 경우에, 주변 블록은 현재 픽처 내에 존재하는 공간적 주변 블록(spatial neighboring block)과 참조 픽처(reference picture)에 존재하는 시간적 주변 블록(temporal neighboring block)을 포함한다. 상기 시간적 주변 블록을 포함하는 참조 픽처는 동일 위치 픽처(collocated picture, colPic)라고 불릴 수도 있다. 움직임 정보(motion information)는 움직임 벡터와 참조 픽처를 포함할 수 있다. 스킵 모드와 머지 모드에서 시간적 주변 블록의 움직임 정보가 이용되는 경우에, 참조 픽처 리스트(reference picture list) 상의 최상위 픽처가 참조 픽처로서 이용될 수도 있다.
멀티 뷰의 경우, 독립 뷰(independent view)와 종속 뷰(dependent view)로 구분될 수 있으며, 종속 뷰에 대한 인코딩의 경우에, 예측부(210)는 인터 예측뿐 아니라 인터 뷰(inter-view) 예측을 수행할 수도 있다.
예측부(210)는 다른 뷰의 픽처를 포함하여 참조 픽처 리스트를 구성할 수 있다. 인터 뷰 예측을 위해, 예측부(210)는 디스패리티 벡터를 유도할 수 있다. 현재 뷰 내 다른 픽처에서 현재 블록에 대응하는 블록을 특정하는 움직임 벡터와 달리, 디스패리티 벡터는 현재 픽처와 동일한 AU(access unit)의 다른 뷰에서 현재 블록에 대응하는 블록을 톡정할 수 있다. AU는 예를 들어 멀티 뷰에서, 동일 시점(same time instance)에 대응하는(correspond) 비디오 픽처들 및 뎁스 맵들을 포함할 수 있다. 여기서, AU는 POC(Picture Order Count)가 같은 픽처들의 집합을 의미할 수 있다. POC는 픽처의 디스플레이 순서에 대응하며, 코딩 순서와 구분될 수 있다.
예측부(210)는 디스패리티 벡터를 기반으로, 뎁스 뷰(depth view) 내의 뎁스 블록(depth block)을 특정할 수 있고, 머지 리스트의 구성, 인터 뷰 움직임 예측(inter-view motion prediction), 레지듀얼 예측, IC(illumination compensation), 뷰 합성 등을 수행할 수 있다.
현재 블록에 대한 디스패리티 벡터는 카메라 파라미터를 이용하여 뎁스 값으로부터 유도되거나, 현재 또는 다른 뷰 내 주변 블록의 움직임 벡터 또는 디스패리티 벡터로부터 유도될 수 있다.
예컨대, 예측부(210)는 참조 뷰(reference view)의 시간적 움직임 정보에 대응하는 인터 뷰 머지 후보(inter-view merging candidate: IvMC), 디스패리티 벡터 대응하는 인터 뷰 디스패리티 벡터 후보(inter-view disparity vector candidate: IvDC), 디스패리티 벡터의 쉬프트(shift)에 의해 유도되는 쉬프티드 인터뷰 머지 후보(shifted IvMC), 현재 블록이 뎁스 맵 상의 블록인 경우에 대응하는 텍스처 픽처로부터 유도되는 텍스처 머지 후보(texture merging candidate: T), 텍스처 머지 후보로부터 디스패리티를 이용하여 유도되는 디스패리티 유도 머지 후보(disparity derived merging candidate: D), 뷰 합성에 기반해서 유도되는 뷰 합성 예측 후보(view synthesis prediction candidate: VSP) 등을 머지 후보 리스트에 추가할 수 있다.
이 때, 종속 뷰에 적용되는 머지 후보 리스트에 포함되는 후보의 개수는 소정의 값으로 제한될 수 있다.
또한, 예측부(210)는 인터 뷰 움직임 벡터 예측을 적용하여, 디스패리티 벡터를 기반으로 현재 블록의 움직임 벡터를 예측할 수도 있다. 이 때, 예측부(210)는 대응하는 깊이 블록 내 최대 깊이 값의 전환(conversion)에 기반하여 디스패리티 벡터를 유도할 수 있다. 참조 뷰 내의 현재 블록의 샘플 위치에 디스패리티 벡터를 더하여 참조 뷰 내 참조 샘플의 위치가 특정되면, 참조 샘플을 포함하는 블록을 참조 블록으로 이용할 수 있다. 예측부(210)는 참조 블록의 움직임 벡터를 현재 블록의 후보 움직임 파라미터 혹은 움직임 벡터 예측자 후보로 이용할 수 있으며, 상기 디스패리티 벡터를 디스패리티 보상 예측(disparity compensated prediction: DCP)을 위한 후보 디스패리티 벡터로 이용할 수 있다.
감산부(215)는 원본 샘플과 예측 샘플 간의 차이인 레지듀얼 샘플을 생성한다. 스킵 모드가 적용되는 경우에는, 상술한 바와 같이 레지듀얼 샘플을 생성하지 않을 수 있다.
변환부(220)는 변환 블록 단위로 레지듀얼 샘플을 변환하여 변환 계수(transform coefficient)를 생성한다. 양자화부(225)는 변환 계수들을 양자화하여, 양자화된 변환 계수를 생성할 수 있다.
재정렬부(230)는 양자화된 변환 계수를 재정렬한다. 재정렬부(230)는 계수들 스캐닝(scanning) 방법을 통해 블록 형태의 양자화된 변환 계수들을 1차원 벡터 형태로 재정렬할 수 있다.
엔트로피 인코딩부(235)는 양자화된 변환 계수들에 대한 엔트로피 인코딩을 수행할 수 있다. 엔트로피 인코딩은 예를 들어 지수 골롬(exponential Golomb), CAVLC(context-adaptive variable length coding), CABAC(context-adaptive binary arithmetic coding) 등과 같은 인코딩 방법을 포함할 수 있다. 엔트로피 인코딩부(235)는 양자화된 변환 계수 외 비디오 복원에 필요한 정보들(예컨대 신택스 요소(syntax element)의 값 등)을 함께 또는 별도로 인코딩할 수도 있다. 엔트로피 인코딩된 정보들은 비트스트림 형태로 NAL(network abstraction layer) 유닛 단위로 전송 또는 저장될 수 있다.
가산부(250)는 레지듀얼 샘플과 예측 샘플을 합쳐서 픽처를 복원한다. 레지듀얼 샘플과 예측 샘플은 블록 단위로 더해져서 복원 블록이 생성될 수 있다. 여기서 가산부(250)는 별도의 구성으로 설명하였으나, 가산부(250)는 예측부(210)의 일부일 수 있다.
복원된 픽처(reconstructed picture)에 대하여 필터부(255)는 디블록킹 필터 및/또는 샘플 적응적 오프셋(sample adaptive offset)을 적용할 수 있다. 디블록킹 필터링 및/또는 샘플 적응적 오프셋을 통해, 복원 픽처 내 블록 경계의 아티팩트나 양자화 과정에서의 왜곡이 보정될 수 있다. 샘플 적응적 오프셋은 샘플 단위로 적용될 수 있으며, 디블록킹 필터링의 과정이 완료된 후 적용될 수 있다.
메모리(260)는 복원 픽처 또는 인코딩/디코딩에 필요한 정보를 저장할 수 있다. 예컨대, 메모리(260)는 인터 예측/인터 뷰 예측에 사용되는 (참조) 픽처들을 저장할 수 있다. 이 때, 인터 예측/인터 뷰 예측에 사용되는 픽처들은 참조 픽처 세트(reference picture set) 혹은 참조 픽처 리스트(reference picture list)에 의해 지정될 수 있다.
여기서는, 하나의 인코딩 장치가 독립 뷰 및 종속 뷰를 인코딩하는 것으로 설명하였으나, 이는 설명의 편의를 위한 것으로서, 각 뷰별로 별도의 인코딩 장치가 구성되거나, 각 뷰별로 별도의 내부 모듈(예컨대, 각 뷰별 예측 모듈)이 구성될 수도 있다.
도 3은 본 발명이 적용될 수 있는 비디오 디코딩 장치의 구성을 개략적으로 설명하는 도면이다.
도 3을 참조하면, 비디오 디코딩 장치(300)는 엔트로피 디코딩부(310), 재정렬부(320), 역양자화부(330), 역변환부(340), 예측부(350), 가산부(360), 필터부(370), 메모리(380)를 포함한다.
비디오 정보를 포함하는 비트스트림이 입력되면, 비디오 디코딩 장치는(300)는 비디오 인코딩 장치에서 비디오 정보가 처리된 프로세스에 대응하여 비디오를 복원할 수 있다.
예컨대, 비디오 디코딩 장치(300)는 비디오 인코딩 장치에서 적용된 처리 유닛을 이용하여 비디오 디코딩을 수행할 수 있다. 따라서 비디오 디코딩의 처리 유닛 블록은 코딩 유닛 블록, 예측 유닛 블록 또는 변환 유닛 블록일 수 있다. 코딩 유닛 블록은 디코딩의 유닛 블록으로서 최대 코딩 유닛 블록으로부터 쿼드 트리 구조를 따라서 분할될 수 있다. 예측 유닛 블록은 코딩 유닛 블록으로부터 파티셔닝되는 블록으로서, 샘플 예측의 유닛 블록일 수 있다. 이 때, 예측 유닛 블록은 서브 블록으로 나뉠 수도 있다. 변환 유닛 블록은 코딩 유닛 블록으로부터 쿼드 트리 구조를 따라서 분할 될 수 있으며, 변환 계수를 유도하는 유닛 블록 또는 변환 계수로부터 레지듀얼 신호를 유도하는 유닛 블록일 수 있다.
엔트로피 디코딩부(310)는 비트스트림을 파싱하여 비디오 복원 또는 픽처 복원에 필요한 정보를 출력할 수 있다. 예컨대, 엔트로피 디코딩부(310)는 지수 골롬 부호화, CAVLC 또는 CABAC 등의 코딩 방법을 기초로 비트스트림 내 정보를 디코딩하고, 비디오 복원에 필요한 신택스 엘리먼트의 값, 레지듀얼에 관한 변환 계수의 양자화된 값 들을 출력할 수 있다.
3D 비디오를 재생하기 위해 복수의 뷰(view)를 처리하는 경우, 비트스트림은 각 뷰 별로 입력될 수 있다. 혹은, 비트스트림 내에서 각 뷰에 대한 정보가 멀티플렉싱되어 있을 수 있다. 이 경우, 엔트로피 디코딩부(310)는 비트스트림을 역다중화(de-multiplixing)하여 뷰 별로 파싱(parsing)할 수도 있다.
재정렬부(320)는 양자화되어 있는 변환 계수들을 2차원의 블록 형태로 재정렬할 수 있다. 재정렬부(320)는 인코딩 장치에서 수행된 계수 스캐닝에 대응하여 재정렬을 수행할 수 있다.
역양자화부(330)는 양자화되어 있는 변환 계수들을 (역)양자화 파라미터를 기반으로 역양자화하여 변환 계수를 출력할 수 있다. 이 때, 양자화 파라미터를 유도하기 위한 정보는 인코딩 장치로부터 시그널링될 수 있다.
역변환부(340)는 변환 계수들을 역변환하여 레지듀얼 샘플들을 유도할 수 있다.
예측부(350)는 현재 블록에 대한 예측을 수행하고, 상기 현재 블록에 대한 예측 샘플들을 포함하는 예측 블록을 생성할 수 있다. 예측부(350)에서 수행되는 예측의 단위는 코딩 블록일 수도 있고, 변환 블록일 수도 있고, 예측 블록일 수도 있다.
예측부(350)는 인트라 예측을 적용할 것인지 인터 예측을 적용할 것인지를 결정할 수 있다. 이 때, 인트라 예측과 인터 예측 중 어느 것을 적용할 것인지를 결정하는 단위와 예측 샘플을 생성하는 단위는 상이할 수 있다. 아울러, 인터 예측과 인트라 예측에 있어서 예측 샘플을 생성하는 단위 또한 상이할 수 있다. 예를 들어, 인터 예측과 인트라 예측 중 어느 것을 적용할 것인지는 CU 단위로 결정할 수 있다. 또한 예를 들어, 인터 예측에 있어서 PU 단위로 예측 모드를 결정하고 예측 샘플을 생성할 수 있고, 인트라 예측에 있어서 PU 단위로 예측 모드를 결정하고 TU 단위로 예측 샘플을 생성할 수도 있다.
인트라 예측의 경우에, 예측부(350)는 현재 픽처 내의 주변 참조 샘플을 기반으로 현재 블록에 대한 예측 샘플을 유도할 수 있다. 예측부(350)는 현재 블록의 주변 참조 샘플을 기반으로 방향성 모드 또는 비방향성 모드를 적용하여 현재 블록에 대한 예측 샘플을 유도할 수 있다. 이 때, 주변 블록의 인트라 예측 모드를 이용하여 현재 블록에 적용할 예측 모드가 결정될 수도 있다.
인터 예측의 경우에, 예측부(350)는 참조 픽처 상에서 움직임 벡터에 의해 참조 픽처 상에서 특정되는 샘플을 기반으로 현재 블록에 대한 예측 샘플을 유도할 수 있다. 예측부(350)는 스킵(skip) 모드, 머지(merge) 모드 및 MVP 모드 중 어느 하나를 적용하여 현재 블록에 대한 예측 샘플을 유도할 수 있다.
스킵 모드와 머지 모드의 경우에, 주변 블록의 움직임 정보가 현재 블록의 움직임 정보로 이용될 수 있다. 이 때, 주변 블록은 공간적 주변 블록과 시간적 주변 블록을 포함할 수 있다.
예측부(350)는 가용한 주변 블록의 움직임 정보로 머지 후보 리스트를 구성하고, 머지 인덱스가 머지 후보 리스트 상에서 지시하는 정보를 현재 블록의 움직임 벡터로 사용할 수 있다. 머지 인덱스는 인코딩 장치로부터 시그널링될 수 있다. 움직임 정보는 움직임 벡터와 참조 픽처를 포함할 수 있다. 스킵 모드와 머지 모드에서 시간적 주변 블록의 움직임 정보가 이용되는 경우에, 참조 픽처 리스트 상의 최상위 픽처가 참조 픽처로서 이용될 수 있다.
스킵 모드의 경우, 머지 모드와 달리 예측 샘플과 원본 샘플 사이의 차이(레지듀얼)이 전송되지 않는다.
MVP 모드의 경우, 주변 블록의 움직임 벡터를 움직임 벡터 예측자(motion vector predictor)로 이용하여 현재 블록의 움직임 벡터가 유도될 수 있다. 이 때, 주변 블록은 공간적 주변 블록과 시간적 주변 블록을 포함할 수 있다.
종속 뷰(dependent view)에 대한 경우에, 예측부(350)는 인터 뷰 예측을 수행할 수 있다. 이 때, 예측부(350)는 다른 뷰의 픽처를 포함하여 참조 픽처 리스트를 구성할 수 있다.
인터 뷰 예측을 위해, 예측부(350)는 디스패리티 벡터를 유도할 수 있다. 예측부(350)는 디스패리티 벡터를 기반으로, 뎁스 뷰(depth view) 내의 뎁스 블록을 특정할 수도 있고, 머지 리스트의 구성, 인터 뷰 움직임 예측(inter-view motion prediction), 레지듀얼 예측, IC(illumination compensation), 뷰 합성 등을 수행할 수 있다.
현재 블록에 대한 디스패리티 벡터는 카메라 파라미터를 이용하여 뎁스 값으로부터 유도되거나, 현재 또는 다른 뷰 내 주변 블록의 움직임 벡터 또는 디스패리티 벡터로부터 유도될 수 있다. 카메라 파라미터는 인코딩 장치로부터 시그널링될 수 있다.
종속 뷰의 현재 블록에 머지 모드를 적용하는 경우에, 예측부(350)는 c마조 뷰(refernece view)의 시간적 움직임 정보에 대응하는 IvMC, 디스패리티 벡터에 대응하는 IvDC, 디스패리티 벡터의 쉬프트(shift)에 의해 유도되는 쉬프티드 IvMC, 현재 블록이 뎁스 맵 상의 블록인 경우에 대응하는 텍스처 픽처로부터 유도되는 텍스처 머지 후보(T), 텍스처 머지 후보로부터 디스패리티를 이용하여 유도되는 디스패리티 유도 머지 후보(D), 뷰 합성에 기반해서 유도되는 뷰 합성 예측 머지 후보(VSP) 등을 머지 후보 리스트에 추가할 수 있다.
이 때, 종속 뷰에 적용되는 머지 후보 리스트에 포함되는 후보의 개수는 소정의 값으로 제한될 수 있다.
또한, 예측부(350)는 인터 뷰 움직임 벡터 예측을 적용하여, 디스패리티 벡터를 기반으로 현재 블록의 움직임 벡터를 예측할 수도 있다. 이 때, 예측부(350)는 디스패리티 벡터에 의해서 특정되는 참조 뷰 내 블록을 참조 블록으로 이용할 수 있다. 예측부(350)는 참조 블록의 움직임 벡터를 현재 블록의 후보 움직임 파라미터 혹은 움짐익 벡터 예측자 후보로 이용할 수 있으며, 상기 디스패리티 벡터를 디스패리티 보상 예측(disparity compensated prediction: DCP)을 위한 후보 디스패리티 벡터로 이용할 수 있다.
가산부(360)는 레지듀얼 샘플과 예측 샘플을 더하여 현재 블록 혹은 현재 픽처를 복원할 수 있다. 가산부(360)는 레지듀얼 샘플과 예측 샘플을 블록 단위로 더하여 현재 픽처를 복원할 수도 있다. 스킵 모드가 적용된 경우에는 레지듀얼이 전송되지 않으므로, 예측 샘플이 복원 샘플이 될 수 있다. 여기서는 가산부(360)를 별도의 구성으로 설명하였으나, 가산부(360)는 예측부(350)의 일부일 수도 있다.
필터부(370)는 복원된 픽처에 디블록킹 필터링 및/또는 샘플 적응적 오프셋을 적용할 수 있다. 이 때, 샘플 적응적 오프셋은 샘플 단위로 적용될 수 있으며, 디블록킹 필터링 이후 적용될 수도 있다.
메모리(380)는 복원 픽처 또는 디코딩에 필요한 정보를 저장할 수 있다. 예컨대, 메모리(380)는 인터 예측/인터 뷰 예측에 사용되는 픽처들을 저장할 수 있다. 이 때, 인터 예측/인터 뷰 예측에 사용되는 픽처들은 참조 픽처 세트 혹은 참조 픽처 리스트에 의해 지정될 수도 있다. 복원된 픽처는 다른 픽처에 대한 참조 픽처로서 이용될 수 있다.
또한, 메모리(380)는 복원된 픽처를 출력 순서에 따라서 출력할 수도 있다. 도시되지는 않았으나, 3D 영상을 재생하기 위해, 출력부는 복수의 서로 다른 뷰를 디스플레이할 수 있다.
도 3의 예에서는, 하나의 디코딩 장치에서 독립 뷰(independent view)와 종속 뷰(dependent view)가 디코딩되는 것으로 설명하였으나, 이는 설명의 편의를 위한 것으로서 본 발명은 이에 한정되지 않는다. 예컨대, 뷰 별로 각각의 디코딩 장치가 동작할 수도 있고, 하나의 디코딩 장치 내의 각 뷰에 대응하는 내부 모듈(예컨대, 예측 모듈)이 구비될 수도 있다.
멀티 뷰 비디오 코딩은 현재 픽처와 동일한 AU(access unit)에 속하는 다른 뷰의 디코딩 데이터를 이용하여 현재 픽처를 코딩함으로써 현재 뷰에 대한 비디오 코딩 효율을 높일 수 있다.
멀티 뷰 비디오 코딩에서는 AU 단위로 뷰들을 코딩할 수 있고, 뷰 단위로 픽처들을 코딩할 수도 있다. 뷰들 간에는 정해진 순서에 따라서 코딩이 진행된다. 다른 뷰의 참조 없이 코딩될 수 있는 뷰를 베이스 뷰(base view) 또는 독립 뷰라고 할 수 있다. 또한 독립 뷰가 코딩된 뒤에 독립 뷰 또는 다른 뷰를 참조해서 코딩될 수 있는 뷰를 종속 뷰 또는 확장 뷰라고 할 수 있다. 또한, 현재 뷰가 종속 뷰인 경우, 현재 뷰의 코딩에 참조되는 뷰를 참조 뷰라고 할 수도 있다. 여기서 뷰를 코딩한다 함은 해당 뷰에 속하는 비디오 픽처, 뎁스 맵 등을 코딩함을 포함한다.
3D 비디오는 일반적인 컬러 영상 정보를 가지는 비디오 픽처(또는 텍스처(texture) 픽처)와, 비디오 픽처에 대한 깊이 정보를 가지는 뎁스 맵(depth map)을 포함한다. 3D 비디오에서는 동일한 POC에 서로 다른 시점을 갖는 복수 개의 비디오 픽처가 존재할 수 있으며, 상기 복수 개의 비디오 픽처에 각각 대응하는 뎁스 맵이 존재할 수 있다. 또한, 상기 복수 개의 비디오 픽처는 서로 다른 시점을 갖는 복수의 카메라로부터 획득될 수 있다.
3D 비디오는 멀티-뷰 비디오 플러스 뎁스(Multiview Video plus Depth) 포멧(format)으로 나타내어질 수 있다. 인코딩 장치에서는 몇몇 캡쳐된 뷰들 및 연관된 뎁스 맵들이 코딩되고, 그에 따른 비트스트림 패킷들이(resulting bitstream packets) 3D 비디오 비트스트림으로 멀티플렉싱될 수 있다. 디코딩 장치에서는 비디오 픽처 및 뎁스 맵에 관한 데이터를 디코딩하고, 필요한 경우 DIBR(depth-image-based rendering) 기법을 이용하여 부가적인 중간 뷰(additional intermediate view)를 합성할 수 있다. 뷰 합성을 위하여 카메라 파라미터가 상기 비트스트림에 부가적으로 포함될 수 있다. 카메라 파라미터는 ZFar, Znear, 초첨 거리(Focal Length) 등을 포함할 수 있다.
도 4a 및 도 4b는 본 발명에서 사용될 수 있는 카메라 파라미터를 설명하기 위한 도면이다. 도 4a 및 도 4b는 3D 비디오에서 사용될 수 있는 카메라 모델의 실시예를 도시한다.
상술한 바와 같이 카메라 파라미터는 VSP를 위해 사용되는 참조 픽처를 합성하기 위해 사용될 수 있으며, 디코딩 장치에서 중간 시점 영상을 생성하기 위해 사용될 수도 있다. 따라서, 디코딩 장치는 각각의 시점 별로 카메라 파라미터를 인코딩하여 디코딩 장치로 네트워크 또는 저장매체를 통하여 전송할 수 있다.
도 4a를 참조하면, W로 표시된 좌표계는 공간상에서 카메라의 위치를 지정하기 위해 사용되는 '기준 좌표계'를 의미할 수 있다. 또한, C로 표시된 좌표계는, 도 4A에 도시된 카메라 파라미터들에 대응되는 카메라의 초점(focal point, 410)을 원점으로 갖는, '카메라 좌표계'를 의미할 수 있다. 또한, 도 4a의 420은 카메라에 의해 획득된 영상이 표시되는 이미지 평면(image plane)을 나타낸다.
도 4a의 실시예에서, f는 카메라의 초점(410)에서 이미지 평면(420)까지의 거리(z축 상의 거리), 즉 초점 거리(focal length)를 나타낸다. 또한, (u0,v0)는 카메라의 광축(optical axis)이 상기 이미지 평면(420)과 만나는 지점의 좌표, 즉, 주점의 좌표(coordinate of a principal point)를 나타낼 수 있다. 상기 광축은 카메라 좌표계에서 이미지 평면(420)의 수직인 좌표 축을 의미할 수 있으며, 도 4a에서는 z축으로 나타내어지고 있다. 따라서 카메라의 초점(410)에서 주점(a principal point)까지의 거리는 초점 거리에 해당될 수 있다. 상술한 세 개의 파라미터(f, u0, v0)는 내부 카메라 파라미터(intrinsic camera parameter)로 불릴 수 있다.
한편, 카메라 파라미터에는 기준 좌표계(W)를 기준으로 카메라 좌표계(C)를 나타내기 위해 사용되는, 3×3 회전 매트릭스(rotation matrix, R) 및 3×1 변형 벡터(translation vector, T)도 있을 수 있다. 여기서, 상기 3×3 회전 매트릭스(R)은 기준 좌표계를 기준으로 카메라 좌표계가 3차원 공간에서 회전한 정도를 나타낸다. 즉, 상기 3×3 회전 매트릭스(R)은 기준 좌표계를 기준으로 하는 카메라 좌표계의 3차원 회전을 나타낸다. 또한, 상기 3×1 변형 벡터(T)는 기준 좌표계를 기준으로 한 카메라 좌표계의 위치를 나타내는 벡터이다. 상기 3×3 회전 매트릭스(R) 및 상기 3×1 변형 벡터(T) ([R,T])는 기준 좌표계와 카메라 좌표계의 기하학적 관계를 나타낼 수 있다. 따라서 상기 두 파라미터는 외부 카메라 파라미터(extrinsic camera parameter)로 불릴 수 잇다.
도 4b는 카메라의 광축(optical axis)에 수직으로 위치한 세 개의 평면을 도시한다. 도 4b의 410은 카메라의 초점, 즉 카메라 좌표계의 원점을 나타내고, 420은 이미지 평면을 나타낸다.
하나의 카메라가 촬영한 장면은 다양한 뎁스 값을 가질 수 있다. 이 때, 가장 작은 뎁스 갚을 갖는 지점은 카메라에 가장 가까이 위치한 지점일 수 있고, 가장 큰 뎁스 갖는 지점은 카메라에서 가장 멀리 위치한 지점일 수 있다. 도 4b의 430은 410의 초점을 갖는 카메라가 촬영한 장면에서 가장 작은 뎁스 값에 해당되는 평면을 나타내고, 이는 근접 클리핑 평면(near clipping plane)으로 불릴 수 있다. 또한, 4b의 440은 410 초점을 갖는 카메라가 촬영한 장면에서 가장 큰 뎁스 값에 해당되는 평면을 나타내고, 이는 원거리 클리핑 평면(far clipping plane)으로 불릴 수 있다.
하나의 카메라가 촬영한 임의의 장면에서, 가장 작은 뎁스 값은 Znear(Zn)으로 나타내어질 수 있고, 이는 근접 클리핑 평면(430)이 갖는 뎁스 값에 해당될 수 있다. 가장 큰 뎁스 값은 Zfar(Zf)로 나타내어질 수 있고, 이는 원거리 클리핑 평면(440)이 갖는 뎁스 값에 해당될 수 있다. 상기 Znear 및 Zfar는 카메라 파라미터에 해당하며, Z-클리핑 파라미터(Z-clipping parameter)로 불릴 수 있다.
인코딩 장치에서 처리되어 디코딩 장치로 전송되는 뎁스 데이터는 비트심도(BitDepth)에 기반한 값을 가질 수 있다. 일 예로, 비트심도가 8일 경우 우 뎁스 맵 내의 뎁스 샘플 값들은 0 내지 255의 값을 가질 수 있다. 이 경우 상기 뎁스 샘플 값들은 Z-클리핑 파라미터 Znear 및 Zfar 사이의 뎁스 값들이 각각 256 레벨로 양자화된 값에 해당될 수 있다. 따라서, 양자화된 뎁스 샘플 값들은 Z-클리핑 파라미터 Znear 및 Zfar를 기반으로 실제 깊이 값으로 변환될 수 있다. 이는 예를 들어 다음 수학식과 같이 나타내어질 수 있다.
여기서, Znear는 근접 클리핑 파라미터를 나타내고, Zfar는 원거리 클리핑 파라미터를 나타낸다. 또한, z는 실제 뎁스 값을 나타내고, v는 뎁스 맵에 포함된 뎁스 샘플 값의 강도(intensity)를 나타낸다.
또한, DIBR을 기반으로 합성된 뷰의 픽처를 참조 픽처로 이용하여 현재 픽처(또는 블록)에 대한 예측을 수행하는 VSP, 그리고 대응하는 뎁스 블록을 기반으로 디스패리티 벡터 후보에 대하여 수행되는 뎁스 정제(depth refinement) 등에 있어서도 뎁스 값을 디스패리티 값으로 전환(conversion)하기 위하여 카메라 파라미터가 사용될 수 있다. 이러한 전환을 위한 카메라 파라미터는 전환 파라미터라고 불릴 수 있으며, 뎁스-디스패리티 테이블(Depth to disparity table)을 구성하기 위하여 사용될 수도 있다. 뎁스 값을 디스패리티 값으로 전환하기 위하여 필요한 카메라 파라미터들은 비트스트림에 포함될 수 있으며, 상기 카메라 파라미터(또는 전환 파라미터)는 스케일 인자(scale factor) 및 오프셋(offset)에 관한 파라미터들을 포함할 수 있다. 디스패리티 벡터의 수직 성분(vertical component)은 0으로 설정될 수 있으며, 디스패리티 벡터의 수평 성분(horizontal component)는 다음 수학식을 기반으로 도출될(derived) 수 있다.
여기서, v는 뎁스 샘플 값이고, s는 스케일 인자, o는 오프셋, 그리고 n은 상기 디스패리티 벡터의 요구되는 정확성(required accuracy)에 기반한 쉬프트 파라미터이다. 현재 뷰와 뎁스 샘플이 있는 뷰 인덱스 j인 뷰 사이의 디스패리티 벡터를 도출하기 위한 역방향(backward) 전환에서는 상기 스케일 인자는 cp_scale[j]를 기반으로 도출될 수 있고, 상기 오프셋은 cp_off[j]를 기반으로 도출될 수 있다. 또한, 뷰 인덱스 j인 뷰와 뎁스 샘플이 있는 현재 뷰 사이의 디스패리티 벡터를 도출하기 위한 순방향(forward) 전환에서는 상기 스케일 인자는 cp_inv_scale_plus_scale[j]를 기반으로 도출될 수 있고, 상기 오프셋은 cp_inv_off_plus_off[j]를 기반으로 도출될 수 있다.
본 발명에서 카메라 파라미터는 다수의 파라미터들을 포함할 수 있으며, 카메라 파라미터 세트라고 불릴 수 있다. 상기 카메라 파라미터는 시간의 흐름에 따라 뷰의 픽처들 간 공유되거나 변경될 수 있다. 일 예로, 3D 비디오가 끝날 때까지 카메라의 위치가 고정되거나 다시점 카메라들 간의 상대 위치가 바뀌지 않는 경우, 뷰의 각 픽처들은 하나의 카메라 파라미터를 공유할 수 있다. 이 경우에는 VPS(video parameter set) 신택스(syntax)를 통하여 해당 뷰의 대표되는 카메라 파라미터가 전송될 수 있다. 이 경우 상기 VPS 신택스는 예를 들어 다음과 같이 나타내어질 수 있다.
표 1
… | |
cp_in_slice_segment_header_flag[i] | u(1) |
if(!cp_in_slice_segment_header_flag[i]) | |
for(j=0;j < i;j++){ | |
vps _cp_scale[i][j] | se(v) |
vps _cp_off[i][j] | se(v) |
vps_cp_inv_scale_plus_scale[i][j] | se(v) |
vps _cp_ inv _off_plus_off[i][j] | se(v) |
} | |
여기서, cp_in_slice_segment_header_flag는 i-th 뷰에 대하여 슬라이스 세그먼트 헤더에 카메라 파라미터가 존재하는지 여부를 나타내는 플래그 정보이다.
cp_in_slice_segment_header_flag[i]의 값이 0인 경우, 카메라 파라미터에 관한 신택스 요소들(syntax elements) vps_cp_scale[i][j], vps_cp_off[i][j], vps_cp_inv_scale_plus_scale[i][j], 및 vps_cp_inv_off_plus_off[i][j]가 상기 VPS에 존재하고, nuh_layer_id가 layerId랑 같은 값을 갖고 VpsViewIdx[layerId]가 i와 같은 값을 갖는 슬라이스 세그먼트 헤더들에 cp_scale[j], cp_off[j], cp_inv_scale_plus_scale[j], 및 cp_inv_off_plus_off[j]가 존재하지 않음을 나타낸다.
여기서, vps_cp_scale[i][j], vps_cp_off[i][j], vps_cp_inv_scale_plus_scale[i][j], 및 vps_cp_inv_off_plus_off[i][j]는 뎁스 값을 디스패리티 값으로 전환(converting)하기 위한 파라미터를 나타낸다. vps_cp_scale[i][j], vps_cp_off[i][j], vps_cp_inv_scale_plus_scale[i][j], 및 vps_cp_inv_off_plus_off[i][j]는 VPS에 명시된 i-th 뷰에 대한 cp_scale[j], cp_off[j], cp_inv_scale_plus_scale[j], 및 cp_inv_off_plus_off[j]의 값을 유도하기 위하여 사용될 수 있다.
다른 예로, 카메라의 움직임 때문에 시간이 지남에 따라 카메라 파라미터의 값이 바뀔 수도 있다. 이런 경우에는 하나의 뷰의 픽처들 간에 카메라 파라미터가 시간에 따라 다를 수 있으며, 슬라이스 세그먼트 헤더를 통해 카메라 파라미터가 전송될 수 있다. 이 경우 상기 슬라이스 세그먼트 헤더는 예를 들어 다음과 같이 나타내어질 수 있다.
표 2
… | |
if(nuh_layer_id > 0 && cp_in_slice_segment_header_flag[ViewIdx]) | |
for(j=0;j < ViewIdx;j++){ | |
cp_scale[j] | se(v) |
cp_off[j] | se(v) |
cp_ inv _scale_plus_scale[j] | se(v) |
cp_ inv _off_plus_off[j] | se(v) |
} | |
즉, cp_in_slice_segment_header_flag[i]의 값이 1인 경우, VpsViewIdx[layerId]가 i와 같은 값을 갖는 슬라이스 세그먼트 헤더들에 뎁스 값을 디스패리티 값으로 전환(converting)하기 위한 파라미터들인 cp_scale[j], cp_off[j], cp_inv_scale_plus_scale[j], 및 cp_inv_off_plus_off[j]가 존재함을 나타낸다.
즉, 상기에 따르면, 하나의 뷰 내에서 카메라 파라미터가 한번이라도 바뀌는 경우에는 슬라이스 세그먼트 헤더를 통해 카메라 파라미터가 전송될 수 있다. 이 경우 별도의 제한이 없다면 매 슬라이스마다 카메라 파라미터가 전송될 수 있다.
다만, 카메라 파라미터가 매 POC마다 바뀌는 것이 아니라 일정 구간(period)에서는 같은 카메라 파라미터가 이용되는 경우에도, 매 슬라이스마다 카메라 파라미터가 전송된다면, 동일한 정보가 불필요하게 중복 전송될 수 있으며 코딩 효율을 저하시킬 수 있다.
후술하는 본 발명의 실시예들에 따르면 중복된 카메라 파라미터 전송을 방지하고, 뷰 내의 일정 구간의 픽처들(또는 슬라이스들)은 같은 카메라 파라미터를 공유할 수 있다. 본 발명에 따르면 현재 슬라이스(또는 픽처)가 이전 슬라이스(또는 픽처)와 같은 카메라 파라미터를 사용할 경우 같은 값을 새로 전송하지 않고, 이전 슬라이스(또는 픽처)의 카메라 파라미터를 이용할 수 있다.
일 실시예로, 슬라이스 세그먼트 헤더에서 이전 슬라이스에서 사용했던 카메라 파라미터가 사용되는지 여부를 나타내는 플래그 정보가 전송될 수 있다. 예를 들어 만일 상기 플래그 정보가 1이라면, 카메라 파라미터(예를 들어 cp_scale[j], cp_off[j], cp_inv_scale_plus_scale[j], 및 cp_inv_off_plus_off[j])가 해당 슬라이스 세그먼트 헤더에 포함되어 전송되지 않는다. 만일 상기 플래그 정보가 0이라면, 새로운 카메라 파라미터가 해당 슬라이스 세그먼트 헤더에 포함되어 전송될 수 있고, 디코딩 장치는 상기 전환 파라미터를 파싱하여 사용할 수 있다. 또는 이와 반대로 상기 플래그 정보가 0인 경우 새로운 파라미터가 해당 슬라이스 세그먼트 헤더에 포함되어 전송되지 않고, 상기 플래그 정보가 1인 경우 카메라 파라미터가 해당 슬라이스 세그먼트 헤더에 포함되어 전송될 수도 있다. 이 때, 만일 현재 디코딩 하는 픽처가 랜덤 엑세스 포인트일 경우에는 무조건 상기 카메라 파라미터를 파싱할 수도 있다. 상기 슬라이스 세그먼트 헤더는 예를 들어 다음과 같이 나타내어질 수 있다.
표 3
slice segment header() { | Descriptor |
… | |
if(nuh_layer_id > 0 && cp_in_slice_segment_header_flag[ViewIdx]) | |
prev _cp_in_slice_segment_header_flag[ ViewIdx ] | u(1) |
if(!prev_cp_in_slice_segment_header_flag[ViewIdx]) | |
for(j=0;j < ViewIdx;j++){ | |
cp_scale[j] | se(v) |
cp_off[j] | se(v) |
cp_inv_scale_plus_scale[j] | se(v) |
cp_ inv _off_plus_off[j] | se(v) |
} | |
… | |
} | |
여기서, prev_cp_in_slice_segment_header_flag는 현재 슬라이스에 이전 슬라이스에서 사용했던 카메라 파라미터가 사용되는지 여부를 나타내는 플래그 정보이다.
prev_cp_in_slice_segment_header_flag[ViewIdx] 의 값이 0인 경우, 신택스 요소들 cp_scale[j], cp_off[j], cp_inv_scale_plus_scale[j], 및 cp_inv_off_plus_off[j]가 슬라이스 세그먼트 헤더에 존재함을 나타낸다.
prev_cp_in_slice_segment_header_flag[ViewIdx] 의 값이 1인 경우, cp_scale[j], cp_off[j], cp_inv_scale_plus_scale[j], 및 cp_inv_off_plus_off[j]가 슬라이스 세그먼트 헤더에 존재하지 않고, 뷰 인덱스가 ViewIdx와 같은 뷰 인덱스를 갖는 이전 슬라이스 세그먼트 헤더의 대응하는 신택스 요소들로부터 cp_scale[j], cp_off[j], cp_inv_scale_plus_scale[j], 및 cp_inv_off_plus_off[j]가 도출됨을 나타낸다.
prev_cp_in_slice_segment_header_flag[ViewIdx]가 존재하지 않는 경우, prev_cp_in_slice_segment_header_flag[ViewIdx]의 값은 1인 것으로 추론될(inferred) 수 있다. 엑세스 유닛 상 nuh_layer_id가 0인 픽처가 IRAP(intra random access point) 픽처인 경우, 슬라이스 세그먼트 헤더 내의 prev_cp_in_slice_segment_header_flag[ViewIdx]의 값은 0과 같을 수 있다.
cp_scale[j], cp_off[j], cp_inv_scale_plus_scale[j], 및 cp_inv_off_plus_off[j]는 뎁스 값을 디스패리티 값으로 전환하기 위한 파라미터를 나타낸다. 해당 파라미터들이 존재하지 않고 prev_cp_in_slice_segment_header_flag[ViewIdx]의 값이 0인 경우, cp_scale[j], cp_off[j], cp_inv_scale_plus_scale[j], 및 cp_inv_off_plus_off[j]의 값들은 각각 vps_cp_scale[ViewIdx][j], vps_cp_off[ViewIdx][j], vps_cp_inv_scale_plus_scale[ViewIdx][j], 및 vps_cp_inv_off_plus_off[ViewIdx][j]와 같도록 추론될 수 있다. 여기서 ViewIdxA가 ViewIdxB와 같은 경우, ViewIdxA와 같은 ViewIdx를 갖는 슬라이스 세그먼트 헤더 내의 cp_scale[j], cp_off[j], cp_inv_scale_plus_scale[j], 및 cp_inv_off_plus_off[j]는 ViewIdxB와 같은 ViewIdx를 갖는 슬라이스 세그먼트 헤더 내의 cp_scale[j], cp_off[j], cp_inv_scale_plus_scale[j], 및 cp_inv_off_plus_off[j]와 같다.
다른 실시예로, 시간에 따라 카메라 파라미터가 바뀌는 경우에 VPS를 통하여 디폴트 카메라 파라미터를 전송하고, 슬라이스 세그먼트 헤더를 통하여 카메라 파라미터가 업데이트되는지 여부 나타내는 플래그 정보를 전송할 수 있다. 이를 통하여 디코딩 장치는 새로운 카메라 파라미터의 파싱 여부를 결정할 수 있다. 만일, 상기 플래그 정보가 0을 나타내면, 슬라이스 세그먼트 헤더에서는 카메라 파라미터가 포함되지 않으며, 디코딩 장치 내에 저장된 현재 시점의 카메라 파라미터를 사용한다. 즉, 카메라 파라미터가 한 번도 업데이트되지 않은 경우, 상기 디폴트 카메라 파라미터가 디코딩 장치에 저장될 것이다. 만약 카메라 파라미터가 업데이트되어 상기 플래그 정보가 1을 나타내는 경우, 디코딩 장치는 슬라이스 세그먼트 헤더에 포함된 새로운 카메라 파라미터 값을 파싱하고, 현재 시점에 대하여 공유되는 상기 카메라 파라미터를 업데이트한다. 이 때, 만일 현재 디코딩 하는 픽처가 랜덤 엑세스 포인트일 경우에는 무조건 상기 카메라 파라미터를 파싱할 수도 있다.
이 경우, 상기 VPS 및 상기 슬라이스 세그먼트 헤더는 예를 들어 각각 다음 표 4 및 5와 같이 나타내어질 수 있다.
표 4
vps extension2(){ | Descriptor |
… | |
cp_precision | ue(v) |
for(i=1;i < NumViews; i++){ | |
cp_present_flag[i] | u(1) |
if(cp_present_flag[i]){ | |
cp_in_slice_segment_header_flag[i] | u(1) |
for(j=0;j < i;j++){ | |
vps _cp_scale[i][j] | se(v) |
vps _cp_off[i][j] | se(v) |
vps _cp_ inv _scale_plus_scale[i][j] | se(v) |
vps _cp_ inv _off_plus_off[i][j] | se(v) |
} | |
} | |
} | |
… | |
} | |
여기서, vps_cp_scale[i][j], vps_cp_off[i][j], vps_cp_inv_scale_plus_scale[i][j], 및 vps_cp_inv_off_plus_off[i][j]는 뎁스 값을 디스패리티 값으로 전환하기 위한 (디폴트) 파라미터를 나타낸다. ViewIdx가 i와 같은 텍스처 레이어 및 뎁스 레이어 둘 다가 존재하는 경우, 상기 파라미터는 상기 텍스처 레이어와 연관된다(associated).
이 경우, 현재 카메라 파라미터는 CpScale[i][j], CpOff[i][j], CpInvScalePlusScale[i][j], 및 CpInvOffPlusOff[i][j]로 나타내어질 수 있다.
CpScale[i][j], CpOff[i][j], CpInvScalePlusScale[i][j], 및 CpInvOffPlusOff[i][j]는 다음과 같이 적용될 수 있다.
- CpScale[i][j] = vps_cp_scale[i][j]
- CpOff[i][j] = vps_cp_off[i][j]
- CpInvScalePlusScale[i][j] = vps_cp_inv_scale_plus_scale[i][j]
- CpInvOffPlusOff[i][j] = CpInvOffPlusOff[i][j]
표 5
slice segment header() { | Descriptor |
… | |
if(nuh_layer_id > 0 && cp_in_slice_segment_header_flag[ViewIdx]) | |
cu_update_flag[ ViewIdx ] | u(1) |
if(cu_update_flag[ViewIdx]) | |
for(j=0;j < ViewIdx;j++){ | |
cp_scale[j] | se(v) |
cp_off[j] | se(v) |
cp_inv_scale_plus_scale[j] | se(v) |
cp_ inv _off_plus_off[j] | se(v) |
} | |
… | |
} | |
여기서, cu_update_flag는 카메라 파라미터가 업데이트되는지 여부를 나타내는 플래그 정보이다.
cu_update_flag[ViewIdx]의 값이 1인 경우, 신택스 요소들 cp_scale[j], cp_off[j], cp_inv_scale_plus_scale[j], 및 cp_inv_off_plus_off[j]가 슬라이스 세그먼트 헤더에 존재함을 나타낸다.
cu_update_flag[ViewIdx]의 값이 0인 경우, cp_scale[j], cp_off[j], cp_inv_scale_plus_scale[j], 및 cp_inv_off_plus_off[j]가 슬라이스 세그먼트 헤더에 존재하지 않고, 이전 슬라이스 세그먼트 헤더의 대응하는 신택스 요소들로부터 cp_scale[j], cp_off[j], cp_inv_scale_plus_scale[j], 및 cp_inv_off_plus_off[j]가 도출됨을 나타낸다.
cu_update_flag[ViewIdx]가 존재하지 않는 경우, cu_update_flag[ViewIdx]의 값은 0인 것으로 추론될(inferred) 수 있다. 엑세스 유닛 상 nuh_layer_id가 0인 픽처가 IRAP(intra random access point) 픽처인 경우, 슬라이스 세그먼트 헤더 내의 cu_update_flag[ViewIdx]의 값은 0과 같을 수 있다.
cp_scale[j], cp_off[j], cp_inv_scale_plus_scale[j], 및 cp_inv_off_plus_off[j]는 뎁스 값을 디스패리티 값으로 전환하기 위한 파라미터를 나타낸다. 여기서 ViewIdxA가 ViewIdxB와 같은 경우, ViewIdxA와 같은 ViewIdx를 갖는 슬라이스 세그먼트 헤더 내의 cp_scale[j], cp_off[j], cp_inv_scale_plus_scale[j], 및 cp_inv_off_plus_off[j]는 ViewIdxB와 같은 ViewIdx를 갖는 슬라이스 세그먼트 헤더 내의 cp_scale[j], cp_off[j], cp_inv_scale_plus_scale[j], 및 cp_inv_off_plus_off[j]와 같다.
cu_update_flag[ViewIdx]의 값이 1인 경우, CpScale[i][j], CpOff[i][j], CpInvScalePlusScale[i][j], 및 CpInvOffPlusOff[i][j]는 다음과 같이 업데이트될 수 있다.
- CpScale[ViewIdx][j] = cp_scale[j]
- CpOff[ViewIdx][j] = cp_off[j]
- CpInvScalePlusScale[ViewIdx][j] = cp_inv_scale_plus_scale[j]
- CpInvOffPlusOff[ViewIdx][j] = cp_inv_off_plus_off[j]
상기와 같이 현재 카메라 파라미터가 CpScale, CpOff, CpInvScalePlusScale, 및 CpInvOffPlusOff로 나타내어지는 경우, 상술한 수학식 2에서의, 상기 역방향 전환에서 상기 스케일 인자는 상기 CpScale을 기반으로 도출될 수 있고, 상기 오프셋은 상기 CpOff을 기반으로 도출될 수 있다. 또한, 상기 순방향 전환에서 상기 스케일 인자는 상기 CpInvScalePlusScale을 기반으로 도출될 수 있고, 상기 오프셋은 CpInvOffPlusOff을 기반으로 도출될 수 있다.
또 다른 실시예로, VPS를 통하여 디폴트 카메라 파라미터를 전송하고, 슬라이스 세그먼트 헤더를 통하여 카메라 파라미터가 업데이트되는지 여부 나타내는 플래그 정보를 전송하되, 카메라 파라미터가 업데이트되는 경우 디폴트 카메라 파라미터와의 차분값을 전송할 수 있다. 만일, 상기 플래그 정보가 0을 나타내면, 슬라이스 세그먼트 헤더에서는 카메라 파라미터가 포함되지 않으며, 디코딩 장치 내에 저장된 현재 시점의 카메라 파라미터를 사용한다. 즉, 카메라 파라미터가 한 번도 업데이트되지 않은 경우, 상기 디폴트 카메라 파라미터가 디코딩 장치에 저장될 것이다. 만약 카메라 파라미터가 업데이트되어 상기 플래그 정보가 1을 나타내는 경우, 디코딩 장치는 슬라이스 세그먼트 헤더에 포함된 카메라 파라미터 차분 값을 파싱하여 디폴트 카메라 파라미터에 더함으로써, 현재 시점에 대하여 공유되는 상기 카메라 파라미터를 업데이트한다. 이 때, 만일 현재 디코딩 하는 픽처가 랜덤 엑세스 포인트일 경우에는 무조건 상기 카메라 파라미터를 파싱할 수도 있다.
이 경우, 상기 VPS 및 상기 슬라이스 세그먼트 헤더는 예를 들어 각각 다음 표 6 및 7과 같이 나타내어질 수 있다.
표 6
vps extension2(){ | Descriptor |
… | |
cp_precision | ue(v) |
for(i=1;i < NumViews; i++){ | |
cp_present_flag[i] | u(1) |
if(cp_present_flag[i]){ | |
cp_in_slice_segment_header_flag[i] | u(1) |
for(j=0;j < i;j++){ | |
vps _cp_scale[i][j] | se(v) |
vps _cp_off[i][j] | se(v) |
vps_cp_inv_scale_plus_scale[i][j] | se(v) |
vps _cp_ inv _off_plus_off[i][j] | se(v) |
} | |
} | |
} | |
… | |
} | |
여기서, vps_cp_scale[i][j], vps_cp_off[i][j], vps_cp_inv_scale_plus_scale[i][j], 및 vps_cp_inv_off_plus_off[i][j]는 뎁스 값을 디스패리티 값으로 전환하기 위한 (디폴트) 파라미터를 나타낸다. ViewIdx가 i와 같은 텍스처 레이어 및 뎁스 레이어 둘 다가 존재하는 경우, 상기 파라미터는 상기 텍스처 레이어와 연관된다(associated).
이 경우, 현재 카메라 파라미터는 CpScale[i][j], CpOff[i][j], CpInvScalePlusScale[i][j], 및 CpInvOffPlusOff[i][j]로 나타내어질 수 있다.
CpScale[i][j], CpOff[i][j], CpInvScalePlusScale[i][j], 및 CpInvOffPlusOff[i][j]는 다음과 같이 적용될 수 있다.
- CpScale[i][j] = vps_cp_scale[i][j]
- CpOff[i][j] = vps_cp_off[i][j]
- CpInvScalePlusScale[i][j] = vps_cp_inv_scale_plus_scale[i][j]
- CpInvOffPlusOff[i][j] = vps_cp_inv_off_plus_off[i][j]
표 7
slice segment header() { | Descriptor |
… | |
if(nuh_layer_id > 0 && cp_in_slice_segment_header_flag[ViewIdx]) | |
cu_update_flag[ ViewIdx ] | u(1) |
if(cu_update_flag[ViewIdx]) | |
for(j=0;j < ViewIdx;j++){ | |
delta_cp_scale[j] | se(v) |
delta_cp_off[j] | se(v) |
delta_cp_inv_scale_plus_scale[j] | se(v) |
delta_cp_ inv _off_plus_off[j] | se(v) |
} | |
… | |
} | |
여기서, cu_update_flag는 카메라 파라미터가 업데이트되는지 여부를 나타내는 플래그 정보이다.
cu_update_flag[ViewIdx]의 값이 1인 경우, 신택스 요소들 delta_cp_scale[j], delta_cp_off[j], delta_cp_inv_scale_plus_scale[j], 및 delta_cp_inv_off_plus_off[j]가 슬라이스 세그먼트 헤더에 존재함을 나타낸다.
cu_update_flag[ViewIdx]의 값이 0인 경우, delta_cp_scale[j], delta_cp_off[j], delta_cp_inv_scale_plus_scale[j], 및 delta_cp_inv_off_plus_off[j]가 슬라이스 세그먼트 헤더에 존재하지 않고, 이전 슬라이스 세그먼트 헤더의 대응하는 신택스 요소들로부터 delta_cp_scale[j], delta_cp_off[j], delta_cp_inv_scale_plus_scale[j], 및 delta_cp_inv_off_plus_off[j]가 도출됨을 나타낸다.
cu_update_flag[ViewIdx]가 존재하지 않는 경우, cu_update_flag[ViewIdx]의 값은 0인 것으로 추론될(inferred) 수 있다. 엑세스 유닛 상 nuh_layer_id가 0인 픽처가 IRAP(intra random access point) 픽처인 경우, 슬라이스 세그먼트 헤더 내의 cu_update_flag[ViewIdx]의 값은 0과 같을 수 있다.
delta_cp_scale[j], delta_cp_off[j], delta_cp_inv_scale_plus_scale[j], 및 delta_cp_inv_off_plus_off[j]는 뎁스 값을 디스패리티 값으로 전환하기 위한 파라미터를 나타낸다. 여기서 ViewIdxA가 ViewIdxB와 같은 경우, ViewIdxA와 같은 ViewIdx를 갖는 슬라이스 세그먼트 헤더 내의 delta_cp_scale[j], delta_cp_off[j], delta_cp_inv_scale_plus_scale[j], 및 delta_cp_inv_off_plus_off[j]는 ViewIdxB와 같은 ViewIdx를 갖는 슬라이스 세그먼트 헤더 내의 delta_cp_scale[j], delta_cp_off[j], delta_cp_inv_scale_plus_scale[j], 및 delta_cp_inv_off_plus_off[j]와 같다.
cu_update_flag[ViewIdx]의 값이 1인 경우, CpScale[i][j], CpOff[i][j], CpInvScalePlusScale[i][j], 및 CpInvOffPlusOff[i][j]는 다음과 같이 업데이트될 수 있다.
- CpScale[ViewIdx][j] = vps_cp_scale[ViewIdx][j] + delta_cp_scale[j]
- CpOff[ViewIdx][j] = vps_cp_off[ViewIdx][j] + delta_cp_off[j]
- CpInvScalePlusScale[ViewIdx][j] = vps_cp_inv_scale_plus_scale [ViewIdx][j] + cp_inv_scale_plus_scale[j]
- CpInvOffPlusOff[ViewIdx][j] = CpInvOffPlusOff[i][j] + cp_inv_off_plus_off[j]
이 경우, 상술한 수학식 2에서의, 상기 역방향 전환에서 상기 스케일 인자는 상기 CpScale을 기반으로 도출될 수 있고, 상기 오프셋은 상기 CpOff을 기반으로 도출될 수 있다. 또한, 상기 순방향 전환에서 상기 스케일 인자는 상기 CpInvScalePlusScale을 기반으로 도출될 수 있고, 상기 오프셋은 CpInvOffPlusOff을 기반으로 도출될 수 있다.
또 다른 실시예로, 가장 최근에 전송된 카메라 파라미터를 예측자(predictor)로 하여, 현재 슬라이스에 대한 카메라 파라미터와의 차분값만을 전송하는 것이다. 이 때, 델타(delta) 값이 무한히 커지는 것을 방지하기 위하여, 델타의 절대값이 정해진 크기에 도달한 경우, 예측자가 되는 카메라 파라미터를 업데이트할 수 있다. 이 경우, 기본(또는 기준)이 되는 카메라 파라미터는 연산 부담 및 코딩 효율을 고려하여 SPS(sequence parameter set) 신택스, VPS(video parameter set) 신택스 또는 PPS(picture parameter set)을 통하여 전송될 수 있다.
이 경우, 기준이 되는 카메라 파라미터가 전송되는 신택스, 그리고 카메라 파라미터 차분값이 전송되는 슬라이스 세그먼트 헤더는 예를 들어 각각 다음 표 8 및 9와 같이 나타내어질 수 있다.
표 8
sequence_parameter_set_rbsp()(or video_parameter_set_rbsp(), picture_parameter_set_rbsp()){ | Descriptor |
… | |
for(i=1;i < NumViews; i++){ | |
cp_present_flag[i] | u(1) |
if(cp_present_flag[i]){ | |
for(j=0;j < i;j++){ | |
cp_scale[i][j] | se(v) |
cp_off[i][j] | se(v) |
cp_ inv _scale_plus_scale[i][j] | se(v) |
cp_ inv _off_plus_off[i][j] | se(v) |
} | |
} | |
} | |
… | |
} | |
여기서, cp_scale[i][j], cp_off[i][j], cp_inv_scale_plus_scale[i][j], 및 cp_inv_off_plus_off[i][j]는 뎁스 값을 디스패리티 값으로 전환하기 위한 (기본) 파라미터를 나타낸다. ViewIdx가 i와 같은 텍스처 레이어 및 뎁스 레이어 둘 다가 존재하는 경우, 상기 파라미터는 상기 텍스처 레이어와 연관된다(associated).
이 경우, 참조 카메라 파라미터는 RefCpScale[i][j], RefCpOff[i][j], RefCpInvScalePlusScale[i][j], 및 RefCpInvOffPlusOff[i][j]로 나타내어질 수 있다.
RefCpScale[i][j], RefCpOff[i][j], RefCpInvScalePlusScale[i][j], 및 RefCpInvOffPlusOff[i][j]는 다음과 같이 적용될 수 있다.
- RefCpScale[i][j] = cp_scale[i][j]
- RefCpOff[i][j] = cp_off[i][j]
- RefCpInvScalePlusScale[i][j] = cp_inv_scale_plus_scale[i][j]
- RefCpInvOffPlusOff[i][j] = cp_inv_off_plus_off[i][j]
표 9
slice segment header() { | Descriptor |
… | |
delta_cp_flag | u(1) |
if(nuh_layer_id > 0 && delta_cp_flag) | |
for(j=0;j < ViewIdx;j++){ | |
delta_cp_scale[j] | se(v) |
delta_cp_off[j] | se(v) |
delta_cp_inv_scale_plus_scale[j] | se(v) |
delta_cp_ inv _off_plus_off[j] | se(v) |
} | |
… | |
} | |
여기서, delta_cp_flag는 카메라 파라미터의 차분 값(또는 델타 값)이 존재하는지 여부를 나타내는 플래그 정보이다.
delta_cp_flag의 값이 1인 경우, 신택스 요소들 delta_cp_scale[j], delta_cp_off[j], delta_cp_inv_scale_plus_scale[j], 및 delta_cp_inv_off_plus_off[j]가 슬라이스 세그먼트 헤더에 존재함을 나타낸다. 즉, 기존(참조) 카메라 파라미터에 상기 스라이스 세그먼트 헤더에 존재하는 카메라 파라미터 차분값을 더하여 현재 카메라 파라미터가 도출되고, 상기 현재 카메라 파라미터가 현재 슬라이스에 대하여 사용됨을 나타낸다.
cu_update_flag[ViewIdx]의 값이 0인 경우, delta_cp_scale[j], delta_cp_off[j], delta_cp_inv_scale_plus_scale[j], 및 delta_cp_inv_off_plus_off[j]가 슬라이스 세그먼트 헤더에 존재하지 않는다. 즉, 이번 비트스트림에서 카메라 파라미터가 업데이트되지 않음을 나타낸다.
이 경우, 현재 슬라이스를 위한 현재 카메라 파라미터(전환 파라미터)는 CurrCpScale[i][j], CurrCpOff[i][j], CurrCpInvScalePlusScale[i][j], 및 CurrCpInvOffPlusOff[i][j]로 나타내어질 수 있다.
CurrCpScale[i][j], CurrCpOff[i][j], CurrCpInvScalePlusScale[i][j], 및 CurrCpInvOffPlusOff[i][j]는 다음과 같이 도출될 수 있다.
- CurrCpScale[i][j] = RefCpScale[i][j] + delta_cp_scale[j]
- CurrCpOff[i][j] = RefCpOff[i][j] + delta_cp_off[j]
- CurrCpInvScalePlusScale[i][j] = RefCpInvScalePlusScale[i][j] + cp_inv_scale_plus_scale[j]
- CurrCpInvOffPlusOff[i][j] = RefCpInvOffPlusOff[i][j] + cp_inv_off_plus_off[j]
상기와 같이 현재 카메라 파라미터가 CurrCpScale[i][j], CurrCpOff[i][j], CurrCpInvScalePlusScale[i][j], 및 CurrCpInvOffPlusOff[i][j]로 나타내어지는 경우, 상술한 수학식 2에서의, 상기 역방향 전환에서 상기 스케일 인자는 상기 CurrCpScale[i][j]을 기반으로 도출될 수 있고, 상기 오프셋은 상기 CurrCpOff[i][j]을 기반으로 도출될 수 있다. 또한, 상기 순방향 전환에서 상기 스케일 인자는 상기 CurrCpInvScalePlusScale[i][j]을 기반으로 도출될 수 있고, 상기 오프셋은 CurrCpInvOffPlusOff[i][j]을 기반으로 도출될 수 있다.
만약, delta_cp_scale[j], delta_cp_off[j], delta_cp_inv_scale_plus_scale[j], 또는 delta_cp_inv_off_plus_off[j]가 임계값에 도달한 경우, RefCpScale[i][j], RefCpOff[i][j], RefCpInvScalePlusScale[i][j], 또는 RefCpInvOffPlusOff[i][j] 다음과 같이 업데이트될 수 있다. 여기서 임계값은 명시적으로(explicitly) 시그널링될 수도 있고, 묵시적으로(implicitly) 알려질 수 있다.
- RefCpScale[i][j] = CurrCpScale[i][j]
- RefCpOff[i][j] = CurrCpOff[i][j]
- RefCpInvScalePlusScale[i][j] = CurrCpOff[i][j]
- RefCpInvOffPlusOff[i][j] = CurrCpInvOffPlusOff[i][j]
또 다른 실시예로, 디코딩 장치는 다수의 카메라 파라미터 세트 중에서 어느 하나의 카메라 파라미터 세트를 참조 대상 카메라 파라미터 세트로 판단할 수 있다. 예를 들어 하나의 카메라 파라미터 세트가 아닌 다수 개의 카메라 파라미터 세트를 인코더로부터 전송 받을 수 있다. 이 경우 현재 슬라이스 또는 픽처를 디코딩함에 있어, 상기 다수의 카메라 파라미터 세트 중에서 어느 하나의 카메라 파라미터 세트를 지시하는 인덱스(또는 ID) 정보를 수신하거나, 다른 정보를 기반으로 유추하여 상기 참조 대상이 되는 카메라 파라미터 세트를 판단할 수 있다. 상기 다수의 카메라 파라미터 세트는 다수의 슬라이스를 디코딩함에 있어서 참조될 수 있다.
도 5는 다수의 카메라 파라미터 세트에 대한 슬라이스별 참조 대상 카메라 파라미터 세트를 예시적으로 나타낸다.
도 5를 참조하면, 슬라이스 0 내지 슬라이스 2는 카메라 파라미터 세트 0번을 참조할 수 있고, 슬라이스 3은 카메라 파라미터 세트 1번을 참조할 수 있으며, 슬라이스 4 및 슬라이스 5는 카메라 파라미터 세트 2번을 참조할 수 있다.
디코딩 장치는 인코딩 장치로부터 카메라 파라미터 세트들을 전송받고, 이후 전송되는 인덱스 정보를 기반으로, 슬라이스에 대하여 다수의 카메라 파라미터 세트 리스트 중 어떤 카메라 파라미터 세트가 적용되는지를 판단할 수 있다.
카메라 파라미터 세트들은 예를 들어 PPS들를 통해서 전송될 수 있다. 일 예로, PPS는 다음 표 10과 같이 나타내어질 수 있다.
표 10
pps_3d_extension(){ | Descriptor |
… | |
for(i=1;i < NumViews; i++){ | |
cp_present_flag[i] | u(1) |
if(cp_present_flag[i]){ | |
for(j=0;j < i;j++){ | |
cp_scale[i][j] | se(v) |
cp_off[i][j] | se(v) |
cp_ inv _scale_plus_scale[i][j] | se(v) |
cp_ inv _off_plus_off[i][j] | se(v) |
} | |
} | |
} | |
… | |
} | |
인코딩 장치에서 디코딩 장치로 최대 64개의 다른 PPS가 전송될 수 있으며, 디코딩 장치는 슬라이스 세그먼트 헤더에 포함된 인덱스 정보(또는 PPS의 ID)를 기반으로 해당 슬라이스에 참조해야 할 카메라 파라미터 세트가 있는 PPS를 지정할 수 있으며, 이를 통하여 다수의 카메라 파라미터 중 적절한 카메라 파라미터를 찾아 디코딩에 활용할 수 있다.
이 경우, 상기 슬라이스 세그먼트 헤더는 예를 들어 다음 표 11과 같이 나타내어질 수 있다.
표 11
slice segment header() { | Descriptor |
first_slice_segment_in_ pic _flag | u(1) |
if(nal_unit_type >= BLA_W_LP && nal_unit_type <= RSV_IRAP_VCL23) | |
no_output_of_prior_pics_flag | u(1) |
slice_ pic _parameter_set_id | ue(v) |
if(!first_slice_segement_in_pic_flag){ | |
if(dependent_slice_segments_enabled_flag) | |
dependent_slice_segment_flag | u(1) |
slice_segment_address | u(v) |
} | |
… | |
} | |
여기서 slice_pic_parameter_set_id는 현재 슬라이스에 대하여 다수의 카메라 파라미터 세트 리스트 중 어떤 카메라 파라미터 세트가 적용되는지를 나타내는 인덱스 정보를 PPS의 ID의 형태로 나타낸다.
즉, slice_pic_parameter_set_id는 사용되는 PPS에 대한 pps_pic_parameter_set의 값을 나타내며, slice_pic_parameter_set_id의 값의 범위는 0 ~ 63(inclusive)일 수 있다.
이 경우, 참조 카메라 파라미터 세트는 RefCpScale[i][j], RefCpOff[i][j], RefCpInvScalePlusScale[i][j], 및 RefCpInvOffPlusOff[i][j]를 포함할 수 있다.
만약, nuh_layer_id가 0보다 크고, 슬라이스 세그먼트 헤더의 slice_pic_parameter_set_id에 의하여 PPS가 참조(또는 지시)되고, 상기 PPS에 포함된 cp_present_flag[i]가 1과 같은 경우, RefCpScale[i][j], RefCpOff[i][j], RefCpInvScalePlusScale[i][j], 및 RefCpInvOffPlusOff[i][j]는 다음과 같이 적용될 수 있다.
- RefCpScale[i][j] = cp_scale[i][j]
- RefCpOff[i][j] = cp_off[i][j]
- RefCpInvScalePlusScale[i][j] = cp_inv_scale_plus_scale[i][j]
- RefCpInvOffPlusOff[i][j] = cp_inv_off_plus_off[i][j]
또 다른 실시예로, 디코딩 장치는 다수의 카메라 파라미터 세트 중에서 어느 하나의 카메라 파라미터 세트를 기본 카메라 파라미터 세트로 선택된 수 있으며, 이 경우 정확한 전환을 위하여 상기 선택된 기본 카메라 파라미터 세트에 차분 값을 더하여 현재 슬라이스 또는 픽처에서 사용할 수 있다.
예를 들어, 디코딩 장치는 다수의 카메라 파라미터 세트들 중 하나의 기본 카메라 파라미터 세트를 선택하고, 상기 선택된 기본 카메라 파라미터 세트에 포함된 파라미터들에 델타 값을 더함으로써 현재 슬라이스에 대한 참조 카메라 파라미터를 얻을 수 있다.
일 예로, 카메라 파라미터 세트들은 PPS들을 통하여 전송될 수 있으며, 이 경우 PPS 및 슬라이스 세그먼트 헤더는 다음 표 12 및 표 13과 같이 나타내어질 수 있다.
표 12
pps_3d_extension(){ | Descriptor |
… | |
for(i=1;i < NumViews; i++){ | |
cp_present_flag[i] | u(1) |
if(cp_present_flag[i]){ | |
for(j=0;j < i;j++){ | |
cp_scale[i][j] | se(v) |
cp_off[i][j] | se(v) |
cp_ inv _scale_plus_scale[i][j] | se(v) |
cp_ inv _off_plus_off[i][j] | se(v) |
} | |
} | |
} | |
… | |
} | |
표 13
slice segment header() { | Descriptor |
first_slice_segment_in_ pic _flag | u(1) |
if(nal_unit_type >= BLA_W_LP && nal_unit_type <= RSV_IRAP_VCL23) | |
no_output_of_prior_pics_flag | u(1) |
slice_ pic _parameter_set_id | ue(v) |
if(!first_slice_segement_in_pic_flag){ | |
if(dependent_slice_segments_enabled_flag) | |
dependent_slice_segment_flag | u(1) |
slice_segment_address | u(v) |
} | |
… | |
delta_cp_flag | u(1) |
if(nuh_layer_id > 0 && delat_cp_flag | |
for(j=0;j < ViewIdx;j++){ | |
delta_cp_scale[j] | se(v) |
delta_cp_off[j] | se(v) |
delta_cp_inv_scale_plus_scale[j] | se(v) |
delta_cp_ inv _off_plus_off[j] | se(v) |
} | |
… | |
} | |
여기서 delta_cp_flag는 카메라 파라미터 세트의 차분 값(또는 델타 값)이 존재하는지 여부를 나타내는 플래그 정보이다.
delta_cp_flag의 값이 1인 경우, PPS(또는 VPS, SPS)를 통하여 전송된 카메라 파라미터 세트 내의 파라미터들에 차분 값들을 더하여 이 슬라이스를 위하여 사용됨을 나타낸다.
즉, delta_cp_flag의 값이 1인 경우, 상기 차분 값들을 나타내는 신택스 요소들 delta_cp_scale[j], delta_cp_off[j], delta_cp_inv_scale_plus_scale[j], 및 delta_cp_inv_off_plus_off[j]가 슬라이스 세그먼트 헤더에 존재한다.
delta_cp_flag의 값이 0인 경우, PPS(또는 VPS, SPS)를 통하여 전송된 카메라 파라미터 세트 내의 파라미터들이 업데이트되지 않고 이 슬라이스를 위하여 사용됨을 나타낸다.
delta_cp_scale[j], delta_cp_off[j], delta_cp_inv_scale_plus_scale[j], 및 delta_cp_inv_off_plus_off[j]는 뎁스 값을 디스패리티 값으로 전환하기 위한 파라미터들의 현재 슬라이스에 대한 차분 값들을 나타낸다.
이 경우, 현재 슬라이스를 위한 현재 카메라 파라미터(전환 파라미터)는 CurrCpScale[i][j], CurrCpOff[i][j], CurrCpInvScalePlusScale[i][j], 및 CurrCpInvOffPlusOff[i][j]로 나타내어질 수 있다.
CurrCpScale[i][j], CurrCpOff[i][j], CurrCpInvScalePlusScale[i][j], 및 CurrCpInvOffPlusOff[i][j]는 다음과 같이 도출될 수 있다.
- CurrCpScale[i][j] = RefCpScale[i][j] + delta_cp_scale[j]
- CurrCpOff[i][j] = RefCpOff[i][j] + delta_cp_off[j]
- CurrCpInvScalePlusScale[i][j] = RefCpInvScalePlusScale[i][j] + cp_inv_scale_plus_scale[j]
- CurrCpInvOffPlusOff[i][j] = RefCpInvOffPlusOff[i][j] + cp_inv_off_plus_off[j]
만약, delta_cp_scale[j], delta_cp_off[j], delta_cp_inv_scale_plus_scale[j], 또는 delta_cp_inv_off_plus_off[j]가 임계값에 도달한 경우, RefCpScale[i][j], RefCpOff[i][j], RefCpInvScalePlusScale[i][j], 또는 RefCpInvOffPlusOff[i][j] 다음과 같이 업데이트될 수 있다. 여기서 임계값은 명시적으로(explicitly) 시그널링될 수도 있고, 묵시적으로(implicitly) 알려질 수 있다.
- RefCpScale[i][j] = CurrCpScale[i][j]
- RefCpOff[i][j] = CurrCpOff[i][j]
- RefCpInvScalePlusScale[i][j] = CurrCpOff[i][j]
- RefCpInvOffPlusOff[i][j] = CurrCpInvOffPlusOff[i][j]
또 다른 실시예로, 카메라 파라미터 세트를 전송하기 위하여 별도의 신택스가 사용될 수 있다. 이 경우 상기 신택스는 카메라 파라미터 세트 신택스 또는 카메라 전환 파라미터 세트(camera conversion parameter set) 신택스로 불릴 수 있다. 이와 같이 카메라 파라미터 세트를 위한 신택스를 사용함으로써 카메라 파라미터 세트를 VPS, SPS 또는 PPS에 포함하여 전송하여 여러 번 보내서 발생할 수 있는 중복 정보 전송을 방지할 수 있다. 또한, 이 경우, 각 카메라 파라미터 세트에 인덱스 또는 ID를 부여함으로써 여러 개의 카메라 파라미터 세트가 수신되는 경우에도 원하는 카메라 세트가 지시될 수 있다.
일 예로, 카메라 전환 파라미터 세트 신택스는 다음 표 14와 같이 나타내어질 수 있다.
표 14
camera_conversion_parameter_set(){ | Descriptor |
camera_conversion_parameter_set_id | ue(v) |
for(i=1;i < NumViews; i++){ | |
cp_present_flag[i] | u(1) |
if(cp_present_flag[i]){ | |
for(j=0;j < i;j++){ | |
cp_scale[i][j] | se(v) |
cp_off[i][j] | se(v) |
cp_inv_scale_plus_scale[i][j] | se(v) |
cp_ inv _off_plus_off[i][j] | se(v) |
} | |
} | |
} | |
} | |
여기서, camera_conversion_parameter_set_id는 카메라 (전환) 파라미터 세트에 할당된 소정의 ID를 나타낸다.
이 경우, 상술한 실시예들에서 개시된 바와 같이 슬라이스 세그먼트 헤더를 통하여 특정 ID의 카메라 파라미터 세트가 지정될 수 있다. 또한, 지정된 카메라 파라미터 세트에 슬라이스 세그먼트 헤더를 통하여 전송된 델타 값(또는 차분 값)이 더해져 현재 슬라이스를 위한 최종(또는 참조 또는 현재) 카메라 파라미터 세트의 파라미터들 값들이 도출될 수 있다.
한편, 디코딩 장치의 메모리는 한정되어 있으며, 디코딩 자치가 다수의 카메라 파라미터 세트를 수신하는 경우 특정 조건에 따라 메모리 내의 일부 또는 전부의 카메라 파라미터 세트들을 삭제 및 정렬할 수 있다.
먼저, 메모리 내의 카메라 파라미터 세트들을 삭제하는 방법은 여러 가지가 있을 수 있다. 일 예로, 입력 순서를 기반으로 카메라 파라미터 세트가 삭제될 수 있다. 즉, 메모리가 부족한 경우 메모리에 가장 먼저 입력된 카메라 파라미터 세트가 먼저 제거될 수 있다. 다른 예로, 일정 횟수 또는 시간 동안의 카메라 파라미터 세트의 참조 횟수를 카운트 한 후, 가장 참조 횟수가 작은 카메라 파라미터 세트가 메모리에서 제거될 수도 있다. 또 다른 예로, 인코딩 장치가 삭제되어야 하는 카메라 파라미터 세트에 관한 정보를 디코딩 장치로 전송하고, 디코딩 장치는 해당 정보가 가리키는 카메라 파라미터 세트를 메모리에서 제거할 수 있다. 또 다른 예로, 카메라 파라미터 세트가 PPS, SPS, 또는 VPS 등의 상위 파라미터 세트들에 포함되어 전송되는 경우, 상기 상위 파라미터 세트들의 버퍼 관리(buffer management) 기법을 이용할 수도 있다.
또한, 효율적인 인덱싱을 위하여 카메라 파라미터 세트들은 정렬되어 사용될 수 있다. 일 예로, 카메라 파라미터 세트의 기준이 되는 파라미터 변수(예를 들어, 오프셋)의 오름차순 또는 내림차순으로 카메라 파라미터 세트들이 정렬될 수 있다. 다른 예로, 참조된 횟수의 내림차순 또는 오름차순으로 카메라 파라미터 세트들이 정렬될 수 있다. 또 다른 예로, 디코딩 장치가 인코딩 장치로부터 카메라 파라미터 세트들의 순서에 대한 정보를 수신하고, 해당 정보를 기반으로 카메라 파라미터 세트들을 정렬할 수 있다. 또 다른 예로, 카메라 파라미터 세트가 PPS, SPS, 또는 VPS 등의 상위 파라미터 세트들에 포함되어 전송되는 경우, 상기 카메라 파라미터 세트가 포함되는 해당 상위 파라미터 세트의 ID의 오름차순 또는 내림차순 순서대로 카메라 파라미터 세트들이 정렬될 수 있다.
도 6은 본 발명의 실시예에 따른 카메라 파라미터 인코딩 방법을 개략적으로 나타낸 순서도이다. 도 6의 방법은 상술한 도 2의 비디오 인코딩 장치에 의해 수행될 수 있다.
도 6을 참조하면, 인코딩 장치는 뎁스 값을 디스패리티 값으로 전환하기 위한 카메라 파라미터가 일정 구간의 슬라이스들 또는 픽처들 간 공유되는지 여부를 기반으로 상기 카메라 파라미터를 생성한다(S600). 일정 구간의 슬라이스들 또는 픽처들은 상기 카메라 파라미터를 공유할 수 있고 중복된 카메라 파라미터의 전송을 방지할 수 있다. 상기 카메라 파라미터는 상술한 바와 같이 전환 파라미터라고 불릴 수 있다.
인코딩 장치는 상기 카메라 파라미터를 인코딩하여 비트스트림을 생성하고 네트워크 또는 저장매체를 통하여 디코딩 장치로 전송할 수 있다(S610). 카메라 파라미터는 신택스 형태로 표현될 수 있다. 상기 카메라 파라미터는 예를 들어 상술한 표 1 내지 14에서 설명된 신택스들 중 하나 이상에 포함되어 전송될 수 있다.
도 7은 본 발명의 실시예에 따른 카메라 파라미터 디코딩 방법을 개략적으로 나타낸 순서도이다. 도 7의 방법은 상술한 도 3의 비디오 디코딩 장치에 의해 수행될 수 있다.
도 7을 참조하면, 뎁스 값을 디스패리티 값으로 전환하기 위한 카메라 파라미터를 수신 및 디코딩한다(S700). 디코딩 장치는 비트스트림을 수신하여 엔트로피 디코딩하고 상기 비디오 파라미터에 관한 정보를 획득할 수 있다. 상기 카메라 파라미터는 VPS 신택스, PPS 신택스, SPS 신택스, 슬라이스 세그먼트 헤드 신택스, 카메라 전환 파라미터 세트 신택스 중 적어도 하나에 포함되어 수신될 수 있다.
디코딩 장치는 이전 슬라이스 또는 픽처에 적용되는 상기 카메라 파라미터가 현재 슬라이스 또는 픽처에 적용되는지 여부를 판단한다(S710). 상기 카메라 파라미터는 비디오 전체에 공유될 수도 있으며, 비디오 전체에 공유되지 않는 경우에도 일정 조건에 따라 일정 구간의 슬라이스들 또는 픽처들을 위하여 공유될 수 있다.
일 예로, 상기 카메라 파라미터가 이전 슬라이스 또는 픽처를 위하여 사용된 경우 디코딩 장치는 상기 카메라 파라미터가 현재 픽처를 위하여 사용되는지 여부를 나타내는 플래그 정보를 신택스(a syntax)를 통하여 수신할 수 있다. 상기 플래그 정보가 1인 경우 상기 카메라 파라미터는 상기 현재 슬라이스 또는 현재 픽처를 위하여 적용(또는 공유)될 수 있다. 상기 플래그 정보가 0인 경우 상기 카메라 파라미터는 상기 현재 픽처를 위하여 적용되지 않고, 상기 신택스에 포함되어 수신된 새로운 카메라 파라미터가 상기 현재 슬라이스 또는 현재 픽처를 위하여 적용될 수 있다. 이 경우 상기 카메라 파라미터가 포함되는 신택스(제1 신택스)와, 상기 플래그 정보 및 상기 현재 슬라이스 또는 픽처를 위한 상기 새로운 카메라 파라미터가 포함되는 신택스(제2 신택스)는 서로 동일할 수도 있고, 서로 다를 수도 있다. 일 예로, 상기 제1 신택스는 VPS 신택스이고, 상기 제2 신택스는 슬라이스 세그먼트 헤더 신택스일 수 있다. 다른 예로, 상기 제1 신택스는 제1 PPS 신택스고, 상기 제2 신택스는 제2 PPS 신택스일 수 있다. 인코딩 장치에서 디코딩 장치로 약 64개의 다른 PPS가 전송될 수 있으며, 이 경우 상기 제1 PPS 신택스와 상기 제2 PPS 신택스는 서로 다른 ID를 가질 수 있다.
다른 예로, 현재 슬라이스 또는 현재 픽처를 위하여 상기 카메라 파라미터가 업데이트되는지 여부를 나타내는 플래그 정보를 신택스를 통하여 수신할 수 있다. 상기 플래그 정보가 0인 경우 상기 카메라 파라미터는 업데이트되지 않고, 상기 플래그 정보가 1인 경우, 상기 카메라 파라미터는 상기 제2 신택스에 포함되어 수신되는 파라미터 값을 기반으로 업데이트될 수 있다. 이 경우 상기 업데이트된 카메라 파라미터가 상기 현재 슬라이스 또는 픽처를 위하여 사용될 수 있다. 이 경우, 상기 파라미터 값은 상기 카메라 파라미터에 대한 차분 값일 수 있다.
또 다른 예로, 현재 슬라이스 또는 현재 픽처를 위하여 기존 카메라 파라미터에 대한 차분값이 존재하는지 여부를 나타내는 플래그 정보를 신택스를 통하여 수신할 수 있다. 상기 플래그 정보가 0인 경우 상기 카메라 파라미터는 상기 현재 슬라이스 또는 현재 픽처를 위하여 적용되고, 상기 플래그 정보가 1인 경우, 상기 카메라 파라미터 및 상기 신택스에 포함되어 수신되는 차분 값을 기반으로 도출된 새로운 카메라 파라미터가 상기 현재 슬라이스 또는 현재 픽처를 위하여 적용될 수 있다.
상기와 같은 방법을 통하여 디코딩 장치는 중복된 카메라 파라미터 수신을 방지하고, 뷰 내의 일정 구간의 픽처들(또는 슬라이스들)에 대하여 같은 카메라 파라미터를 공유할 수 있다.
한편, 상기 카메라 파라미터의 값은 cp_scale, cp_off, cp_inv_scale_plus_scale 및 cp_inv_off_plus_off 신택스 요소(syntax elements) 중 적어도 하나를 기반으로 도출될 수 있다.
상기 카메라 파라미터가 현재 슬라이스 또는 픽처에 적용되는 경우, 상기 카메라 파라미터를 기반으로 현재 블록의 디스패리티 값을 도출한다(S710). 디코딩 장치는 상술한 수학식 2를 기반으로 상기 디스패리티 값을 도출할 수 있다.
디코딩 장치는 상기 디스패리티 값을 기반으로 해당 블록(ex. 현재 블록)에 대한 인터 뷰(inter-view) 예측을 수행하여 해당 블록의 예측 샘플들을 생성할 수 있다. 디코딩 장치는 상기 예측을 기반으로 해당 블록 및 (현재) 픽처를 복원할 수 있다.
이상의 설명은 본 발명의 기술 사상을 예시적으로 설명한 것에 불과한 것으로서, 본 발명이 속하는 기술 분야에서 통상의 지식을 가진 자라면 본 발명의 본질적인 특성에서 벗어나지 않는 범위에서 다양한 수정 및 변형이 가능할 것이다. 따라서, 본 발명에 개시된 실시 예들은 본 발명의 기술 사상을 한정하기 위한 것이 아니라 설명하기 위한 것이고, 이러한 실시 예에 의하여 본 발명의 기술 사상의 범위가 한정되는 것은 아니다. 본 발명의 보호 범위는 아래의 청구범위에 의하여 해석되어야 할 것이다.
본 발명에서 실시예들이 소프트웨어로 구현될 때, 상술한 방법은 상술한 기능을 수행하는 모듈(과정, 기능 등)로 구현될 수 있다. 모듈은 메모리에 저장되고, 프로세서에 의해 실행될 수 있다. 메모리는 프로세서 내부 또는 외부에 있을 수 있고, 잘 알려진 다양한 수단으로 프로세서와 연결될 수 있다.