티스토리 툴바


민호/DTV2010/12/16 12:01
1. PCR (Program Clock Reference)
    TS stream에서 프로그램에 대한 상대적인 시간 기준값을 나타내고 식 (1)과 같이 계산 할 수 있다.

         PCR_base(i) = ( ( system_clock_frequency x t(i) ) DIV300 ) % 2^33
         PCR_ext(i) = ( ( system_clock_frequency x t(i) ) DIV1 ) % 300                                                                        식 (1)
         PCR(i) = PCR_base(i) x 300 + PCR_ext(i)

         여기서 i는 i번째 byte를 의미하고 t(i)는 i번째 byte가 T-STD에 입력되는 시간을 나타낸다.
         system_clock_frequency는 27Mhz이고 

                       27Mhz - 810hz ≤ system_clock_frequency ≤ 27Mhz + 810hz
                       system_clock_frequency의 시간변화율 ≤ 75 x 10^-3hz/sec

         이라는 제한을 갖는다.

식 (1)에서 알 수 있듯이 PCR_base는 90Khz 단위로 33bit로 표현되고 PCR_ext는 27Mhz단위로 9bit로 표현된다. 이런 이유로 TS header의 adaptation field나 
PES header에 시간 정보는 42 (33 + 9)bit를 이용하여 표현하도록 되어 있다. 
    PCR값은 인코더의 system clock으로부터 만들어지게 된다. i번째 byte가 인코더로부터 생성되어 TS stream으로 만들어지는 과정에서 i번째 byte가 만들어진 
시점의 PCR 값이 생성되는 것이다. 디코더에서는 이 PCR 값을 수신하여 현재 디코딩 하려는 프로그램의 기준 시간값으로 설정하고 뒤에서 설명할 DTS, PTS 시간을
이 PCR값과 비교하여 디코딩을 하고 재생을 하게 된다.


2. DTS (Decoding time Stamp)
    DTS는 STD에서 ES가 디코딩 되어야 하는 시점을 나타내는 값으로 system_clock_frequency의 1/300 (90Khz)단위로 표현이 된다. 식 (2)는 DTS를 계산하는 방법을
보여준다.

         DTS(j) = ( ( system_clock_frequency x tdn(j) ) DIV300 ) % 2^33                                                                    식 (2)

         여기서 tdn(j)는 n번째 ES의 j번째 access unit이 디코딩 되어야 할 시간을 나타낸다.
         
예를 들어 앞서 설명한 PCR값이 10000이고 DTS(j)값이 20000이라면 디코더는 PCR이 20000이 될때까지 10000만큼 디코딩을 delay 시켜야 한다. 즉 디코더는 j번째 byte를 
수신한 뒤 10000 x 300 / system_clock_frequency (약 111 μsec)만큼의 절대 시간을 기다리고 나서야 디코딩을 할 수 있다는 것이다. 여기서 또 생각해야 하는 부분은 delay가
발생함으로서 생기는 stream buffering 문제이다. 만약 1Mbps의 전송속도를 갖는 환경에서 앞의 예를 이어서 설명을 한다면 111 μsec동안 약 

         111000 (1Mbit x 111 μsec) bit를 더 수신하게 된다.

이정도의 스트림을 디코더에서 저장, 관리 할 수 있어야 한다는 얘기가 된다. Delay가 길어지면 길어질 수록 관리해야 하는 buffer의 크기는 커질 수밖에 없다. 그리고 DTS를
계산하는 식은 정확히 떨어지는 연산이 아니기 때문에 어느 정도의 오차 (300 / system_clock_frequency)도 고려를 해야한다. 이 부분이 잘못 구현되면 buffer의 overflow나 
underflow가 발생하여 시스템을 불안정하게 만들 수도 있다.


3. PTS (Presentation Time Stamp)
    PTS는 디코딩 된 access unit이 재생되어져야 하는 시점을 나타내는 값으로 식 (3)과 같이 계산된다.

          PTS(j) = ( ( system_clock_frequency x tpn(j) ) DIV300 ) %2^33                                                                     식 (3)

    PTS도 DTS와 마찬가지로 PCR을 reference로 사용하여 PTS(j) 시간에 재생을 하게 된다. B_picture가 포함되어 있는 비디오의 경우 I_picture와 P_picture는 디코딩 되야 하는
시각과 재생되어져야 하는 시각이 다르기 때문에 PTS와 DTS 정보 모두를 전송하게 되고 B_picture의 경우는 디코딩과 동시에 재생이 되어야 하기 때문에 PTS와 DTS값이 동일하다.
이 경우에는 DTS정보는 생략하고 PTS값을 전송하고 이 값을 DTS값으로 같이 사용하여 디코딩 시점을 결정하게 된다.

    PTS와 DTS는 모두 최대 0.7sec 이내 (PCR은 0.1sec) 에 적어도 한번씩은 정보를 보내도록 되어 있기 때문에 모든 picture에 들어가지는 않을 수도 있다. 시간 정보가 없는 
경우는 디코더에서 자체적으로 시간을 interpolation하여 사용하게 된다.
저작자 표시 비영리 변경 금지


Posted by 웃음보따리