browser(webkit): do not leak vpx codecs (#16032)

This commit is contained in:
Yury Semikhatsky 2022-07-28 13:16:20 -07:00 committed by GitHub
parent 3d89506704
commit 4b7da07b0f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 26 additions and 14 deletions

View File

@ -1,2 +1,2 @@
1691 1692
Changed: yurys@chromium.org Tue 26 Jul 2022 12:38:57 PM PDT Changed: yurys@chromium.org Thu 28 Jul 2022 01:15:17 PM PDT

View File

@ -13168,10 +13168,10 @@ index 0000000000000000000000000000000000000000..d28dde452275f18739e3b1c8d709185c
+} // namespace WebKit +} // namespace WebKit
diff --git a/Source/WebKit/UIProcess/Inspector/Agents/ScreencastEncoder.cpp b/Source/WebKit/UIProcess/Inspector/Agents/ScreencastEncoder.cpp diff --git a/Source/WebKit/UIProcess/Inspector/Agents/ScreencastEncoder.cpp b/Source/WebKit/UIProcess/Inspector/Agents/ScreencastEncoder.cpp
new file mode 100644 new file mode 100644
index 0000000000000000000000000000000000000000..489fb9a4a98de71526a6c3d6746e8b7192bac9b8 index 0000000000000000000000000000000000000000..5f82314ec035268b1a90568935d427e0909eae05
--- /dev/null --- /dev/null
+++ b/Source/WebKit/UIProcess/Inspector/Agents/ScreencastEncoder.cpp +++ b/Source/WebKit/UIProcess/Inspector/Agents/ScreencastEncoder.cpp
@@ -0,0 +1,379 @@ @@ -0,0 +1,391 @@
+/* +/*
+ * Copyright (c) 2010, The WebM Project authors. All rights reserved. + * Copyright (c) 2010, The WebM Project authors. All rights reserved.
+ * Copyright (c) 2013 The Chromium Authors. All rights reserved. + * Copyright (c) 2013 The Chromium Authors. All rights reserved.
@ -13223,6 +13223,18 @@ index 0000000000000000000000000000000000000000..489fb9a4a98de71526a6c3d6746e8b71
+ +
+namespace { +namespace {
+ +
+struct VpxCodecDeleter {
+ void operator()(vpx_codec_ctx_t* codec) {
+ if (codec) {
+ vpx_codec_err_t ret = vpx_codec_destroy(codec);
+ if (ret != VPX_CODEC_OK)
+ fprintf(stderr, "Failed to encode frame: %s\n", vpx_codec_error(codec));
+ }
+ }
+};
+
+using ScopedVpxCodec = std::unique_ptr<vpx_codec_ctx_t, VpxCodecDeleter>;
+
+// Number of timebase unints per one frame. +// Number of timebase unints per one frame.
+constexpr int timeScale = 1000; +constexpr int timeScale = 1000;
+ +
@ -13343,9 +13355,9 @@ index 0000000000000000000000000000000000000000..489fb9a4a98de71526a6c3d6746e8b71
+ +
+class ScreencastEncoder::VPXCodec { +class ScreencastEncoder::VPXCodec {
+public: +public:
+ VPXCodec(vpx_codec_ctx_t codec, vpx_codec_enc_cfg_t cfg, FILE* file) + VPXCodec(ScopedVpxCodec codec, vpx_codec_enc_cfg_t cfg, FILE* file)
+ : m_encoderQueue(WorkQueue::create("Screencast encoder")) + : m_encoderQueue(WorkQueue::create("Screencast encoder"))
+ , m_codec(codec) + , m_codec(WTFMove(codec))
+ , m_cfg(cfg) + , m_cfg(cfg)
+ , m_file(file) + , m_file(file)
+ , m_writer(new WebMFileWriter(file, &m_cfg)) + , m_writer(new WebMFileWriter(file, &m_cfg))
@ -13381,14 +13393,14 @@ index 0000000000000000000000000000000000000000..489fb9a4a98de71526a6c3d6746e8b71
+ vpx_codec_iter_t iter = nullptr; + vpx_codec_iter_t iter = nullptr;
+ const vpx_codec_cx_pkt_t *pkt = nullptr; + const vpx_codec_cx_pkt_t *pkt = nullptr;
+ int flags = 0; + int flags = 0;
+ const vpx_codec_err_t res = vpx_codec_encode(&m_codec, img, m_pts, duration, flags, VPX_DL_REALTIME); + const vpx_codec_err_t res = vpx_codec_encode(m_codec.get(), img, m_pts, duration, flags, VPX_DL_REALTIME);
+ if (res != VPX_CODEC_OK) { + if (res != VPX_CODEC_OK) {
+ fprintf(stderr, "Failed to encode frame: %s\n", vpx_codec_error(&m_codec)); + fprintf(stderr, "Failed to encode frame: %s\n", vpx_codec_error(m_codec.get()));
+ return false; + return false;
+ } + }
+ +
+ bool gotPkts = false; + bool gotPkts = false;
+ while ((pkt = vpx_codec_get_cx_data(&m_codec, &iter)) != nullptr) { + while ((pkt = vpx_codec_get_cx_data(m_codec.get(), &iter)) != nullptr) {
+ gotPkts = true; + gotPkts = true;
+ +
+ if (pkt->kind == VPX_CODEC_CX_FRAME_PKT) { + if (pkt->kind == VPX_CODEC_CX_FRAME_PKT) {
@ -13415,7 +13427,7 @@ index 0000000000000000000000000000000000000000..489fb9a4a98de71526a6c3d6746e8b71
+ } + }
+ +
+ Ref<WorkQueue> m_encoderQueue; + Ref<WorkQueue> m_encoderQueue;
+ vpx_codec_ctx_t m_codec; + ScopedVpxCodec m_codec;
+ vpx_codec_enc_cfg_t m_cfg; + vpx_codec_enc_cfg_t m_cfg;
+ FILE* m_file { nullptr }; + FILE* m_file { nullptr };
+ std::unique_ptr<WebMFileWriter> m_writer; + std::unique_ptr<WebMFileWriter> m_writer;
@ -13463,9 +13475,9 @@ index 0000000000000000000000000000000000000000..489fb9a4a98de71526a6c3d6746e8b71
+ cfg.g_timebase.den = fps * timeScale; + cfg.g_timebase.den = fps * timeScale;
+ cfg.g_error_resilient = VPX_ERROR_RESILIENT_DEFAULT; + cfg.g_error_resilient = VPX_ERROR_RESILIENT_DEFAULT;
+ +
+ vpx_codec_ctx_t codec; + ScopedVpxCodec codec(new vpx_codec_ctx_t);
+ if (vpx_codec_enc_init(&codec, codec_interface, &cfg, 0)) { + if (vpx_codec_enc_init(codec.get(), codec_interface, &cfg, 0)) {
+ errorString = makeString("Failed to initialize encoder: "_s, vpx_codec_error(&codec)); + errorString = makeString("Failed to initialize encoder: "_s, vpx_codec_error(codec.get()));
+ return nullptr; + return nullptr;
+ } + }
+ +
@ -13475,7 +13487,7 @@ index 0000000000000000000000000000000000000000..489fb9a4a98de71526a6c3d6746e8b71
+ return nullptr; + return nullptr;
+ } + }
+ +
+ std::unique_ptr<VPXCodec> vpxCodec(new VPXCodec(codec, cfg, file)); + std::unique_ptr<VPXCodec> vpxCodec(new VPXCodec(WTFMove(codec), cfg, file));
+ return adoptRef(new ScreencastEncoder(WTFMove(vpxCodec), size)); + return adoptRef(new ScreencastEncoder(WTFMove(vpxCodec), size));
+} +}
+ +