Skip to content

Commit

Permalink
[emapp] more video encoder fixes (#43)
Browse files Browse the repository at this point in the history
* [plugin] fixed a thread leak detected by TSAN
* [emapp] ensure async frame reader works only one session
  • Loading branch information
hkrn authored Sep 15, 2021
1 parent 4f7d540 commit 0f4bdb7
Show file tree
Hide file tree
Showing 3 changed files with 31 additions and 15 deletions.
3 changes: 2 additions & 1 deletion emapp/include/emapp/internal/CapturingPassState.h
Original file line number Diff line number Diff line change
Expand Up @@ -97,7 +97,8 @@ class CapturingPassState : private NonCopyable {

StateController *stateController();
const ByteArray &frameImageData() const;
nanoem_u8_t *frameImageDataPtr();
nanoem_u8_t *mutableFrameImageDataPtr();
bx::Mutex &mutex();
sg_image_desc outputImageDescription() const;
StateTransition stateTransition();
void setStateTransition(StateTransition value);
Expand Down
6 changes: 5 additions & 1 deletion emapp/plugins/lsmash/lsmash.cc
Original file line number Diff line number Diff line change
Expand Up @@ -397,7 +397,11 @@ struct LSmashEncoder {
{
int result = 0;
if (m_root) {
m_worker->waitForCompletion();
if (m_worker) {
m_worker->waitForCompletion();
delete m_worker;
m_worker = nullptr;
}
result = lsmash_close_file(&m_fileParameters);
handleStatusCode(result, status);
lsmash_cleanup_summary(reinterpret_cast<lsmash_summary_t *>(m_audioSummary));
Expand Down
37 changes: 24 additions & 13 deletions emapp/src/internal/CapturingPassState.cc
Original file line number Diff line number Diff line change
Expand Up @@ -1107,11 +1107,17 @@ CapturingPassState::frameImageData() const
}

nanoem_u8_t *
CapturingPassState::frameImageDataPtr()
CapturingPassState::mutableFrameImageDataPtr()
{
return m_frameImageData.data();
}

bx::Mutex &
CapturingPassState::mutex()
{
return m_mutex;
}

sg_image_desc
CapturingPassState::outputImageDescription() const
{
Expand Down Expand Up @@ -1251,7 +1257,7 @@ CapturingPassAsImageState::capture(Project *project, Error &error)
readPassImage();
ImageWriter writer(fileURI(), error);
const nanoem_u32_t width = desc.width, height = desc.height;
writer.write(frameImageDataPtr(), width, height, desc.pixel_format);
writer.write(mutableFrameImageDataPtr(), width, height, desc.pixel_format);
state = kFinished;
setStateTransition(state);
SG_POP_GROUP();
Expand Down Expand Up @@ -1496,28 +1502,33 @@ CapturingPassAsVideoState::handleCaptureViaEncoderPlugin(Project *project, nanoe
handleReadPassAsync(const void *data, size_t size, void *opaque)
{
AsyncReadHandler *self = static_cast<AsyncReadHandler *>(opaque);
CapturingPassAsVideoState *state = self->m_state;
self->readPassAsync(data, size);
nanoem_delete(self);
}
void
readPassAsync(const void *data, size_t size)
{
bx::MutexScope scope(m_state->mutex());
Error error;
if (state->frameImageData().size() == size) {
memcpy(state->frameImageDataPtr(), data, size);
if (state->outputImageDescription().pixel_format == SG_PIXELFORMAT_RGBA8) {
nanoem_u32_t *dataPtr = reinterpret_cast<nanoem_u32_t *>(state->frameImageDataPtr());
if (m_state->frameImageData().size() == size) {
memcpy(m_state->mutableFrameImageDataPtr(), data, size);
if (m_state->outputImageDescription().pixel_format == SG_PIXELFORMAT_RGBA8) {
nanoem_u32_t *dataPtr = reinterpret_cast<nanoem_u32_t *>(m_state->mutableFrameImageDataPtr());
for (size_t i = 0, numPixels = size / sizeof(*dataPtr); i < numPixels; i++) {
nanoem_u32_t *ptr = dataPtr + i, v = *ptr;
*ptr = 0 | ((v & 0x000000ff) << 16) | (v & 0x0000ff00) | ((v & 0x00ff0000) >> 16) |
(v & 0xff000000);
}
}
if (!state->encodeVideoFrame(state->frameImageData(), self->m_videoFrameIndex, error)) {
state->stopEncoding(error);
state->setStateTransition(kCancelled);
if (!m_state->encodeVideoFrame(m_state->frameImageData(), m_videoFrameIndex, error)) {
m_state->stopEncoding(error);
m_state->setStateTransition(kCancelled);
}
}
else {
state->stopEncoding(error);
state->setStateTransition(kCancelled);
m_state->stopEncoding(error);
m_state->setStateTransition(kCancelled);
}
nanoem_delete(self);
}
CapturingPassAsVideoState *m_state;
nanoem_frame_index_t m_videoFrameIndex;
Expand Down

0 comments on commit 0f4bdb7

Please sign in to comment.