Android - StageFright 의 OpenMAX 실현

http://disanji.net/2011/03/07/stagefright-openmax0realization/
 
OMX Codec 은 데이터 의 parse 와 decode 를 완성 하 는 MediaSource 입 니 다.한편, OMX Codec 은 주로 IOMX 를 통 해 OpenBinder 체 제 를 뛰 어 넘 는 OMX 를 통 해 이 루어 진다.
OMX 를 중점적으로 소개 하 겠 습 니 다.OMX 는 주로 세 가지 작업 을 수행 합 니 다. NodeInstance 목록 의 관 리 는 NodeInstance 의 조작 과 사건 에 대한 처리 입 니 다.
1. NodeInstance 목록 의 관리.
이것 은 주로 NodeInstance 의 생 성 (allocateNode) 과 삭제 (freeNode) 를 포함한다.mDispatchers 와 mNodeIDToInstance 를 추가 하고 삭제 하 는 것 이다.mNodeIDToInstance 는 키 가 node 입 니 다.id, value 는 NodeInstance 의 이름 값 쌍 목록 입 니 다.그리고 mDispatchers 는 key 가 node 입 니 다.id, value 는 OMX:: CallbackDispatcher 의 이름 값 쌍 목록 입 니 다.그리고 NodeInstance 는 모두 OMX:: CallbackDispatcher 를 가지 고 있 습 니 다.
2. NodeInstance 노드 의 조작.
주요 구성원 함 수 는 다음 과 같다.
sendCommand
getParameter
setParameter
… …
fillBuffer
emptyBuffer
getExtensionIndex
이 방법 들 이 실 행 될 때 는 findInstance 를 통 해 mNodeIDToInstance 목록 에서 해당 하 는 NodeInstance 를 찾 은 다음 NodeInstance 에 대응 하 는 방법 을 호출 합 니 다.
3. 사건 처리
먼저 OMXNodeInstance. cpp 의 이러한 코드 를 보 세 요.
1
2
3
4
5
OMX_CALLBACKTYPE OMXNodeInstance::kCallbacks = {
 
    &OnEvent, &OnEmptyBufferDone, &OnFillBufferDone
 
};

그것 은 세 개의 OMXNodeInstance 류 의 정적 방법 을 kCallbacks 에 등록 했다.kCallbacks 는 어디서 사용 하나 요?OMX. cpp 의 allocateNode 방법 중의 코드 를 보십시오.
1
2
3
4
5
OMX_ERRORTYPE err = mMaster->makeComponentInstance(
 
            name, &OMXNodeInstance::kCallbacks,
 
            instance, &handle);

이벤트 처리 함수 가 구성 요소 Component Instance 에 전 달 됩 니 다.구성 요소 에 이벤트 가 발생 하면 OMXNodeInstance 에 등 록 된 이벤트 처리 함수 몇 개 를 호출 합 니 다. 이 함수 들 은 OMX 에 대응 하 는 함수, 즉 아래 세 개 를 호출 합 니 다.
OnEvent、OnEmptyBufferDone、OnFillBufferDone。
이 몇 가지 방법 은 모두 같은 방법 을 채택 한다. node 에 의 하면id. CallbackDispatcher 를 찾 아 이벤트 정 보 를 post 로 보 냅 니 다.구체 적 으로 는 findDispatcher (node) - > post (msg) 를 호출 하 는 것 입 니 다.
Callback Dispatcher 의 실현 체 제 를 제시 해 야 합 니 다.그것 내부 에 스 레 드 가 열 려 신 호 량 체 제 를 사용 했다.OMX:: CallbackDispatcher 의 속성 을 볼 수 있 습 니 다: Condition mqueChanged;
find Dispatcher (node) - > post (msg) 는 비동기 작업 으로 msg 를 POST 에 만 보 내 고 이벤트 처리 가 끝나 면 돌아 오지 않 습 니 다.그렇다면 CallbackDispatcher 는 받 은 msg 를 어떻게 처리 합 니까?다음 코드 보기:
1
2
3
4
5
6
7
8
OMX::CallbackDispatcher::threadEntry()
 
          dispatch(msg);
 
 
     mOwner->onMessage(msg);
 
mObserver->onMessage(msg);

이 mObserver 어디서 났 어 요?OMXCodec:: Create 에서 IOMX 를 초기 화 할 때 들 어 옵 니 다.
1
2
3
4
5
sp<OMXCodecObserver> observer = new OMXCodecObserver;
 
... ...
 
omx->allocateNode(componentName, observer, &node);

이렇게 계산 해 보 니 사건 은 결국 OpenBinder 를 넘 어 OMX Codec 에 전달 되 어 OMX CodecObserver 에 맡 겼 다.
노드 조작
NodeInstance 의 대부분 방법의 실현, 예 를 들 어 sendcand 등 은 모두 OMX 를 통 해 이 루어 집 니 다.Core. h 의 매크로 정의 간접 호출 OMXComponent. h 의 OMXCOMPONENTTYPE 라 는 struct 에 해당 하 는 함수 지침 을 완성 합 니 다.여기 서 언급 된 OMXCore. h 와 OMXComponent. h 는 모두 OpenMAX 표준 헤더 파일 입 니 다.원본 링크:http://blog.csdn.net/a345017062/archive/2011/02/17/6190905.aspx

좋은 웹페이지 즐겨찾기