Loading tv/tuner/1.0/default/Demux.cpp +15 −10 Original line number Diff line number Diff line Loading @@ -71,7 +71,7 @@ Return<void> Demux::openFilter(const DemuxFilterType& type, uint32_t bufferSize, mUsedFilterIds.insert(filterId); if (cb == nullptr) { ALOGW("callback can't be null"); ALOGW("[Demux] callback can't be null"); _hidl_cb(Result::INVALID_ARGUMENT, new Filter()); return Void(); } Loading @@ -82,9 +82,14 @@ Return<void> Demux::openFilter(const DemuxFilterType& type, uint32_t bufferSize, _hidl_cb(Result::UNKNOWN_ERROR, filter); return Void(); } mFilters[filterId] = filter; bool result = true; if (mDvr != nullptr && mDvr->getType() == DvrType::PLAYBACK) { result = mDvr->addPlaybackFilter(filter); } _hidl_cb(Result::SUCCESS, filter); _hidl_cb(result ? Result::SUCCESS : Result::INVALID_ARGUMENT, filter); return Void(); } Loading Loading @@ -130,7 +135,7 @@ Return<void> Demux::openDvr(DvrType type, uint32_t bufferSize, const sp<IDvrCall ALOGV("%s", __FUNCTION__); if (cb == nullptr) { ALOGW("DVR callback can't be null"); ALOGW("[Demux] DVR callback can't be null"); _hidl_cb(Result::INVALID_ARGUMENT, new Dvr()); return Void(); } Loading Loading @@ -174,11 +179,11 @@ Result Demux::removeFilter(uint32_t filterId) { void Demux::startBroadcastTsFilter(vector<uint8_t> data) { set<uint32_t>::iterator it; for (it = mUsedFilterIds.begin(); it != mUsedFilterIds.end(); it++) { uint16_t pid = ((data[1] & 0x1f) << 8) | ((data[2] & 0xff)); if (DEBUG_FILTER) { ALOGW("start ts filter pid: %d", pid); if (DEBUG_DEMUX) { ALOGW("[Demux] start ts filter pid: %d", pid); } for (it = mUsedFilterIds.begin(); it != mUsedFilterIds.end(); it++) { if (pid == mFilters[*it]->getTpid()) { mFilters[*it]->updateFilterOutput(data); } Loading @@ -187,10 +192,10 @@ void Demux::startBroadcastTsFilter(vector<uint8_t> data) { void Demux::sendFrontendInputToRecord(vector<uint8_t> data) { set<uint32_t>::iterator it; for (it = mRecordFilterIds.begin(); it != mRecordFilterIds.end(); it++) { if (DEBUG_FILTER) { ALOGW("update record filter output"); if (DEBUG_DEMUX) { ALOGW("[Demux] update record filter output"); } for (it = mRecordFilterIds.begin(); it != mRecordFilterIds.end(); it++) { mFilters[*it]->updateRecordOutput(data); } } Loading tv/tuner/1.0/default/Demux.h +1 −1 Original line number Diff line number Diff line Loading @@ -188,7 +188,7 @@ class Demux : public IDemux { int mPesSizeLeft = 0; vector<uint8_t> mPesOutput; const bool DEBUG_FILTER = false; const bool DEBUG_DEMUX = false; }; } // namespace implementation Loading tv/tuner/1.0/default/Dvr.cpp +28 −11 Original line number Diff line number Diff line Loading @@ -71,13 +71,10 @@ Return<Result> Dvr::attachFilter(const sp<IFilter>& filter) { } // check if the attached filter is a record filter mFilters[filterId] = filter; mIsRecordFilterAttached = true; if (!mDemux->attachRecordFilter(filterId)) { return Result::INVALID_ARGUMENT; } mDemux->setIsRecording(mIsRecordStarted | mIsRecordFilterAttached); return Result::SUCCESS; } Loading Loading @@ -110,7 +107,6 @@ Return<Result> Dvr::detachFilter(const sp<IFilter>& filter) { // If all the filters are detached, record can't be started if (mFilters.empty()) { mIsRecordFilterAttached = false; mDemux->setIsRecording(mIsRecordStarted | mIsRecordFilterAttached); } return Result::SUCCESS; Loading @@ -132,8 +128,7 @@ Return<Result> Dvr::start() { pthread_setname_np(mDvrThread, "playback_waiting_loop"); } else if (mType == DvrType::RECORD) { mRecordStatus = RecordStatus::DATA_READY; mIsRecordStarted = true; mDemux->setIsRecording(mIsRecordStarted | mIsRecordFilterAttached); mDemux->setIsRecording(mType == DvrType::RECORD); } // TODO start another thread to send filter status callback to the framework Loading @@ -149,7 +144,7 @@ Return<Result> Dvr::stop() { std::lock_guard<std::mutex> lock(mDvrThreadLock); mIsRecordStarted = false; mDemux->setIsRecording(mIsRecordStarted | mIsRecordFilterAttached); mDemux->setIsRecording(false); return Result::SUCCESS; } Loading @@ -175,7 +170,7 @@ bool Dvr::createDvrMQ() { std::unique_ptr<DvrMQ> tmpDvrMQ = std::unique_ptr<DvrMQ>(new (std::nothrow) DvrMQ(mBufferSize, true)); if (!tmpDvrMQ->isValid()) { ALOGW("Failed to create FMQ of DVR"); ALOGW("[Dvr] Failed to create FMQ of DVR"); return false; } Loading Loading @@ -256,7 +251,6 @@ bool Dvr::readPlaybackFMQ() { int playbackPacketSize = mDvrSettings.playback().packetSize; vector<uint8_t> dataOutputBuffer; dataOutputBuffer.resize(playbackPacketSize); // Dispatch the packet to the PID matching filter output buffer for (int i = 0; i < size / playbackPacketSize; i++) { if (!mDvrMQ->read(dataOutputBuffer.data(), playbackPacketSize)) { Loading @@ -283,7 +277,6 @@ void Dvr::startTpidFilter(vector<uint8_t> data) { bool Dvr::startFilterDispatcher() { std::map<uint32_t, sp<IFilter>>::iterator it; // Handle the output data per filter type for (it = mFilters.begin(); it != mFilters.end(); it++) { if (mDemux->startFilterHandler(it->first) != Result::SUCCESS) { Loading @@ -296,7 +289,10 @@ bool Dvr::startFilterDispatcher() { bool Dvr::writeRecordFMQ(const std::vector<uint8_t>& data) { std::lock_guard<std::mutex> lock(mWriteLock); ALOGW("[Dvr] write record FMQ"); if (mRecordStatus == RecordStatus::OVERFLOW) { ALOGW("[Dvr] stops writing and wait for the client side flushing."); return true; } if (mDvrMQ->write(data.data(), data.size())) { mDvrEventFlag->wake(static_cast<uint32_t>(DemuxQueueNotifyBits::DATA_READY)); maySendRecordStatusCallback(); Loading Loading @@ -333,6 +329,27 @@ RecordStatus Dvr::checkRecordStatusChange(uint32_t availableToWrite, uint32_t av return mRecordStatus; } bool Dvr::addPlaybackFilter(sp<IFilter> filter) { uint32_t filterId; Result status; filter->getId([&](Result result, uint32_t id) { filterId = id; status = result; }); if (status != Result::SUCCESS) { return false; } mFilters[filterId] = filter; return true; } DvrType Dvr::getType() { return mType; } } // namespace implementation } // namespace V1_0 } // namespace tuner Loading tv/tuner/1.0/default/Dvr.h +2 −0 Original line number Diff line number Diff line Loading @@ -81,6 +81,8 @@ class Dvr : public IDvr { bool createDvrMQ(); void sendBroadcastInputToDvrRecord(vector<uint8_t> byteBuffer); bool writeRecordFMQ(const std::vector<uint8_t>& data); DvrType getType(); bool addPlaybackFilter(sp<IFilter> filter); private: // Demux service Loading tv/tuner/1.0/default/Filter.cpp +1 −4 Original line number Diff line number Diff line Loading @@ -149,7 +149,7 @@ bool Filter::createFilterMQ() { std::unique_ptr<FilterMQ> tmpFilterMQ = std::unique_ptr<FilterMQ>(new (std::nothrow) FilterMQ(mBufferSize, true)); if (!tmpFilterMQ->isValid()) { ALOGW("Failed to create FMQ of filter with id: %d", mFilterId); ALOGW("[Filter] Failed to create FMQ of filter with id: %d", mFilterId); return false; } Loading Loading @@ -290,13 +290,11 @@ uint16_t Filter::getTpid() { void Filter::updateFilterOutput(vector<uint8_t> data) { std::lock_guard<std::mutex> lock(mFilterOutputLock); ALOGD("[Filter] filter output updated"); mFilterOutput.insert(mFilterOutput.end(), data.begin(), data.end()); } void Filter::updateRecordOutput(vector<uint8_t> data) { std::lock_guard<std::mutex> lock(mRecordFilterOutputLock); ALOGD("[Filter] record filter output updated"); mRecordFilterOutput.insert(mRecordFilterOutput.end(), data.begin(), data.end()); } Loading Loading @@ -438,7 +436,6 @@ Result Filter::startMediaFilterHandler() { if (mFilterOutput.empty()) { return Result::SUCCESS; } for (int i = 0; i < mFilterOutput.size(); i += 188) { if (mPesSizeLeft == 0) { uint32_t prefix = (mFilterOutput[i + 4] << 16) | (mFilterOutput[i + 5] << 8) | Loading Loading
tv/tuner/1.0/default/Demux.cpp +15 −10 Original line number Diff line number Diff line Loading @@ -71,7 +71,7 @@ Return<void> Demux::openFilter(const DemuxFilterType& type, uint32_t bufferSize, mUsedFilterIds.insert(filterId); if (cb == nullptr) { ALOGW("callback can't be null"); ALOGW("[Demux] callback can't be null"); _hidl_cb(Result::INVALID_ARGUMENT, new Filter()); return Void(); } Loading @@ -82,9 +82,14 @@ Return<void> Demux::openFilter(const DemuxFilterType& type, uint32_t bufferSize, _hidl_cb(Result::UNKNOWN_ERROR, filter); return Void(); } mFilters[filterId] = filter; bool result = true; if (mDvr != nullptr && mDvr->getType() == DvrType::PLAYBACK) { result = mDvr->addPlaybackFilter(filter); } _hidl_cb(Result::SUCCESS, filter); _hidl_cb(result ? Result::SUCCESS : Result::INVALID_ARGUMENT, filter); return Void(); } Loading Loading @@ -130,7 +135,7 @@ Return<void> Demux::openDvr(DvrType type, uint32_t bufferSize, const sp<IDvrCall ALOGV("%s", __FUNCTION__); if (cb == nullptr) { ALOGW("DVR callback can't be null"); ALOGW("[Demux] DVR callback can't be null"); _hidl_cb(Result::INVALID_ARGUMENT, new Dvr()); return Void(); } Loading Loading @@ -174,11 +179,11 @@ Result Demux::removeFilter(uint32_t filterId) { void Demux::startBroadcastTsFilter(vector<uint8_t> data) { set<uint32_t>::iterator it; for (it = mUsedFilterIds.begin(); it != mUsedFilterIds.end(); it++) { uint16_t pid = ((data[1] & 0x1f) << 8) | ((data[2] & 0xff)); if (DEBUG_FILTER) { ALOGW("start ts filter pid: %d", pid); if (DEBUG_DEMUX) { ALOGW("[Demux] start ts filter pid: %d", pid); } for (it = mUsedFilterIds.begin(); it != mUsedFilterIds.end(); it++) { if (pid == mFilters[*it]->getTpid()) { mFilters[*it]->updateFilterOutput(data); } Loading @@ -187,10 +192,10 @@ void Demux::startBroadcastTsFilter(vector<uint8_t> data) { void Demux::sendFrontendInputToRecord(vector<uint8_t> data) { set<uint32_t>::iterator it; for (it = mRecordFilterIds.begin(); it != mRecordFilterIds.end(); it++) { if (DEBUG_FILTER) { ALOGW("update record filter output"); if (DEBUG_DEMUX) { ALOGW("[Demux] update record filter output"); } for (it = mRecordFilterIds.begin(); it != mRecordFilterIds.end(); it++) { mFilters[*it]->updateRecordOutput(data); } } Loading
tv/tuner/1.0/default/Demux.h +1 −1 Original line number Diff line number Diff line Loading @@ -188,7 +188,7 @@ class Demux : public IDemux { int mPesSizeLeft = 0; vector<uint8_t> mPesOutput; const bool DEBUG_FILTER = false; const bool DEBUG_DEMUX = false; }; } // namespace implementation Loading
tv/tuner/1.0/default/Dvr.cpp +28 −11 Original line number Diff line number Diff line Loading @@ -71,13 +71,10 @@ Return<Result> Dvr::attachFilter(const sp<IFilter>& filter) { } // check if the attached filter is a record filter mFilters[filterId] = filter; mIsRecordFilterAttached = true; if (!mDemux->attachRecordFilter(filterId)) { return Result::INVALID_ARGUMENT; } mDemux->setIsRecording(mIsRecordStarted | mIsRecordFilterAttached); return Result::SUCCESS; } Loading Loading @@ -110,7 +107,6 @@ Return<Result> Dvr::detachFilter(const sp<IFilter>& filter) { // If all the filters are detached, record can't be started if (mFilters.empty()) { mIsRecordFilterAttached = false; mDemux->setIsRecording(mIsRecordStarted | mIsRecordFilterAttached); } return Result::SUCCESS; Loading @@ -132,8 +128,7 @@ Return<Result> Dvr::start() { pthread_setname_np(mDvrThread, "playback_waiting_loop"); } else if (mType == DvrType::RECORD) { mRecordStatus = RecordStatus::DATA_READY; mIsRecordStarted = true; mDemux->setIsRecording(mIsRecordStarted | mIsRecordFilterAttached); mDemux->setIsRecording(mType == DvrType::RECORD); } // TODO start another thread to send filter status callback to the framework Loading @@ -149,7 +144,7 @@ Return<Result> Dvr::stop() { std::lock_guard<std::mutex> lock(mDvrThreadLock); mIsRecordStarted = false; mDemux->setIsRecording(mIsRecordStarted | mIsRecordFilterAttached); mDemux->setIsRecording(false); return Result::SUCCESS; } Loading @@ -175,7 +170,7 @@ bool Dvr::createDvrMQ() { std::unique_ptr<DvrMQ> tmpDvrMQ = std::unique_ptr<DvrMQ>(new (std::nothrow) DvrMQ(mBufferSize, true)); if (!tmpDvrMQ->isValid()) { ALOGW("Failed to create FMQ of DVR"); ALOGW("[Dvr] Failed to create FMQ of DVR"); return false; } Loading Loading @@ -256,7 +251,6 @@ bool Dvr::readPlaybackFMQ() { int playbackPacketSize = mDvrSettings.playback().packetSize; vector<uint8_t> dataOutputBuffer; dataOutputBuffer.resize(playbackPacketSize); // Dispatch the packet to the PID matching filter output buffer for (int i = 0; i < size / playbackPacketSize; i++) { if (!mDvrMQ->read(dataOutputBuffer.data(), playbackPacketSize)) { Loading @@ -283,7 +277,6 @@ void Dvr::startTpidFilter(vector<uint8_t> data) { bool Dvr::startFilterDispatcher() { std::map<uint32_t, sp<IFilter>>::iterator it; // Handle the output data per filter type for (it = mFilters.begin(); it != mFilters.end(); it++) { if (mDemux->startFilterHandler(it->first) != Result::SUCCESS) { Loading @@ -296,7 +289,10 @@ bool Dvr::startFilterDispatcher() { bool Dvr::writeRecordFMQ(const std::vector<uint8_t>& data) { std::lock_guard<std::mutex> lock(mWriteLock); ALOGW("[Dvr] write record FMQ"); if (mRecordStatus == RecordStatus::OVERFLOW) { ALOGW("[Dvr] stops writing and wait for the client side flushing."); return true; } if (mDvrMQ->write(data.data(), data.size())) { mDvrEventFlag->wake(static_cast<uint32_t>(DemuxQueueNotifyBits::DATA_READY)); maySendRecordStatusCallback(); Loading Loading @@ -333,6 +329,27 @@ RecordStatus Dvr::checkRecordStatusChange(uint32_t availableToWrite, uint32_t av return mRecordStatus; } bool Dvr::addPlaybackFilter(sp<IFilter> filter) { uint32_t filterId; Result status; filter->getId([&](Result result, uint32_t id) { filterId = id; status = result; }); if (status != Result::SUCCESS) { return false; } mFilters[filterId] = filter; return true; } DvrType Dvr::getType() { return mType; } } // namespace implementation } // namespace V1_0 } // namespace tuner Loading
tv/tuner/1.0/default/Dvr.h +2 −0 Original line number Diff line number Diff line Loading @@ -81,6 +81,8 @@ class Dvr : public IDvr { bool createDvrMQ(); void sendBroadcastInputToDvrRecord(vector<uint8_t> byteBuffer); bool writeRecordFMQ(const std::vector<uint8_t>& data); DvrType getType(); bool addPlaybackFilter(sp<IFilter> filter); private: // Demux service Loading
tv/tuner/1.0/default/Filter.cpp +1 −4 Original line number Diff line number Diff line Loading @@ -149,7 +149,7 @@ bool Filter::createFilterMQ() { std::unique_ptr<FilterMQ> tmpFilterMQ = std::unique_ptr<FilterMQ>(new (std::nothrow) FilterMQ(mBufferSize, true)); if (!tmpFilterMQ->isValid()) { ALOGW("Failed to create FMQ of filter with id: %d", mFilterId); ALOGW("[Filter] Failed to create FMQ of filter with id: %d", mFilterId); return false; } Loading Loading @@ -290,13 +290,11 @@ uint16_t Filter::getTpid() { void Filter::updateFilterOutput(vector<uint8_t> data) { std::lock_guard<std::mutex> lock(mFilterOutputLock); ALOGD("[Filter] filter output updated"); mFilterOutput.insert(mFilterOutput.end(), data.begin(), data.end()); } void Filter::updateRecordOutput(vector<uint8_t> data) { std::lock_guard<std::mutex> lock(mRecordFilterOutputLock); ALOGD("[Filter] record filter output updated"); mRecordFilterOutput.insert(mRecordFilterOutput.end(), data.begin(), data.end()); } Loading Loading @@ -438,7 +436,6 @@ Result Filter::startMediaFilterHandler() { if (mFilterOutput.empty()) { return Result::SUCCESS; } for (int i = 0; i < mFilterOutput.size(); i += 188) { if (mPesSizeLeft == 0) { uint32_t prefix = (mFilterOutput[i + 4] << 16) | (mFilterOutput[i + 5] << 8) | Loading