XENIX(제닉스)

동영상의 재생과정 및 코덱간의 충돌(경쟁)

ETC 2010.03.26 댓글 XENIX

목차


    동영상파일은 압축하지 않은 상태로는 그 파일사이즈가 상상할 수 없을 만큼 거대해서 코덱을 이용하여 이를 압축한다고 이미 배웠다. 그렇다면 이렇게 코덱으로 압축된 동영상이 어떠한 과정을 거쳐서 재생되는지 그 재생과정을 들여다보고 그 과정에서 코덱(디코더)의 역할에 대해서 알아보자.

    먼저 테스트에 사용될 비디오파일의 정보를 먼저 살펴보도록하자.

    이 동영상파일은 비디오코덱을 XVID를 사용하였고 오디오코덱으론 MP3 코덱이 사용되어져있다는 것을 볼 수 있다. 그렇다면 윈도우미디어플레이어로 이 동영상을 재생하게 된다면 어떤 과정을 거치게 되는지 GraphStudio라는 프로그램을 이용하여 필터 그래프로 확인해보자.

    1. 소스필터 - 동영상 파일을 열어주는 역할을 한다.
    2. 스플리터 - 동영상에 있는 비디오스트림과 오디오스트림을 구분하는 역할을 한다.
    3. 디코더 - 인코더로 압축되었던 비디오/오디오스트림들이 이 디코더를 거치면서 압축이 해제된것과 같은 상태가 된다
    4. 랜더러 - 우리가 보고(비디오) 들을 수(오디오) 있는 형태로 해석한다.

    간단히 요약하자면 동영상을 불러와서(소스필터) 오디오와 비디오로 구분한 다음 (스플리터) 각각의 데이타의 압축을 푼다음 (디코더) 이를 보여주고 들려준다 (렌더러) 라고 단순화 할 수 있다.

    그런데 그림을 보면 한가지 이상한 점을 볼수 있을것이다. 첫번째 그림에서 코덱을 확인해보니 XviD 코덱이었고 코덱이 시스템에 설치되었다는 메세지가 분명히 있는데 두번째 그림의 필터그래프에서는 스플리터로 분리된 비디오를 FFDSHOW Video Decoder가 받아서 디코딩하는것을 볼 수 있다. 왜 XviD Decoder로 디코딩을 하지 않고 FFDSHOW가 디코딩을 하는것일까?

     


    사실 이 질문 자체는 그렇게 큰 의미는 없다. XviD 미디어타잎을 ffdshow의 디코더를 이용하여 디코딩한다고해서 그게 크게 잘못된 일은 아니기 때문이다. 하지만 지금 촛점을 맞추고 있는 부분은 하나의 미디어타잎에 여러 필터들이 경쟁했을때 어떠한 과정을 통해 필터가 선택되는지 그리고 선택된 필터들이 과연 최고의 선택이라 말할 수 있는지... 여기에 집중하였으면 한다.


    이 문제에 접근하기에 앞서서 시스템에 설치되는 코덱에 대해서 살펴볼 필요가 있다. 코덱은  OS가 설치되면서 기본적으로 설치되는 경우 그리고 사용자가 직접설치하는 경우, 통합코덱팩을 설치하는 경우  또한 여러가지 멀티미디어 관련 소프트웨어를 설치하는 과정에 동반하여 설치되는 경우등이 있다. 예를들어 윈도우 미디어 플레이어나 곰플레이어, 무비메이커, 포토스토리, 프리미어, 베가스등등의 예를들 수 있다.

    위의 그림은 InstalledCodec이라는 무료프로그램으로 시스템에 설치되어 있는 코덱 및 DirectShow Filter를 살펴본 그림이다. 이렇게 내 컴퓨터에는 알게모르게 무수히 많은 코덱들이 설치되고 또 삭제되어지곤 한다. 코덱이나 필터가 시스템에 많이 깔려있다고 해서 무조건 시스템에 악영향을 주는건 아니다. 하지만 하나의 미디어타잎과 연결되어지는 필터이 다수 존재할 때 흔히 말하는 코덱충돌현상을 빚을 위험성이 높다고 할 수 있다.

    위의 그림은 하나의 미디어타잎에 연결될 수 있는 각종 필터들을 GSpot으로 살펴본 그림이다. 여기서도 볼 수 있듯이 XviD라는 미디어를 Input으로 받는 필터중에 ffdshow video decoder 그리고 XviD MPEG-4 Video Decoder가 Actual Match List에 올라온 것을 볼 수 있다. 그렇다면 이제 본래의 의문점이었던 왜 XviD 디코더가 나서지 않고 FFDSHOW 디코더가 등장하는 것인지에 대해서 알아보도록 하자.

    일단 장난삼아 FFDSHOW Video Decoder의 기능을 InstalledCodec이라는 프로그램을 이용하여 Disable 시켜보고 필터그래프 모양이 어떻게 되는지 한번 살펴보자. 아래의 그림은  ffdshow video decoder의 기능이 동작하고 있는 상태이고


    아래의 그림은 ffdshow video decoder의 기능을 중지시킨 경우의 Filter Graph 모양이다.

    당연히 미디어타입과 연결된 필터중 ffdshow video filter가 없으므로 XviD Decoder로 연결되어지는건 어찌보면 당연하다 할 수 있다. 그렇다면  ffdshow가 있었을때는 무엇을 기준으로 ffdshow video decoder를 디코더 필터로 선택하였는지 그것이 궁금할 수 밖에 없다. 그 기준이 바로 Filter Merit 이다. 아래 보는 바와같이 필터들은 필수적으로 Filter Merit 이라는 값을 가지게 된다. 이는 필터그래프 매니저가 미디어를 디코딩하기 위해 적절한 필터를 찾게되는데 해당 미디어타입을 지원하는 필터중에서 이 Filter Merit 이 높은순서에서부터 낮은순서로 연결을 시도하게 된다. 시도하는 도중 매치가 되면 그걸로 낙찰이 되는것이다.



    이러한 Filter Merit 은 다이렉트쇼 형태로 배포되어지는 코덱을 개발자들이 만들면서 이 값이 입력되어진다. 물론 Filmerit, GSpot DirectShow Filter Manager와 같은 유틸리티를 이용해서 개별적으로 사용자가 Filter Merit 값을 변동할 수도 있지만 세심한 주의가 필요하다.

    이러한 필터들은 현재도 수없이 많고 앞으로도 계속해서 쏟아져 나올것이다. 동일한 미디어타입을 지원하는 필터들의 Merit이 동일할 경우 MS에서는 부가적인 기준을 토대로 지능적으로 연결한다고 하는데 사실 그게 어떠한 기준인지는 찾을 수가 없었다.

    이러한 상황에서 생각해볼 수 있는 것이 흔히 말하는 코덱충돌인것이다. 사실 엄밀히 말하면 코덱간의 경쟁으로 해석하는게 올바른 의미라고 개인적으로 생각한다.

    동영상을 재생하는 과정이 매끄럽지 못할 경우 코덱충돌을 의심한다는 말을 자주 하는데 이 코덱충돌이 성격이 비슷한 두 코덱이 서로 박터지게 싸우다가 결국은 동영상을 재생할 수 없는 지경에 이르렀다든가, 너도 나도 디코딩에 참가해서 요상하게 된다라던가 하는 그런식의 답변을 코덱충돌쯤으로 해석하는 경우를 더러 보았는데 참으로 스펙타클한 해석이라 하지 않을 수 없다.

    코덱충돌, 코덱경쟁의 의미는 해당 미디어를 재생하는 과정에서 최적의 디코딩필터와 연결되어지지 않는 상황이라고 간략하게 말할 수 있다.
    같은 미디어타입을 지원하더라도 제조사마다 자사의 어플리케이션에 최적화된 필터를 제공하다보니 해당 미디어에 대한 최적의 필터그래프가 만들어지지 않을 경우 동영상의 재생과정에서 간혹 왜곡현상이 발생하기도 한다.

    물론 곰플레이어나 KMPlayer의 경우 프로그램 자체적으로 코덱들을 내장하고 있어서 이 기능을 이용할 경우 재생에 관한한 문제가 발생하는 경우는 그리 많지 않다.

    지금까지 좀 길긴했지만 나름대로 공부해본 내용들을 느낀대로 적어보았다. 관련지식이 부족하다보니 여기저기서 정보를 찾느라 시간이 지체되었지만 지금은 마무리 할 때라 생각되어 서둘러 마무리한다. 혹 부족하고 어긋난 설명이 있다고 한다면 리플부탁드리며 참고한 문서를 아래에 정리하며 마무리짓도록 한다. thx.

    댓글