Commit 33b921e8 authored by Linshizhi's avatar Linshizhi

Merge branch 'master' of gitlab.ilaihua.com:linshizhi/ffmpeg.sharedmemoryproto

parents 247664af 14e8b4f7
......@@ -38,6 +38,7 @@ int MovMemProto::read_packet_internal(void *priv, uint8_t *buf, int bufSize) {
// Update TransContext
trans.pos += sizeToRead;
trans.remain -= sizeToRead;
sizeOfBuffer -= sizeToRead;
// Datas of current memory piece is all
// readed, do cleaning.
......@@ -64,6 +65,7 @@ void MovMemProto::close_internal() {
while (!s.empty()) {
auto mem = s.front();
mem.data = nullptr;
s.pop();
}
}
......
......@@ -28,7 +28,7 @@ public:
static constexpr char protoName[] = "MovMemProto";
MovMemProto(void *priv, RW_FLAG flag):
IOProtocol(protoName, flag, priv) {}
IOProtocol(protoName, flag, priv), sizeOfBuffer(0) {}
int read_packet_internal(void *priv, uint8_t *buf, int bufSize);
......@@ -42,15 +42,21 @@ public:
void push(uint8_t data[], size_t size) {
s.push(MemPiece{ std::shared_ptr<uint8_t[]>(data), size });
sizeOfBuffer += size;
}
void eof() {
s.push(MemPiece{ nullptr, 0 });
}
size_t size() const {
return sizeOfBuffer;
}
private:
Stream s;
TransContext trans;
size_t sizeOfBuffer;
};
}}
......
......@@ -3,22 +3,38 @@
namespace Utils {
static void close_input_file(AVFormatContext **ctx_ptr)
{
int i;
AVFormatContext *fmt_ctx = *ctx_ptr;
/* close decoder for each stream */
for (i = 0; i < fmt_ctx->nb_streams; i++) {
AVStream *stream = fmt_ctx->streams[i];
avcodec_close(stream->codec);
}
avformat_close_input(ctx_ptr);
}
static AVFormatContext* AVFormatInputContextConstructor(
std::string path, AVIOContext *customIO) {
const char *filename = path.c_str();
AVFormatContext *ctx = nullptr;
if (customIO != nullptr) {
ctx = avformat_alloc_context();
ctx->pb = customIO;
filename = nullptr;
}
if (avformat_open_input(&ctx, path.c_str(), nullptr, nullptr) < 0) {
if (avformat_open_input(&ctx, filename, nullptr, nullptr) < 0) {
return nullptr;
}
if (avformat_find_stream_info(ctx, nullptr) < 0) {
avformat_close_input(&ctx);
close_input_file(&ctx);
return nullptr;
}
......@@ -26,7 +42,9 @@ static AVFormatContext* AVFormatInputContextConstructor(
}
static void AVFormatInputContextDestructor(AVFormatContext *ctx) {
avformat_close_input(&ctx);
if (ctx != nullptr) {
avformat_close_input(&ctx);
}
}
AVFormatContextShared makeInAVFormat(std::string path, AVIOContext *customIO) {
......@@ -57,7 +75,11 @@ static AVFormatContext* AVFormatOutputContextConstructor(
}
static void AVFormatOutputContextDestructor(AVFormatContext *ctx) {
avformat_close_input(&ctx);
if (ctx != nullptr) {
if (ctx->pb && strnlen(ctx->filename, 1024) > 0)
avio_close(ctx->pb);
avformat_free_context(ctx);
}
}
AVFormatContextShared makeOutAVFormat(
......
......@@ -373,7 +373,7 @@ TEST_F(IOCTX_With_MovMem_Proto_Fixture, Initialize) {
t1.detach();
std::this_thread::sleep_for(std::chrono::milliseconds(100));
std::this_thread::sleep_for(std::chrono::milliseconds(500));
inCtxMM = new IOCtx::InCtx("", mmProto);
AVStream *s = inCtxMM->getStream([](AVStream *s) {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment