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> &notify);
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