17137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang/* 27137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang * Copyright 2014 The Android Open Source Project 37137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang * 47137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang * Licensed under the Apache License, Version 2.0 (the "License"); 57137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang * you may not use this file except in compliance with the License. 67137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang * You may obtain a copy of the License at 77137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang * 87137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang * http://www.apache.org/licenses/LICENSE-2.0 97137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang * 107137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang * Unless required by applicable law or agreed to in writing, software 117137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang * distributed under the License is distributed on an "AS IS" BASIS, 127137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 137137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang * See the License for the specific language governing permissions and 147137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang * limitations under the License. 157137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang */ 167137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang 177137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang#ifndef NUPLAYER_CCDECODER_H_ 187137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang 197137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang#define NUPLAYER_CCDECODER_H_ 207137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang 217137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang#include "NuPlayer.h" 227137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang 237137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhangnamespace android { 247137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang 257137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhangstruct NuPlayer::CCDecoder : public RefBase { 267137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang enum { 277137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang kWhatClosedCaptionData, 287137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang kWhatTrackAdded, 297137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang }; 307137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang 313694d7cf40d1645bf05246cf38595eed606bb650Jaesung Chung enum { 323694d7cf40d1645bf05246cf38595eed606bb650Jaesung Chung kTrackTypeCEA608, 333694d7cf40d1645bf05246cf38595eed606bb650Jaesung Chung kTrackTypeCEA708, 343694d7cf40d1645bf05246cf38595eed606bb650Jaesung Chung }; 353694d7cf40d1645bf05246cf38595eed606bb650Jaesung Chung 36e964d4e421e2d1ca937227a580c0c837091a11e3Chih-Hung Hsieh explicit CCDecoder(const sp<AMessage> ¬ify); 377137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang 387137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang size_t getTrackCount() const; 397137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang sp<AMessage> getTrackInfo(size_t index) const; 407137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang status_t selectTrack(size_t index, bool select); 417137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang bool isSelected() const; 427137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang void decode(const sp<ABuffer> &accessUnit); 437137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang void display(int64_t timeUs); 447137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang void flush(); 457137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang 467137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhangprivate: 473694d7cf40d1645bf05246cf38595eed606bb650Jaesung Chung // CC track identifier. 483694d7cf40d1645bf05246cf38595eed606bb650Jaesung Chung struct CCTrack { 493694d7cf40d1645bf05246cf38595eed606bb650Jaesung Chung CCTrack() : mTrackType(0), mTrackChannel(0) { } 503694d7cf40d1645bf05246cf38595eed606bb650Jaesung Chung 513694d7cf40d1645bf05246cf38595eed606bb650Jaesung Chung CCTrack(const int32_t trackType, const size_t trackChannel) 523694d7cf40d1645bf05246cf38595eed606bb650Jaesung Chung : mTrackType(trackType), mTrackChannel(trackChannel) { } 533694d7cf40d1645bf05246cf38595eed606bb650Jaesung Chung 543694d7cf40d1645bf05246cf38595eed606bb650Jaesung Chung int32_t mTrackType; 553694d7cf40d1645bf05246cf38595eed606bb650Jaesung Chung size_t mTrackChannel; 563694d7cf40d1645bf05246cf38595eed606bb650Jaesung Chung 573694d7cf40d1645bf05246cf38595eed606bb650Jaesung Chung // The ordering of CCTracks is to build a map of track to index. 583694d7cf40d1645bf05246cf38595eed606bb650Jaesung Chung // It is necessary to find the index of the matched CCTrack when CC data comes. 593694d7cf40d1645bf05246cf38595eed606bb650Jaesung Chung int compare(const NuPlayer::CCDecoder::CCTrack& rhs) const; 603694d7cf40d1645bf05246cf38595eed606bb650Jaesung Chung inline bool operator<(const NuPlayer::CCDecoder::CCTrack& rhs) const; 613694d7cf40d1645bf05246cf38595eed606bb650Jaesung Chung inline bool operator==(const NuPlayer::CCDecoder::CCTrack& rhs) const; 623694d7cf40d1645bf05246cf38595eed606bb650Jaesung Chung inline bool operator!=(const NuPlayer::CCDecoder::CCTrack& rhs) const; 633694d7cf40d1645bf05246cf38595eed606bb650Jaesung Chung }; 643694d7cf40d1645bf05246cf38595eed606bb650Jaesung Chung 657137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang sp<AMessage> mNotify; 667137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang KeyedVector<int64_t, sp<ABuffer> > mCCMap; 673694d7cf40d1645bf05246cf38595eed606bb650Jaesung Chung ssize_t mSelectedTrack; 683694d7cf40d1645bf05246cf38595eed606bb650Jaesung Chung KeyedVector<CCTrack, size_t> mTrackIndices; 693694d7cf40d1645bf05246cf38595eed606bb650Jaesung Chung Vector<CCTrack> mTracks; 703694d7cf40d1645bf05246cf38595eed606bb650Jaesung Chung 713694d7cf40d1645bf05246cf38595eed606bb650Jaesung Chung // CEA-608 closed caption 723694d7cf40d1645bf05246cf38595eed606bb650Jaesung Chung size_t mLine21Channels[2]; // The current channels of NTSC_CC_FIELD_{1, 2} 733694d7cf40d1645bf05246cf38595eed606bb650Jaesung Chung 743694d7cf40d1645bf05246cf38595eed606bb650Jaesung Chung // CEA-708 closed caption 753694d7cf40d1645bf05246cf38595eed606bb650Jaesung Chung sp<ABuffer> mDTVCCPacket; 767137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang 777137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang bool isTrackValid(size_t index) const; 783694d7cf40d1645bf05246cf38595eed606bb650Jaesung Chung size_t getTrackIndex(int32_t trackType, size_t channel, bool *trackAdded); 793694d7cf40d1645bf05246cf38595eed606bb650Jaesung Chung 803694d7cf40d1645bf05246cf38595eed606bb650Jaesung Chung // Extract from H.264 SEIs 817137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang bool extractFromSEI(const sp<ABuffer> &accessUnit); 823694d7cf40d1645bf05246cf38595eed606bb650Jaesung Chung bool parseSEINalUnit(int64_t timeUs, const uint8_t *data, size_t size); 833694d7cf40d1645bf05246cf38595eed606bb650Jaesung Chung 843694d7cf40d1645bf05246cf38595eed606bb650Jaesung Chung // Extract from MPEG user data 853694d7cf40d1645bf05246cf38595eed606bb650Jaesung Chung bool extractFromMPEGUserData(const sp<ABuffer> &accessUnit); 863694d7cf40d1645bf05246cf38595eed606bb650Jaesung Chung bool parseMPEGUserDataUnit(int64_t timeUs, const uint8_t *data, size_t size); 873694d7cf40d1645bf05246cf38595eed606bb650Jaesung Chung 883694d7cf40d1645bf05246cf38595eed606bb650Jaesung Chung // Extract CC tracks from MPEG_cc_data 893694d7cf40d1645bf05246cf38595eed606bb650Jaesung Chung bool parseMPEGCCData(int64_t timeUs, const uint8_t *data, size_t size); 903694d7cf40d1645bf05246cf38595eed606bb650Jaesung Chung bool parseDTVCCPacket(int64_t timeUs, const uint8_t *data, size_t size); 917137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang 927137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang DISALLOW_EVIL_CONSTRUCTORS(CCDecoder); 937137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang}; 947137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang 957137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang} // namespace android 967137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang 977137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang#endif // NUPLAYER_CCDECODER_H_ 98