From d091136b81be4a4f5f14b525c78c9b90810d3b71 Mon Sep 17 00:00:00 2001 From: pingkai Date: Thu, 2 Jul 2020 19:33:25 +0800 Subject: [PATCH] improvement(avformatdemuxer): covert o to AVERROR_EOF in read cb Signed-off-by: pingkai --- framework/data_source/dataSourceIO.cpp | 3 ++- framework/demuxer/avFormatDemuxer.cpp | 17 ++++++++++++++--- framework/demuxer/avFormatDemuxer.h | 4 ++++ 3 files changed, 20 insertions(+), 4 deletions(-) diff --git a/framework/data_source/dataSourceIO.cpp b/framework/data_source/dataSourceIO.cpp index c4efb8336..aa1537d1f 100644 --- a/framework/data_source/dataSourceIO.cpp +++ b/framework/data_source/dataSourceIO.cpp @@ -30,7 +30,8 @@ namespace Cicada { { auto *pHandle = static_cast(arg); // AF_LOGE("read_callback", "%s %d \n", __func__, size); - return pHandle->mPDataSource->Read(buffer, size); + int ret = pHandle->mPDataSource->Read(buffer, size); + return ret ? ret : AVERROR_EOF; } int64_t dataSourceIO::seek_callback(void *arg, int64_t offset, int whence) diff --git a/framework/demuxer/avFormatDemuxer.cpp b/framework/demuxer/avFormatDemuxer.cpp index c826ba4ec..ac95e9965 100644 --- a/framework/demuxer/avFormatDemuxer.cpp +++ b/framework/demuxer/avFormatDemuxer.cpp @@ -82,7 +82,8 @@ namespace Cicada { if (mReadCb != nullptr ) { uint8_t *read_buffer = static_cast(av_malloc(INITIAL_BUFFER_SIZE)); - mPInPutPb = avio_alloc_context(read_buffer, INITIAL_BUFFER_SIZE, 0, mUserArg, mReadCb, nullptr, mSeekCb); + mPInPutPb = avio_alloc_context(read_buffer, INITIAL_BUFFER_SIZE, 0, this, mReadCb ? avio_callback_read : nullptr, nullptr, + mSeekCb ? avio_callback_seek : nullptr); if (mPInPutPb == nullptr) { av_free(read_buffer); @@ -232,7 +233,7 @@ namespace Cicada { err = av_read_frame(mCtx, pkt); if (err < 0) { - if (err != AVERROR(EAGAIN)) { + if (err != AVERROR(EAGAIN) && err != AVERROR_EOF) { if (mCtx->pb && mCtx->pb->error != AVERROR_EXIT) { av_log(NULL, AV_LOG_WARNING, "%s:%d: %s, ctx->pb->error=%d\n", __FILE__, __LINE__, getErrorString(err), mCtx->pb->error); @@ -704,5 +705,15 @@ namespace Cicada { mQueCond.notify_one(); #endif } - + int avFormatDemuxer::avio_callback_read(void *arg, uint8_t *buffer, int size) + { + auto *demuxer = static_cast(arg); + int ret = demuxer->mReadCb(demuxer->mUserArg, buffer, size); + return ret ? ret : AVERROR_EOF; + } + int64_t avFormatDemuxer::avio_callback_seek(void *arg, int64_t offset, int whence) + { + auto *demuxer = static_cast(arg); + return demuxer->mSeekCb(demuxer->mUserArg, offset, whence); + } } diff --git a/framework/demuxer/avFormatDemuxer.h b/framework/demuxer/avFormatDemuxer.h index 47387f957..98bcbd8ed 100644 --- a/framework/demuxer/avFormatDemuxer.h +++ b/framework/demuxer/avFormatDemuxer.h @@ -108,6 +108,10 @@ namespace Cicada { int ReadPacketInternal(std::unique_ptr &packet); + static inline int avio_callback_read(void *arg, uint8_t *buffer, int size); + + static inline int64_t avio_callback_seek(void *arg, int64_t offset, int whence); + #if AF_HAVE_PTHREAD int readLoop();