1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798 |
- /*
- * Copyright 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
- #ifndef NUPLAYER2_CCDECODER_H_
- #define NUPLAYER2_CCDECODER_H_
- #include "NuPlayer2.h"
- namespace android {
- struct NuPlayer2::CCDecoder : public RefBase {
- enum {
- kWhatClosedCaptionData,
- kWhatTrackAdded,
- };
- enum {
- kTrackTypeCEA608,
- kTrackTypeCEA708,
- };
- explicit CCDecoder(const sp<AMessage> ¬ify);
- size_t getTrackCount() const;
- sp<AMessage> getTrackInfo(size_t index) const;
- status_t selectTrack(size_t index, bool select);
- ssize_t getSelectedTrack(media_track_type type) const;
- bool isSelected() const;
- void decode(const sp<ABuffer> &accessUnit);
- void display(int64_t timeUs);
- void flush();
- private:
- // CC track identifier.
- struct CCTrack {
- CCTrack() : mTrackType(0), mTrackChannel(0) { }
- CCTrack(const int32_t trackType, const size_t trackChannel)
- : mTrackType(trackType), mTrackChannel(trackChannel) { }
- int32_t mTrackType;
- size_t mTrackChannel;
- // The ordering of CCTracks is to build a map of track to index.
- // It is necessary to find the index of the matched CCTrack when CC data comes.
- int compare(const NuPlayer2::CCDecoder::CCTrack& rhs) const;
- inline bool operator<(const NuPlayer2::CCDecoder::CCTrack& rhs) const;
- inline bool operator==(const NuPlayer2::CCDecoder::CCTrack& rhs) const;
- inline bool operator!=(const NuPlayer2::CCDecoder::CCTrack& rhs) const;
- };
- sp<AMessage> mNotify;
- KeyedVector<int64_t, sp<ABuffer> > mCCMap;
- ssize_t mSelectedTrack;
- KeyedVector<CCTrack, size_t> mTrackIndices;
- Vector<CCTrack> mTracks;
- // CEA-608 closed caption
- size_t mLine21Channels[2]; // The current channels of NTSC_CC_FIELD_{1, 2}
- // CEA-708 closed caption
- sp<ABuffer> mDTVCCPacket;
- bool isTrackValid(size_t index) const;
- size_t getTrackIndex(int32_t trackType, size_t channel, bool *trackAdded);
- // Extract from H.264 SEIs
- bool extractFromSEI(const sp<ABuffer> &accessUnit);
- bool parseSEINalUnit(int64_t timeUs, const uint8_t *data, size_t size);
- // Extract from MPEG user data
- bool extractFromMPEGUserData(const sp<ABuffer> &accessUnit);
- bool parseMPEGUserDataUnit(int64_t timeUs, const uint8_t *data, size_t size);
- // Extract CC tracks from MPEG_cc_data
- bool parseMPEGCCData(int64_t timeUs, const uint8_t *data, size_t size);
- bool parseDTVCCPacket(int64_t timeUs, const uint8_t *data, size_t size);
- DISALLOW_EVIL_CONSTRUCTORS(CCDecoder);
- };
- } // namespace android
- #endif // NUPLAYER2_CCDECODER_H_
|