예제 #1
0
bool
mpeg_es_reader_c::read_frame(M2VParser &parser,
                             mm_io_c &in,
                             int64_t max_size) {
    auto af_buffer = memory_c::alloc(READ_SIZE);
    auto buffer    = af_buffer->get_buffer();
    int bytes_probed = 0;

    while (true) {
        auto state = parser.GetState();

        if (MPV_PARSER_STATE_FRAME == state)
            return true;

        if ((MPV_PARSER_STATE_EOS == state) || (MPV_PARSER_STATE_ERROR == state))
            return false;

        assert(MPV_PARSER_STATE_NEED_DATA == state);

        if ((max_size != -1) && (bytes_probed > max_size))
            return false;

        int bytes_read = in.read(buffer, std::min<int>(parser.GetFreeBufferSpace(), READ_SIZE));
        if (!bytes_read)
            return false;

        bytes_probed += bytes_read;

        parser.WriteData(buffer, bytes_read);
        parser.SetEOS();
    }
}
예제 #2
0
bool
mpeg_es_reader_c::read_frame(M2VParser &parser,
                             mm_io_c &in,
                             int64_t max_size) {
  int bytes_probed;

  bytes_probed = 0;
  while (true) {
    int state;

    state = parser.GetState();

    if (MPV_PARSER_STATE_NEED_DATA == state) {
      if ((max_size != -1) && (bytes_probed > max_size))
        return false;

      int bytes_to_read     = (parser.GetFreeBufferSpace() < READ_SIZE) ? parser.GetFreeBufferSpace() : READ_SIZE;
      unsigned char *buffer = new unsigned char[bytes_to_read];
      int bytes_read        = in.read(buffer, bytes_to_read);
      if (0 == bytes_read) {
        delete [] buffer;
        break;
      }
      bytes_probed += bytes_read;

      parser.WriteData(buffer, bytes_read);
      parser.SetEOS();
      delete [] buffer;

    } else if (MPV_PARSER_STATE_FRAME == state)
      return true;

    else if ((MPV_PARSER_STATE_EOS == state) || (MPV_PARSER_STATE_ERROR == state))
      return false;
  }

  return false;
}