diff --git a/test/coding_path_sync.cc b/test/coding_path_sync.cc
index d6e1d1d..175f1ee 100644
--- a/test/coding_path_sync.cc
+++ b/test/coding_path_sync.cc
@@ -26,9 +26,9 @@
 using libaom_test::ACMRandom;
 namespace {
 
-struct CompressedSource {
-  explicit CompressedSource(int seed) : rnd_(seed) {
-    frame_count_ = 0;
+class CompressedSource {
+ public:
+  explicit CompressedSource(int seed) : rnd_(seed), frame_count_(0) {
     aom_codec_iface_t *algo = &aom_codec_av1_cx_algo;
 
     aom_codec_enc_cfg_t cfg;
@@ -39,8 +39,8 @@
     cfg.rc_end_usage = AOM_CQ;
     cfg.rc_max_quantizer = max_q;
     cfg.rc_min_quantizer = max_q;
-    cfg.g_w = WIDTH;
-    cfg.g_h = HEIGHT;
+    cfg.g_w = kWidth;
+    cfg.g_h = kHeight;
     cfg.g_lag_in_frames = 0;
 
     aom_codec_enc_init(&enc_, algo, &cfg, 0);
@@ -48,8 +48,8 @@
 
   ~CompressedSource() { aom_codec_destroy(&enc_); }
 
-  const aom_codec_cx_pkt_t *readFrame() {
-    uint8_t buf[WIDTH * HEIGHT * 3 / 2] = { 0 };
+  const aom_codec_cx_pkt_t *ReadFrame() {
+    uint8_t buf[kWidth * kHeight * 3 / 2] = { 0 };
 
     // render regular pattern
     const int period = rnd_.Rand8() % 32 + 1;
@@ -57,11 +57,12 @@
 
     const int val_a = rnd_.Rand8();
     const int val_b = rnd_.Rand8();
+
     for (int i = 0; i < (int)sizeof buf; ++i)
       buf[i] = (i + phase) % period < period / 2 ? val_a : val_b;
 
     aom_image_t img;
-    aom_img_wrap(&img, AOM_IMG_FMT_I420, WIDTH, HEIGHT, 0, buf);
+    aom_img_wrap(&img, AOM_IMG_FMT_I420, kWidth, kHeight, 0, buf);
     aom_codec_encode(&enc_, &img, frame_count_++, 1, 0, 0);
 
     aom_codec_iter_t iter = NULL;
@@ -69,24 +70,25 @@
   }
 
  private:
+  static const int kWidth = 32;
+  static const int kHeight = 32;
+
   ACMRandom rnd_;
   aom_codec_ctx_t enc_;
   int frame_count_;
-  static const int WIDTH = 32;
-  static const int HEIGHT = 32;
 };
 
 // lowers an aom_image_t to a easily comparable/printable form
-std::vector<int16_t> serialize(const aom_image_t *img) {
+std::vector<int16_t> Serialize(const aom_image_t *img) {
   const int w_uv = ROUND_POWER_OF_TWO(img->d_w, img->x_chroma_shift);
   const int h_uv = ROUND_POWER_OF_TWO(img->d_h, img->y_chroma_shift);
-  const int w[] = { (int)img->d_w, w_uv, w_uv };
-  const int h[] = { (int)img->d_h, h_uv, h_uv };
+  const int w[] = { static_cast<int>(img->d_w), w_uv, w_uv };
+  const int h[] = { static_cast<int>(img->d_h), h_uv, h_uv };
 
   std::vector<int16_t> bytes;
   bytes.reserve(img->d_w * img->d_h * 3);
-  for (int plane = 0; plane < 3; ++plane)
-    for (int r = 0; r < h[plane]; ++r)
+  for (int plane = 0; plane < 3; ++plane) {
+    for (int r = 0; r < h[plane]; ++r) {
       for (int c = 0; c < w[plane]; ++c) {
         const int offset = r * img->stride[plane] + c;
         if (img->fmt & AOM_IMG_FMT_HIGHBITDEPTH)
@@ -94,11 +96,14 @@
         else
           bytes.push_back(img->planes[plane][offset]);
       }
+    }
+  }
 
   return bytes;
 }
 
-struct Decoder {
+class Decoder {
+ public:
   explicit Decoder(int allowLowbitdepth) {
     aom_codec_iface_t *algo = &aom_codec_av1_dx_algo;
 
@@ -111,11 +116,11 @@
   ~Decoder() { aom_codec_destroy(&dec_); }
 
   std::vector<int16_t> decode(const aom_codec_cx_pkt_t *pkt) {
-    aom_codec_decode(&dec_, (uint8_t *)pkt->data.frame.buf,
-                     (unsigned int)pkt->data.frame.sz, NULL, 0);
+    aom_codec_decode(&dec_, static_cast<uint8_t *>(pkt->data.frame.buf),
+                     static_cast<unsigned int>(pkt->data.frame.sz), NULL, 0);
 
     aom_codec_iter_t iter = NULL;
-    return serialize(aom_codec_get_frame(&dec_, &iter));
+    return Serialize(aom_codec_get_frame(&dec_, &iter));
   }
 
  private:
@@ -126,22 +131,22 @@
 TEST(CodingPathSync, SearchForHbdLbdMismatch) {
   const int count_tests = 100;
   for (int i = 0; i < count_tests; ++i) {
-    Decoder dec_HBD(0);
-    Decoder dec_LBD(1);
+    Decoder dec_hbd(0);
+    Decoder dec_lbd(1);
 
     CompressedSource enc(i);
-    const aom_codec_cx_pkt_t *frame = enc.readFrame();
+    const aom_codec_cx_pkt_t *frame = enc.ReadFrame();
     // disable the comparison for now.
     // Re-enable it locally to help diagnosing LBD/HBD mismatches,
     // and re-enable for everybody when both coding paths match,
     // so they don't diverge anymore.
     if (0) {
-      ASSERT_EQ(dec_LBD.decode(frame), dec_HBD.decode(frame));
+      ASSERT_EQ(dec_lbd.decode(frame), dec_hbd.decode(frame));
     } else {
       // until the comparison is re-enabled, keep doing the decoding,
       // as it still detects decoder crashes (Issue 677)
-      dec_LBD.decode(frame);
-      dec_HBD.decode(frame);
+      dec_lbd.decode(frame);
+      dec_hbd.decode(frame);
     }
   }
 }
