X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=futatabi%2Fjpeg_frame_view.cpp;h=85c708d4d20f9aff8f137d0d3573b489d9a368f5;hb=refs%2Fheads%2Fmaster;hp=ff4fcb8242d7e0d565b4de840d3af30f3506c840;hpb=3a14c93e32adeb0ecb30e767ba4397b2545b0f39;p=nageru
diff --git a/futatabi/jpeg_frame_view.cpp b/futatabi/jpeg_frame_view.cpp
index ff4fcb8..6dafb3e 100644
--- a/futatabi/jpeg_frame_view.cpp
+++ b/futatabi/jpeg_frame_view.cpp
@@ -112,6 +112,8 @@ shared_ptr decode_jpeg(const string &jpeg)
}
JPEGDestroyer destroy_dinfo(&dinfo);
+ jpeg_save_markers(&dinfo, JPEG_APP0 + 1, 0xFFFF);
+
if (!error_mgr.run([&dinfo, &jpeg] {
jpeg_mem_src(&dinfo, reinterpret_cast(jpeg.data()), jpeg.size());
jpeg_read_header(&dinfo, true);
@@ -119,8 +121,6 @@ shared_ptr decode_jpeg(const string &jpeg)
return get_black_frame();
}
- jpeg_save_markers(&dinfo, JPEG_APP0 + 1, 0xFFFF);
-
if (dinfo.num_components != 3) {
fprintf(stderr, "Not a color JPEG. (%d components, Y=%dx%d, Cb=%dx%d, Cr=%dx%d)\n",
dinfo.num_components,
@@ -182,8 +182,10 @@ shared_ptr decode_jpeg(const string &jpeg)
}
if (!error_mgr.run([&dinfo, &y_pix, &cb_pix, &cr_pix, pitch_y, pitch_chroma, v_mcu_size, mcu_height_blocks] {
- JSAMPROW yptr[v_mcu_size], cbptr[v_mcu_size], crptr[v_mcu_size];
- JSAMPARRAY data[3] = { yptr, cbptr, crptr };
+ unique_ptr yptr(new JSAMPROW[v_mcu_size]);
+ unique_ptr cbptr(new JSAMPROW[v_mcu_size]);
+ unique_ptr crptr(new JSAMPROW[v_mcu_size]);
+ JSAMPARRAY data[3] = { yptr.get(), cbptr.get(), crptr.get() };
for (unsigned y = 0; y < mcu_height_blocks; ++y) {
// NOTE: The last elements of cbptr/crptr will be unused for vertically subsampled chroma.
for (unsigned yy = 0; yy < v_mcu_size; ++yy) {
@@ -210,6 +212,7 @@ shared_ptr decode_jpeg(const string &jpeg)
glFlushMappedNamedBufferRange(pbo.pbo, 0, dinfo.image_width * dinfo.image_height + chroma_width * chroma_height * 2);
glMemoryBarrier(GL_PIXEL_BUFFER_BARRIER_BIT);
pbo.upload_done = RefCountedGLsync(GL_SYNC_GPU_COMMANDS_COMPLETE, /*flags=*/0);
+ glFlush();
frame->uploaded_ui_thread = pbo.upload_done;
frame->uploaded_interpolation = pbo.upload_done;
global_pbo_pool->release_pbo(move(pbo));
@@ -411,6 +414,7 @@ void JPEGFrameView::setFrame(shared_ptr frame)
lock_guard lock(cache_mu);
PendingDecode decode;
decode.frame = std::move(frame);
+ decode.fade_alpha = 0.0f;
pending_decodes.push_back(decode);
any_pending_decodes.notify_all();
}