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
317137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang    CCDecoder(const sp<AMessage> &notify);
327137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang
337137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang    size_t getTrackCount() const;
347137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang    sp<AMessage> getTrackInfo(size_t index) const;
357137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang    status_t selectTrack(size_t index, bool select);
367137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang    bool isSelected() const;
377137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang    void decode(const sp<ABuffer> &accessUnit);
387137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang    void display(int64_t timeUs);
397137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang    void flush();
407137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang
417137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhangprivate:
427137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang    sp<AMessage> mNotify;
437137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang    KeyedVector<int64_t, sp<ABuffer> > mCCMap;
447137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang    size_t mCurrentChannel;
457137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang    int32_t mSelectedTrack;
467137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang    int32_t mTrackIndices[4];
477137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang    Vector<size_t> mFoundChannels;
487137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang
497137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang    bool isTrackValid(size_t index) const;
507137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang    int32_t getTrackIndex(size_t channel) const;
517137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang    bool extractFromSEI(const sp<ABuffer> &accessUnit);
5278acc89eae9789366b6384707861f4563addf2d3Chong Zhang    bool parseSEINalUnit(int64_t timeUs, const uint8_t *nalStart, size_t nalSize);
537137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang    sp<ABuffer> filterCCBuf(const sp<ABuffer> &ccBuf, size_t index);
547137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang
557137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang    DISALLOW_EVIL_CONSTRUCTORS(CCDecoder);
567137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang};
577137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang
587137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang}  // namespace android
597137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang
607137ec7e005a5a6e3c0edb91cfacf16a31f4bf6aChong Zhang#endif  // NUPLAYER_CCDECODER_H_
61