code: def _read(self) -> Iterator[Dict]:
      num_frames = int(len(self._reader))
      if self._predicate:
          range_list = extract_range_list_from_predicate(
              self._predicate, 0, num_frames - 1
          )
      else:
          range_list = [(0, num_frames - 1)]
      logger.debug("Reading frames")
  
      if self._sampling_type == IFRAMES:
          iframes = self._reader.get_key_indices()
          idx = 0
          for begin, end in range_list:
              while idx < len(iframes) and iframes[idx] < begin:
                  idx += self._sampling_rate
  
              while idx < len(iframes) and iframes[idx] <= end:
                  frame_id = iframes[idx]
                  idx += self._sampling_rate
                  yield self._get_frame(frame_id)
  
      elif self._sampling_rate == 1 or self._read_audio:
          for begin, end in range_list:
              frame_id = begin
              while frame_id <= end:
                  yield self._get_frame(frame_id)
                  frame_id += 1
      else:
          for begin, end in range_list:
              # align begin with sampling rate
              if begin % self._sampling_rate:
                  begin += self._sampling_rate - (
                      begin % self._sampling_rate
                  )
              for frame_id in range(
                  begin, end + 1, self._sampling_rate
              ):
                  yield self._get_frame(frame_id)
  
file_path: evadb/evadb/readers/decord_reader.py
imports: from typing import Dict, Iterator
  import numpy
  from evadb.catalog.catalog_type import VideoColumnName
  from evadb.catalog.sql_config import ROW_NUM_COLUMN
  from evadb.constants import AUDIORATE, IFRAMES
  from evadb.expression.abstract_expression import AbstractExpression
  from evadb.expression.expression_utils import extract_range_list_from_predicate
  from evadb.readers.abstract_reader import AbstractReader
  from evadb.utils.generic_utils import try_to_import_decord
  from evadb.utils.logging_manager import logger
label_desc: Use image node_id 2 for calling the DecordReader obj's underlying member method code with example usage: obj._read() without return types