38 Q_ASSERT(!filePath.isEmpty());
40 const QByteArray filePathUtf8 = filePath.toUtf8();
42 std::unique_ptr<
char,
decltype(&av_free)> url(
43 reinterpret_cast<
char *>(av_malloc(filePathUtf8.size() + 1)), &av_free);
44 memcpy(url.get(), filePathUtf8.constData(), filePathUtf8.size() + 1);
47 auto result = avio_open2(&m_avFormatContext->pb, url.get(), AVIO_FLAG_WRITE,
nullptr,
nullptr);
49 qCDebug(qLcEncodingFormatContext)
50 <<
"opened by file path:" << url.get() <<
", result:" << result;
52 Q_ASSERT(m_avFormatContext->url ==
nullptr);
54 m_avFormatContext->url = url.release();
57 return openAVIOWithQFile(filePath);
86 if (!device->isWritable())
89 auto buffer =
static_cast<uint8_t *>(av_malloc(DefaultBufferSize));
90 m_avFormatContext->pb = avio_alloc_context(buffer, DefaultBufferSize, 1, device,
nullptr,
91 &writeQIODevice, &seekQIODevice);
92 return bool(m_avFormatContext->pb);
99 if (m_avFormatContext->url && *m_avFormatContext->url !=
'\0') {
100 auto closeResult = avio_closep(&m_avFormatContext->pb);
101 Q_ASSERT(closeResult == 0);
103 av_free(std::exchange(m_avFormatContext->pb->buffer,
nullptr));
104 avio_context_free(&m_avFormatContext->pb);
109 av_freep(&m_avFormatContext->url);
110 m_outputFile.reset();
112 Q_ASSERT(!m_outputFile);