diff --git a/core/fpdfapi/page/cpdf_image.cpp b/core/fpdfapi/page/cpdf_image.cpp
index 322666f..156872b 100644
--- a/core/fpdfapi/page/cpdf_image.cpp
+++ b/core/fpdfapi/page/cpdf_image.cpp
@@ -24,7 +24,7 @@
 #include "core/fpdfapi/parser/cpdf_string.h"
 #include "core/fpdfapi/render/cpdf_dibbase.h"
 #include "core/fpdfapi/render/cpdf_pagerendercache.h"
-#include "core/fxcodec/codec/ccodec_jpegmodule.h"
+#include "core/fxcodec/codec/jpegmodule.h"
 #include "core/fxcodec/fx_codec.h"
 #include "core/fxcrt/fx_stream.h"
 #include "core/fxge/dib/cfx_dibitmap.h"
diff --git a/core/fpdfapi/page/cpdf_streamparser.cpp b/core/fpdfapi/page/cpdf_streamparser.cpp
index 7d790fb..c026115 100644
--- a/core/fpdfapi/page/cpdf_streamparser.cpp
+++ b/core/fpdfapi/page/cpdf_streamparser.cpp
@@ -26,8 +26,8 @@
 #include "core/fpdfapi/parser/cpdf_string.h"
 #include "core/fpdfapi/parser/fpdf_parser_decode.h"
 #include "core/fpdfapi/parser/fpdf_parser_utility.h"
-#include "core/fxcodec/codec/ccodec_jpegmodule.h"
 #include "core/fxcodec/codec/ccodec_scanlinedecoder.h"
+#include "core/fxcodec/codec/jpegmodule.h"
 #include "core/fxcodec/fx_codec.h"
 #include "core/fxcrt/fx_extension.h"
 #include "core/fxcrt/fx_safe_types.h"
diff --git a/core/fpdfapi/render/cpdf_dibbase.cpp b/core/fpdfapi/render/cpdf_dibbase.cpp
index 070a1fc..19614d0 100644
--- a/core/fpdfapi/render/cpdf_dibbase.cpp
+++ b/core/fpdfapi/render/cpdf_dibbase.cpp
@@ -25,9 +25,9 @@
 #include "core/fpdfapi/render/cpdf_renderstatus.h"
 #include "core/fxcodec/codec/ccodec_basicmodule.h"
 #include "core/fxcodec/codec/ccodec_jbig2module.h"
-#include "core/fxcodec/codec/ccodec_jpegmodule.h"
 #include "core/fxcodec/codec/ccodec_scanlinedecoder.h"
 #include "core/fxcodec/codec/cjpx_decoder.h"
+#include "core/fxcodec/codec/jpegmodule.h"
 #include "core/fxcodec/codec/jpxmodule.h"
 #include "core/fxcodec/fx_codec.h"
 #include "core/fxcrt/cfx_fixedbufgrow.h"
@@ -512,8 +512,7 @@
 
 bool CPDF_DIBBase::CreateDCTDecoder(pdfium::span<const uint8_t> src_span,
                                     const CPDF_Dictionary* pParams) {
-  CCodec_JpegModule* pJpegModule =
-      CCodec_ModuleMgr::GetInstance()->GetJpegModule();
+  JpegModule* pJpegModule = CCodec_ModuleMgr::GetInstance()->GetJpegModule();
   m_pDecoder = pJpegModule->CreateDecoder(
       src_span, m_Width, m_Height, m_nComponents,
       !pParams || pParams->GetIntegerFor("ColorTransform", 1));
diff --git a/core/fxcodec/BUILD.gn b/core/fxcodec/BUILD.gn
index 1c6b104..ccdbd3c 100644
--- a/core/fxcodec/BUILD.gn
+++ b/core/fxcodec/BUILD.gn
@@ -17,8 +17,6 @@
     "codec/ccodec_flatemodule.h",
     "codec/ccodec_jbig2module.cpp",
     "codec/ccodec_jbig2module.h",
-    "codec/ccodec_jpegmodule.cpp",
-    "codec/ccodec_jpegmodule.h",
     "codec/ccodec_scanlinedecoder.cpp",
     "codec/ccodec_scanlinedecoder.h",
     "codec/cfx_codec_memory.cpp",
@@ -30,6 +28,8 @@
     "codec/fx_codec.cpp",
     "codec/iccmodule.cpp",
     "codec/iccmodule.h",
+    "codec/jpegmodule.cpp",
+    "codec/jpegmodule.h",
     "codec/jpxmodule.cpp",
     "codec/jpxmodule.h",
     "fx_codec.h",
diff --git a/core/fxcodec/codec/ccodec_progressivedecoder.cpp b/core/fxcodec/codec/ccodec_progressivedecoder.cpp
index 01125bb..9413a95 100644
--- a/core/fxcodec/codec/ccodec_progressivedecoder.cpp
+++ b/core/fxcodec/codec/ccodec_progressivedecoder.cpp
@@ -1038,14 +1038,14 @@
 }
 #endif  // PDF_ENABLE_XFA_GIF
 
-bool CCodec_ProgressiveDecoder::JpegReadMoreData(CCodec_JpegModule* pJpegModule,
+bool CCodec_ProgressiveDecoder::JpegReadMoreData(JpegModule* pJpegModule,
                                                  FXCODEC_STATUS& err_status) {
   return ReadMoreData(pJpegModule, m_pJpegContext.get(), false, err_status);
 }
 
 bool CCodec_ProgressiveDecoder::JpegDetectImageTypeInBuffer(
     CFX_DIBAttribute* pAttribute) {
-  CCodec_JpegModule* pJpegModule = m_pCodecMgr->GetJpegModule();
+  JpegModule* pJpegModule = m_pCodecMgr->GetJpegModule();
   m_pJpegContext = pJpegModule->Start();
   if (!m_pJpegContext) {
     m_status = FXCODEC_STATUS_ERR_MEMORY;
@@ -1086,7 +1086,7 @@
 
 FXCODEC_STATUS CCodec_ProgressiveDecoder::JpegStartDecode(
     const RetainPtr<CFX_DIBitmap>& pDIBitmap) {
-  CCodec_JpegModule* pJpegModule = m_pCodecMgr->GetJpegModule();
+  JpegModule* pJpegModule = m_pCodecMgr->GetJpegModule();
   int down_scale = 1;
   GetDownScale(down_scale);
   // Setting jump marker before calling StartScanLine, since a longjmp to
@@ -1133,7 +1133,7 @@
 }
 
 FXCODEC_STATUS CCodec_ProgressiveDecoder::JpegContinueDecode() {
-  CCodec_JpegModule* pJpegModule = m_pCodecMgr->GetJpegModule();
+  JpegModule* pJpegModule = m_pCodecMgr->GetJpegModule();
   // Setting jump marker before calling ReadScanLine, since a longjmp to
   // the marker indicates a fatal error.
   if (setjmp(*pJpegModule->GetJumpMark(m_pJpegContext.get())) == -1) {
diff --git a/core/fxcodec/codec/ccodec_progressivedecoder.h b/core/fxcodec/codec/ccodec_progressivedecoder.h
index f148f4a..64c9103 100644
--- a/core/fxcodec/codec/ccodec_progressivedecoder.h
+++ b/core/fxcodec/codec/ccodec_progressivedecoder.h
@@ -11,7 +11,7 @@
 #include <utility>
 #include <vector>
 
-#include "core/fxcodec/codec/ccodec_jpegmodule.h"
+#include "core/fxcodec/codec/jpegmodule.h"
 #include "core/fxcodec/fx_codec_def.h"
 #include "core/fxcrt/fx_system.h"
 #include "core/fxcrt/retain_ptr.h"
@@ -214,8 +214,7 @@
   FXCODEC_STATUS TiffContinueDecode();
 #endif  // PDF_ENABLE_XFA_TIFF
 
-  bool JpegReadMoreData(CCodec_JpegModule* pJpegModule,
-                        FXCODEC_STATUS& err_status);
+  bool JpegReadMoreData(JpegModule* pJpegModule, FXCODEC_STATUS& err_status);
   bool JpegDetectImageTypeInBuffer(CFX_DIBAttribute* pAttribute);
   FXCODEC_STATUS JpegStartDecode(const RetainPtr<CFX_DIBitmap>& pDIBitmap);
   FXCODEC_STATUS JpegContinueDecode();
diff --git a/core/fxcodec/codec/fx_codec.cpp b/core/fxcodec/codec/fx_codec.cpp
index 0284cb5..0f6a944 100644
--- a/core/fxcodec/codec/fx_codec.cpp
+++ b/core/fxcodec/codec/fx_codec.cpp
@@ -12,8 +12,8 @@
 #include <utility>
 
 #include "core/fxcodec/codec/ccodec_jbig2module.h"
-#include "core/fxcodec/codec/ccodec_jpegmodule.h"
 #include "core/fxcodec/codec/codec_int.h"
+#include "core/fxcodec/codec/jpegmodule.h"
 #include "core/fxcrt/fx_extension.h"
 #include "core/fxcrt/fx_safe_types.h"
 #include "third_party/base/logging.h"
@@ -45,7 +45,7 @@
 }
 
 CCodec_ModuleMgr::CCodec_ModuleMgr()
-    : m_pJpegModule(pdfium::MakeUnique<CCodec_JpegModule>()),
+    : m_pJpegModule(pdfium::MakeUnique<JpegModule>()),
       m_pJbig2Module(pdfium::MakeUnique<CCodec_Jbig2Module>()) {
 #ifdef PDF_ENABLE_XFA_BMP
   SetBmpModule(pdfium::MakeUnique<BmpModule>());
diff --git a/core/fxcodec/codec/ccodec_jpegmodule.cpp b/core/fxcodec/codec/jpegmodule.cpp
similarity index 87%
rename from core/fxcodec/codec/ccodec_jpegmodule.cpp
rename to core/fxcodec/codec/jpegmodule.cpp
index 0310c95..03b1e96 100644
--- a/core/fxcodec/codec/ccodec_jpegmodule.cpp
+++ b/core/fxcodec/codec/jpegmodule.cpp
@@ -4,7 +4,7 @@
 
 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
 
-#include "core/fxcodec/codec/ccodec_jpegmodule.h"
+#include "core/fxcodec/codec/jpegmodule.h"
 
 #include <setjmp.h>
 
@@ -100,6 +100,31 @@
   return false;
 }
 #endif  // defined(OS_WIN)
+
+static void error_fatal1(j_common_ptr cinfo) {
+  auto* pContext = reinterpret_cast<CJpegContext*>(cinfo->client_data);
+  longjmp(pContext->m_JumpMark, -1);
+}
+
+static void src_skip_data1(jpeg_decompress_struct* cinfo, long num) {
+  if (cinfo->src->bytes_in_buffer < static_cast<size_t>(num)) {
+    auto* pContext = reinterpret_cast<CJpegContext*>(cinfo->client_data);
+    pContext->m_SkipSize = (unsigned int)(num - cinfo->src->bytes_in_buffer);
+    cinfo->src->bytes_in_buffer = 0;
+  } else {
+    cinfo->src->next_input_byte += num;
+    cinfo->src->bytes_in_buffer -= num;
+  }
+}
+
+static void* jpeg_alloc_func(unsigned int size) {
+  return FX_Alloc(char, size);
+}
+
+static void jpeg_free_func(void* p) {
+  FX_Free(p);
+}
+
 }  // extern "C"
 
 #ifdef PDF_ENABLE_XFA
@@ -161,10 +186,39 @@
   return true;
 }
 
-class CCodec_JpegDecoder final : public CCodec_ScanlineDecoder {
+CJpegContext::CJpegContext()
+    : m_SkipSize(0), m_AllocFunc(jpeg_alloc_func), m_FreeFunc(jpeg_free_func) {
+  memset(&m_Info, 0, sizeof(m_Info));
+  m_Info.client_data = this;
+  m_Info.err = &m_ErrMgr;
+
+  memset(&m_ErrMgr, 0, sizeof(m_ErrMgr));
+  m_ErrMgr.error_exit = error_fatal1;
+  m_ErrMgr.emit_message = error_do_nothing1;
+  m_ErrMgr.output_message = error_do_nothing;
+  m_ErrMgr.format_message = error_do_nothing2;
+  m_ErrMgr.reset_error_mgr = error_do_nothing;
+
+  memset(&m_SrcMgr, 0, sizeof(m_SrcMgr));
+  m_SrcMgr.init_source = src_do_nothing;
+  m_SrcMgr.term_source = src_do_nothing;
+  m_SrcMgr.skip_input_data = src_skip_data1;
+  m_SrcMgr.fill_input_buffer = src_fill_buffer;
+  m_SrcMgr.resync_to_restart = src_resync;
+}
+
+CJpegContext::~CJpegContext() {
+  jpeg_destroy_decompress(&m_Info);
+}
+
+namespace fxcodec {
+
+namespace {
+
+class JpegDecoder final : public CCodec_ScanlineDecoder {
  public:
-  CCodec_JpegDecoder();
-  ~CCodec_JpegDecoder() override;
+  JpegDecoder();
+  ~JpegDecoder() override;
 
   bool Create(pdfium::span<const uint8_t> src_buf,
               int width,
@@ -209,18 +263,18 @@
   uint32_t m_nDefaultScaleDenom = 1;
 };
 
-CCodec_JpegDecoder::CCodec_JpegDecoder() {
+JpegDecoder::JpegDecoder() {
   memset(&m_Cinfo, 0, sizeof(m_Cinfo));
   memset(&m_Jerr, 0, sizeof(m_Jerr));
   memset(&m_Src, 0, sizeof(m_Src));
 }
 
-CCodec_JpegDecoder::~CCodec_JpegDecoder() {
+JpegDecoder::~JpegDecoder() {
   if (m_bInited)
     jpeg_destroy_decompress(&m_Cinfo);
 }
 
-bool CCodec_JpegDecoder::InitDecode(bool bAcceptKnownBadHeader) {
+bool JpegDecoder::InitDecode(bool bAcceptKnownBadHeader) {
   m_Cinfo.err = &m_Jerr;
   m_Cinfo.client_data = &m_JmpBuf;
   if (setjmp(m_JmpBuf) == -1)
@@ -264,11 +318,11 @@
   return true;
 }
 
-bool CCodec_JpegDecoder::Create(pdfium::span<const uint8_t> src_span,
-                                int width,
-                                int height,
-                                int nComps,
-                                bool ColorTransform) {
+bool JpegDecoder::Create(pdfium::span<const uint8_t> src_span,
+                         int width,
+                         int height,
+                         int nComps,
+                         bool ColorTransform) {
   m_SrcSpan = JpegScanSOI(src_span);
   if (m_SrcSpan.size() < 2)
     return false;
@@ -305,7 +359,7 @@
   return true;
 }
 
-bool CCodec_JpegDecoder::v_Rewind() {
+bool JpegDecoder::v_Rewind() {
   if (m_bStarted) {
     jpeg_destroy_decompress(&m_Cinfo);
     if (!InitDecode(/*bAcceptKnownBadHeader=*/false)) {
@@ -330,7 +384,7 @@
   return true;
 }
 
-uint8_t* CCodec_JpegDecoder::v_GetNextLine() {
+uint8_t* JpegDecoder::v_GetNextLine() {
   if (setjmp(m_JmpBuf) == -1)
     return nullptr;
 
@@ -339,24 +393,24 @@
   return nlines > 0 ? m_pScanlineBuf.get() : nullptr;
 }
 
-uint32_t CCodec_JpegDecoder::GetSrcOffset() {
+uint32_t JpegDecoder::GetSrcOffset() {
   return static_cast<uint32_t>(m_SrcSpan.size() - m_Src.bytes_in_buffer);
 }
 
-void CCodec_JpegDecoder::CalcPitch() {
+void JpegDecoder::CalcPitch() {
   m_Pitch = static_cast<uint32_t>(m_Cinfo.image_width) * m_Cinfo.num_components;
   m_Pitch += 3;
   m_Pitch /= 4;
   m_Pitch *= 4;
 }
 
-void CCodec_JpegDecoder::InitDecompressSrc() {
+void JpegDecoder::InitDecompressSrc() {
   m_Cinfo.src = &m_Src;
   m_Src.bytes_in_buffer = m_SrcSpan.size();
   m_Src.next_input_byte = m_SrcSpan.data();
 }
 
-bool CCodec_JpegDecoder::HasKnownBadHeaderWithInvalidHeight() const {
+bool JpegDecoder::HasKnownBadHeaderWithInvalidHeight() const {
   // Perform lots of possibly redundant checks to make sure this has no false
   // positives.
   bool bDimensionChecks = m_Cinfo.err->msg_code == JERR_IMAGE_TOO_BIG &&
@@ -381,7 +435,7 @@
          pHeaderDimensions[3] == nExpectedWidthByte2;
 }
 
-void CCodec_JpegDecoder::PatchUpKnownBadHeaderWithInvalidHeight() {
+void JpegDecoder::PatchUpKnownBadHeaderWithInvalidHeight() {
   ASSERT(m_SrcSpan.size() >
          kKnownBadHeaderWithInvalidHeightByteOffsetStart + 1);
   uint8_t* pData =
@@ -390,17 +444,19 @@
   pData[1] = m_OrigHeight & 0xff;
 }
 
-void CCodec_JpegDecoder::PatchUpTrailer() {
+void JpegDecoder::PatchUpTrailer() {
   uint8_t* pData = GetWritableSrcData();
   pData[m_SrcSpan.size() - 2] = 0xff;
   pData[m_SrcSpan.size() - 1] = 0xd9;
 }
 
-uint8_t* CCodec_JpegDecoder::GetWritableSrcData() {
+uint8_t* JpegDecoder::GetWritableSrcData() {
   return const_cast<uint8_t*>(m_SrcSpan.data());
 }
 
-std::unique_ptr<CCodec_ScanlineDecoder> CCodec_JpegModule::CreateDecoder(
+}  // namespace
+
+std::unique_ptr<CCodec_ScanlineDecoder> JpegModule::CreateDecoder(
     pdfium::span<const uint8_t> src_span,
     int width,
     int height,
@@ -408,77 +464,24 @@
     bool ColorTransform) {
   ASSERT(!src_span.empty());
 
-  auto pDecoder = pdfium::MakeUnique<CCodec_JpegDecoder>();
+  auto pDecoder = pdfium::MakeUnique<JpegDecoder>();
   if (!pDecoder->Create(src_span, width, height, nComps, ColorTransform))
     return nullptr;
 
   return std::move(pDecoder);
 }
 
-bool CCodec_JpegModule::LoadInfo(pdfium::span<const uint8_t> src_span,
-                                 int* width,
-                                 int* height,
-                                 int* num_components,
-                                 int* bits_per_components,
-                                 bool* color_transform) {
+bool JpegModule::LoadInfo(pdfium::span<const uint8_t> src_span,
+                          int* width,
+                          int* height,
+                          int* num_components,
+                          int* bits_per_components,
+                          bool* color_transform) {
   return JpegLoadInfo(src_span, width, height, num_components,
                       bits_per_components, color_transform);
 }
 
-extern "C" {
-
-static void error_fatal1(j_common_ptr cinfo) {
-  auto* pContext = reinterpret_cast<CJpegContext*>(cinfo->client_data);
-  longjmp(pContext->m_JumpMark, -1);
-}
-
-static void src_skip_data1(jpeg_decompress_struct* cinfo, long num) {
-  if (cinfo->src->bytes_in_buffer < static_cast<size_t>(num)) {
-    auto* pContext = reinterpret_cast<CJpegContext*>(cinfo->client_data);
-    pContext->m_SkipSize = (unsigned int)(num - cinfo->src->bytes_in_buffer);
-    cinfo->src->bytes_in_buffer = 0;
-  } else {
-    cinfo->src->next_input_byte += num;
-    cinfo->src->bytes_in_buffer -= num;
-  }
-}
-
-static void* jpeg_alloc_func(unsigned int size) {
-  return FX_Alloc(char, size);
-}
-
-static void jpeg_free_func(void* p) {
-  FX_Free(p);
-}
-
-}  // extern "C"
-
-CJpegContext::CJpegContext()
-    : m_SkipSize(0), m_AllocFunc(jpeg_alloc_func), m_FreeFunc(jpeg_free_func) {
-  memset(&m_Info, 0, sizeof(m_Info));
-  m_Info.client_data = this;
-  m_Info.err = &m_ErrMgr;
-
-  memset(&m_ErrMgr, 0, sizeof(m_ErrMgr));
-  m_ErrMgr.error_exit = error_fatal1;
-  m_ErrMgr.emit_message = error_do_nothing1;
-  m_ErrMgr.output_message = error_do_nothing;
-  m_ErrMgr.format_message = error_do_nothing2;
-  m_ErrMgr.reset_error_mgr = error_do_nothing;
-
-  memset(&m_SrcMgr, 0, sizeof(m_SrcMgr));
-  m_SrcMgr.init_source = src_do_nothing;
-  m_SrcMgr.term_source = src_do_nothing;
-  m_SrcMgr.skip_input_data = src_skip_data1;
-  m_SrcMgr.fill_input_buffer = src_fill_buffer;
-  m_SrcMgr.resync_to_restart = src_resync;
-}
-
-CJpegContext::~CJpegContext() {
-  jpeg_destroy_decompress(&m_Info);
-}
-
-std::unique_ptr<CodecModuleIface::Context> CCodec_JpegModule::Start() {
+std::unique_ptr<CodecModuleIface::Context> JpegModule::Start() {
   // Use ordinary pointer until past the possibility of a longjump.
   auto* pContext = new CJpegContext();
   if (setjmp(pContext->m_JumpMark) == -1) {
@@ -492,9 +495,9 @@
   return pdfium::WrapUnique(pContext);
 }
 
-bool CCodec_JpegModule::Input(Context* pContext,
-                              RetainPtr<CFX_CodecMemory> codec_memory,
-                              CFX_DIBAttribute*) {
+bool JpegModule::Input(Context* pContext,
+                       RetainPtr<CFX_CodecMemory> codec_memory,
+                       CFX_DIBAttribute*) {
   pdfium::span<uint8_t> src_buf = codec_memory->GetSpan();
   auto* ctx = static_cast<CJpegContext*>(pContext);
   if (ctx->m_SkipSize) {
@@ -512,11 +515,11 @@
 }
 
 #ifdef PDF_ENABLE_XFA
-int CCodec_JpegModule::ReadHeader(Context* pContext,
-                                  int* width,
-                                  int* height,
-                                  int* nComps,
-                                  CFX_DIBAttribute* pAttribute) {
+int JpegModule::ReadHeader(Context* pContext,
+                           int* width,
+                           int* height,
+                           int* nComps,
+                           CFX_DIBAttribute* pAttribute) {
   ASSERT(pAttribute);
 
   auto* ctx = static_cast<CJpegContext*>(pContext);
@@ -534,32 +537,31 @@
 }
 #endif  // PDF_ENABLE_XFA
 
-bool CCodec_JpegModule::StartScanline(Context* pContext, int down_scale) {
+bool JpegModule::StartScanline(Context* pContext, int down_scale) {
   auto* ctx = static_cast<CJpegContext*>(pContext);
   ctx->m_Info.scale_denom = static_cast<unsigned int>(down_scale);
   return !!jpeg_start_decompress(&ctx->m_Info);
 }
 
-bool CCodec_JpegModule::ReadScanline(Context* pContext,
-                                     unsigned char* dest_buf) {
+bool JpegModule::ReadScanline(Context* pContext, unsigned char* dest_buf) {
   auto* ctx = static_cast<CJpegContext*>(pContext);
   unsigned int nlines = jpeg_read_scanlines(&ctx->m_Info, &dest_buf, 1);
   return nlines == 1;
 }
 
-FX_FILESIZE CCodec_JpegModule::GetAvailInput(Context* pContext) const {
+FX_FILESIZE JpegModule::GetAvailInput(Context* pContext) const {
   auto* ctx = static_cast<CJpegContext*>(pContext);
   return static_cast<FX_FILESIZE>(ctx->m_SrcMgr.bytes_in_buffer);
 }
 
-jmp_buf* CCodec_JpegModule::GetJumpMark(Context* pContext) {
+jmp_buf* JpegModule::GetJumpMark(Context* pContext) {
   return static_cast<CJpegContext*>(pContext)->GetJumpMark();
 }
 
 #if defined(OS_WIN)
-bool CCodec_JpegModule::JpegEncode(const RetainPtr<CFX_DIBBase>& pSource,
-                                   uint8_t** dest_buf,
-                                   size_t* dest_size) {
+bool JpegModule::JpegEncode(const RetainPtr<CFX_DIBBase>& pSource,
+                            uint8_t** dest_buf,
+                            size_t* dest_size) {
   jpeg_error_mgr jerr;
   jerr.error_exit = error_do_nothing;
   jerr.emit_message = error_do_nothing1;
@@ -658,3 +660,5 @@
   return true;
 }
 #endif  // defined(OS_WIN)
+
+}  // namespace fxcodec
diff --git a/core/fxcodec/codec/ccodec_jpegmodule.h b/core/fxcodec/codec/jpegmodule.h
similarity index 86%
rename from core/fxcodec/codec/ccodec_jpegmodule.h
rename to core/fxcodec/codec/jpegmodule.h
index e0286fc..1f3436c 100644
--- a/core/fxcodec/codec/ccodec_jpegmodule.h
+++ b/core/fxcodec/codec/jpegmodule.h
@@ -4,8 +4,8 @@
 
 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
 
-#ifndef CORE_FXCODEC_CODEC_CCODEC_JPEGMODULE_H_
-#define CORE_FXCODEC_CODEC_CCODEC_JPEGMODULE_H_
+#ifndef CORE_FXCODEC_CODEC_JPEGMODULE_H_
+#define CORE_FXCODEC_CODEC_JPEGMODULE_H_
 
 #include <csetjmp>
 #include <memory>
@@ -18,7 +18,9 @@
 class CFX_DIBAttribute;
 class CFX_DIBBase;
 
-class CCodec_JpegModule final : public CodecModuleIface {
+namespace fxcodec {
+
+class JpegModule final : public CodecModuleIface {
  public:
   std::unique_ptr<CCodec_ScanlineDecoder> CreateDecoder(
       pdfium::span<const uint8_t> src_buf,
@@ -61,4 +63,8 @@
 #endif  // defined(OS_WIN)
 };
 
-#endif  // CORE_FXCODEC_CODEC_CCODEC_JPEGMODULE_H_
+}  // namespace fxcodec
+
+using JpegModule = fxcodec::JpegModule;
+
+#endif  // CORE_FXCODEC_CODEC_JPEGMODULE_H_
diff --git a/core/fxcodec/fx_codec.h b/core/fxcodec/fx_codec.h
index 3fc46aa..60a7b91 100644
--- a/core/fxcodec/fx_codec.h
+++ b/core/fxcodec/fx_codec.h
@@ -35,7 +35,6 @@
 #endif  // PDF_ENABLE_XFA
 
 class CCodec_Jbig2Module;
-class CCodec_JpegModule;
 
 #ifdef PDF_ENABLE_XFA
 class CCodec_ProgressiveDecoder;
@@ -52,6 +51,10 @@
 };
 #endif  // PDF_ENABLE_XFA
 
+namespace fxcodec {
+class JpegModule;
+}
+
 class CCodec_ModuleMgr {
  public:
   // Per-process singleton managed by callers.
@@ -59,7 +62,7 @@
   static void Destroy();
   static CCodec_ModuleMgr* GetInstance();
 
-  CCodec_JpegModule* GetJpegModule() const { return m_pJpegModule.get(); }
+  fxcodec::JpegModule* GetJpegModule() const { return m_pJpegModule.get(); }
   CCodec_Jbig2Module* GetJbig2Module() const { return m_pJbig2Module.get(); }
 
 #ifdef PDF_ENABLE_XFA
@@ -98,7 +101,7 @@
   CCodec_ModuleMgr();
   ~CCodec_ModuleMgr();
 
-  std::unique_ptr<CCodec_JpegModule> m_pJpegModule;
+  std::unique_ptr<fxcodec::JpegModule> m_pJpegModule;
   std::unique_ptr<CCodec_Jbig2Module> m_pJbig2Module;
 
 #ifdef PDF_ENABLE_XFA
diff --git a/fpdfsdk/fpdf_view.cpp b/fpdfsdk/fpdf_view.cpp
index 76a590e..fe5cbb7 100644
--- a/fpdfsdk/fpdf_view.cpp
+++ b/fpdfsdk/fpdf_view.cpp
@@ -56,7 +56,7 @@
 #include "core/fxcodec/codec/ccodec_basicmodule.h"
 #include "core/fxcodec/codec/ccodec_faxmodule.h"
 #include "core/fxcodec/codec/ccodec_flatemodule.h"
-#include "core/fxcodec/codec/ccodec_jpegmodule.h"
+#include "core/fxcodec/codec/jpegmodule.h"
 #include "core/fxge/cfx_windowsrenderdevice.h"
 #include "core/fxge/win32/cfx_psrenderer.h"
 #include "public/fpdf_edit.h"
@@ -85,7 +85,7 @@
 #if defined(OS_WIN)
 constexpr EncoderIface kEncoderIface = {
     CCodec_BasicModule::A85Encode, CCodec_FaxModule::FaxEncode,
-    CCodec_FlateModule::Encode, CCodec_JpegModule::JpegEncode,
+    CCodec_FlateModule::Encode, JpegModule::JpegEncode,
     CCodec_BasicModule::RunLengthEncode};
 #endif  // defined(OS_WIN)
 
