diff --git a/rtc_tools/frame_analyzer/linear_least_squares.cc b/rtc_tools/frame_analyzer/linear_least_squares.cc
index 32cb481..93a6f90 100644
--- a/rtc_tools/frame_analyzer/linear_least_squares.cc
+++ b/rtc_tools/frame_analyzer/linear_least_squares.cc
@@ -100,16 +100,16 @@
   return result;
 }
 
-// Returns |matrix_to_invert|^-1 * |right_hand_matrix|. |matrix_to_invert| must
+// Returns `matrix_to_invert`^-1 * `right_hand_matrix`. `matrix_to_invert` must
 // have square size.
 Matrix<double> GaussianElimination(Matrix<double> matrix_to_invert,
                                    Matrix<double> right_hand_matrix) {
-  // |n| is the width/height of |matrix_to_invert|.
+  // `n` is the width/height of `matrix_to_invert`.
   const size_t n = matrix_to_invert.size();
-  // Make sure |matrix_to_invert| has square size.
+  // Make sure `matrix_to_invert` has square size.
   for (const std::valarray<double>& column : matrix_to_invert)
     RTC_CHECK_EQ(n, column.size());
-  // Make sure |right_hand_matrix| has correct size.
+  // Make sure `right_hand_matrix` has correct size.
   for (const std::valarray<double>& column : right_hand_matrix)
     RTC_CHECK_EQ(n, column.size());
 
@@ -119,10 +119,10 @@
   matrix_to_invert = Transpose(matrix_to_invert);
   right_hand_matrix = Transpose(right_hand_matrix);
 
-  // Loop over the diagonal of |matrix_to_invert| and perform column reduction.
+  // Loop over the diagonal of `matrix_to_invert` and perform column reduction.
   // Column reduction is a sequence of elementary column operations that is
-  // performed on both |matrix_to_invert| and |right_hand_matrix| until
-  // |matrix_to_invert| has been transformed to the identity matrix.
+  // performed on both `matrix_to_invert` and `right_hand_matrix` until
+  // `matrix_to_invert` has been transformed to the identity matrix.
   for (size_t diagonal_index = 0; diagonal_index < n; ++diagonal_index) {
     // Make sure the diagonal element has the highest absolute value by
     // swapping columns if necessary.
@@ -146,7 +146,7 @@
     matrix_to_invert[diagonal_index] /= diagonal_element;
     right_hand_matrix[diagonal_index] /= diagonal_element;
 
-    // Eliminate the other entries in row |diagonal_index| by making them zero.
+    // Eliminate the other entries in row `diagonal_index` by making them zero.
     for (size_t column = 0; column < n; ++column) {
       if (column == diagonal_index)
         continue;
diff --git a/rtc_tools/frame_analyzer/video_temporal_aligner.h b/rtc_tools/frame_analyzer/video_temporal_aligner.h
index 21baff2..26a4088 100644
--- a/rtc_tools/frame_analyzer/video_temporal_aligner.h
+++ b/rtc_tools/frame_analyzer/video_temporal_aligner.h
@@ -32,7 +32,7 @@
     const rtc::scoped_refptr<Video>& test_video);
 
 // Generate a new video using the frames from the original video. The returned
-// video will have the same number of frames as the size of |indices|, and
+// video will have the same number of frames as the size of `indices`, and
 // frame nr i in the returned video will point to frame nr indices[i] in the
 // original video.
 rtc::scoped_refptr<Video> ReorderVideo(const rtc::scoped_refptr<Video>& video,
diff --git a/rtc_tools/rtc_event_log_visualizer/analyzer.cc b/rtc_tools/rtc_event_log_visualizer/analyzer.cc
index 0f727f2..30340d1 100644
--- a/rtc_tools/rtc_event_log_visualizer/analyzer.cc
+++ b/rtc_tools/rtc_event_log_visualizer/analyzer.cc
@@ -88,10 +88,10 @@
   return abs_send_time * kTimestampToMicroSec;
 }
 
-// Computes the difference |later| - |earlier| where |later| and |earlier|
-// are counters that wrap at |modulus|. The difference is chosen to have the
-// least absolute value. For example if |modulus| is 8, then the difference will
-// be chosen in the range [-3, 4]. If |modulus| is 9, then the difference will
+// Computes the difference `later` - `earlier` where `later` and `earlier`
+// are counters that wrap at `modulus`. The difference is chosen to have the
+// least absolute value. For example if `modulus` is 8, then the difference will
+// be chosen in the range [-3, 4]. If `modulus` is 9, then the difference will
 // be in [-4, 4].
 int64_t WrappingDifference(uint32_t later, uint32_t earlier, int64_t modulus) {
   RTC_DCHECK_LE(1, modulus);
diff --git a/rtc_tools/rtc_event_log_visualizer/analyzer_common.h b/rtc_tools/rtc_event_log_visualizer/analyzer_common.h
index d5776ac..a4305a7 100644
--- a/rtc_tools/rtc_event_log_visualizer/analyzer_common.h
+++ b/rtc_tools/rtc_event_log_visualizer/analyzer_common.h
@@ -39,8 +39,8 @@
   float CallEndTimeSec() const { return GetCallTimeSec(end_time_); }
 
   // Window and step size used for calculating moving averages, e.g. bitrate.
-  // The generated data points will be |step_| microseconds apart.
-  // Only events occurring at most |window_duration_| microseconds before the
+  // The generated data points will be `step_` microseconds apart.
+  // Only events occurring at most `window_duration_` microseconds before the
   // current data point will be part of the average.
   int64_t window_duration_;
   int64_t step_;
@@ -83,7 +83,7 @@
                           uint32_t ssrc);
 std::string GetLayerName(LayerDescription layer);
 
-// For each element in data_view, use |f()| to extract a y-coordinate and
+// For each element in data_view, use `f()` to extract a y-coordinate and
 // store the result in a TimeSeries.
 template <typename DataType, typename IterableType>
 void ProcessPoints(rtc::FunctionView<float(const DataType&)> fx,
@@ -99,7 +99,7 @@
   }
 }
 
-// For each pair of adjacent elements in |data|, use |f()| to extract a
+// For each pair of adjacent elements in `data`, use `f()` to extract a
 // y-coordinate and store the result in a TimeSeries. Note that the x-coordinate
 // will be the time of the second element in the pair.
 template <typename DataType, typename ResultType, typename IterableType>
@@ -117,7 +117,7 @@
   }
 }
 
-// For each pair of adjacent elements in |data|, use |f()| to extract a
+// For each pair of adjacent elements in `data`, use `f()` to extract a
 // y-coordinate and store the result in a TimeSeries. Note that the x-coordinate
 // will be the time of the second element in the pair.
 template <typename DataType, typename ResultType, typename IterableType>
@@ -138,10 +138,10 @@
   }
 }
 
-// Calculates a moving average of |data| and stores the result in a TimeSeries.
-// A data point is generated every |step| microseconds from |begin_time|
-// to |end_time|. The value of each data point is the average of the data
-// during the preceding |window_duration_us| microseconds.
+// Calculates a moving average of `data` and stores the result in a TimeSeries.
+// A data point is generated every `step` microseconds from `begin_time`
+// to `end_time`. The value of each data point is the average of the data
+// during the preceding `window_duration_us` microseconds.
 template <typename DataType, typename ResultType, typename IterableType>
 void MovingAverage(
     rtc::FunctionView<absl::optional<ResultType>(const DataType&)> fy,
diff --git a/rtc_tools/unpack_aecdump/unpack.cc b/rtc_tools/unpack_aecdump/unpack.cc
index 4a98349..0850e75 100644
--- a/rtc_tools/unpack_aecdump/unpack.cc
+++ b/rtc_tools/unpack_aecdump/unpack.cc
@@ -147,7 +147,7 @@
     return is_exporter_for_(event);
   }
 
-  // Writes to file the payload of |event| using |frame_count| to calculate
+  // Writes to file the payload of `event` using `frame_count` to calculate
   // timestamp.
   void WriteEvent(const Event& event, int frame_count) {
     RTC_DCHECK(is_exporter_for_(event));
@@ -165,7 +165,7 @@
   }
 
   // Handles an AEC dump initialization event, occurring at frame
-  // |frame_offset|.
+  // `frame_offset`.
   void HandleInitEvent(int frame_offset) {
     Flush();
     frame_offset_ = frame_offset;
