| Index: media/tools/omx_test/file_reader_util.cc
|
| diff --git a/media/tools/omx_test/file_reader_util.cc b/media/tools/omx_test/file_reader_util.cc
|
| deleted file mode 100644
|
| index a599d2f1e88845e0712216deb6d8dde1243f2749..0000000000000000000000000000000000000000
|
| --- a/media/tools/omx_test/file_reader_util.cc
|
| +++ /dev/null
|
| @@ -1,296 +0,0 @@
|
| -// Copyright (c) 2010 The Chromium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -#include "media/tools/omx_test/file_reader_util.h"
|
| -
|
| -#include <stdio.h>
|
| -#include <string>
|
| -
|
| -#include "base/file_util.h"
|
| -#include "base/logging.h"
|
| -#include "base/string_util.h"
|
| -#include "media/ffmpeg/ffmpeg_common.h"
|
| -#include "media/ffmpeg/file_protocol.h"
|
| -#include "media/filters/bitstream_converter.h"
|
| -#include "media/tools/omx_test/color_space_util.h"
|
| -
|
| -namespace media {
|
| -
|
| -//////////////////////////////////////////////////////////////////////////////
|
| -// BasicFileReader
|
| -BasicFileReader::BasicFileReader(const FilePath& path)
|
| - : path_(path),
|
| - file_(NULL) {
|
| -}
|
| -
|
| -bool BasicFileReader::Initialize() {
|
| - file_.Set(file_util::OpenFile(path_, "rb"));
|
| - if (!file_.get()) {
|
| - LOG(ERROR) << "unable to open " << path_.value();
|
| - }
|
| - return file_.get() != NULL;
|
| -}
|
| -
|
| -//////////////////////////////////////////////////////////////////////////////
|
| -// YuvFileReader
|
| -YuvFileReader::YuvFileReader(const FilePath& path,
|
| - int width,
|
| - int height,
|
| - int loop_count,
|
| - bool enable_csc)
|
| - : BasicFileReader(path),
|
| - width_(width),
|
| - height_(height),
|
| - loop_count_(loop_count),
|
| - output_nv21_(enable_csc) {
|
| -}
|
| -
|
| -YuvFileReader::~YuvFileReader() {}
|
| -
|
| -void YuvFileReader::Read(uint8** output, int* size) {
|
| - if (!file()) {
|
| - *size = 0;
|
| - *output = NULL;
|
| - return;
|
| - }
|
| -
|
| - while (true) {
|
| - scoped_array<uint8> data;
|
| - int bytes_read = 0;
|
| -
|
| - // OMX require encoder input are delivered in frames (or planes).
|
| - // Assume the input file is I420 YUV file.
|
| - const int kFrameSize = width_ * height_ * 3 / 2;
|
| - data.reset(new uint8[kFrameSize]);
|
| -
|
| - if (output_nv21_) {
|
| - if (!csc_buf_.get())
|
| - csc_buf_.reset(new uint8[kFrameSize]);
|
| - bytes_read = fread(csc_buf_.get(), 1, kFrameSize, file());
|
| -
|
| - // We do not convert partial frames.
|
| - if (bytes_read == kFrameSize)
|
| - IYUVtoNV21(csc_buf_.get(), data.get(), width_, height_);
|
| - else
|
| - bytes_read = 0; // force cleanup or loop around.
|
| - } else {
|
| - bytes_read = fread(data.get(), 1, kFrameSize, file());
|
| - }
|
| -
|
| - if (bytes_read) {
|
| - *size = bytes_read;
|
| - *output = data.release();
|
| - break;
|
| - }
|
| -
|
| - // Encounter the end of file.
|
| - if (loop_count_ == 1) {
|
| - // Signal end of stream.
|
| - *size = 0;
|
| - *output = data.release();
|
| - }
|
| -
|
| - --loop_count_;
|
| - fseek(file(), 0, SEEK_SET);
|
| - }
|
| -}
|
| -
|
| -//////////////////////////////////////////////////////////////////////////////
|
| -// BlockFileReader
|
| -BlockFileReader::BlockFileReader(const FilePath& path,
|
| - int block_size)
|
| - : BasicFileReader(path),
|
| - block_size_(block_size) {
|
| -}
|
| -
|
| -void BlockFileReader::Read(uint8** output, int* size) {
|
| - CHECK(file());
|
| - *output = new uint8[block_size_];
|
| - *size = fread(*output, 1, block_size_, file());
|
| -}
|
| -
|
| -//////////////////////////////////////////////////////////////////////////////
|
| -// FFmpegFileReader
|
| -FFmpegFileReader::FFmpegFileReader(const FilePath& path)
|
| - : path_(path),
|
| - format_context_(NULL),
|
| - codec_context_(NULL),
|
| - target_stream_(-1),
|
| - converter_(NULL) {
|
| -}
|
| -
|
| -FFmpegFileReader::~FFmpegFileReader() {
|
| - if (format_context_)
|
| - av_close_input_file(format_context_);
|
| -}
|
| -
|
| -bool FFmpegFileReader::Initialize() {
|
| - // av_open_input_file wants a char*, which can't work with wide paths.
|
| - // So we assume ASCII on Windows. On other platforms we can pass the
|
| - // path bytes through verbatim.
|
| -#if defined(OS_WIN)
|
| - std::string string_path = WideToASCII(path_.value());
|
| -#else
|
| - const std::string& string_path = path_.value();
|
| -#endif
|
| - int result = av_open_input_file(&format_context_, string_path.c_str(),
|
| - NULL, 0, NULL);
|
| - if (result < 0) {
|
| - switch (result) {
|
| - case AVERROR_NOFMT:
|
| - LOG(ERROR) << "Error: File format not supported "
|
| - << path_.value() << std::endl;
|
| - break;
|
| - default:
|
| - LOG(ERROR) << "Error: Could not open input for "
|
| - << path_.value() << std::endl;
|
| - break;
|
| - }
|
| - return false;
|
| - }
|
| - if (av_find_stream_info(format_context_) < 0) {
|
| - LOG(ERROR) << "can't use FFmpeg to parse stream info";
|
| - return false;
|
| - }
|
| -
|
| - for (size_t i = 0; i < format_context_->nb_streams; ++i) {
|
| - codec_context_ = format_context_->streams[i]->codec;
|
| -
|
| - // Find the video stream.
|
| - if (codec_context_->codec_type == CODEC_TYPE_VIDEO) {
|
| - target_stream_ = i;
|
| - break;
|
| - }
|
| - }
|
| - if (target_stream_ == -1) {
|
| - LOG(ERROR) << "no video in the stream";
|
| - return false;
|
| - }
|
| -
|
| - // Initialize the bitstream filter if needed.
|
| - // TODO(hclam): find a better way to identify mp4 container.
|
| - if (codec_context_->codec_id == CODEC_ID_H264) {
|
| - converter_.reset(new media::FFmpegBitstreamConverter(
|
| - "h264_mp4toannexb", codec_context_));
|
| - } else if (codec_context_->codec_id == CODEC_ID_MPEG4) {
|
| - converter_.reset(new media::FFmpegBitstreamConverter(
|
| - "mpeg4video_es", codec_context_));
|
| - } else if (codec_context_->codec_id == CODEC_ID_WMV3) {
|
| - converter_.reset(new media::FFmpegBitstreamConverter(
|
| - "vc1_asftorcv", codec_context_));
|
| - } else if (codec_context_->codec_id == CODEC_ID_VC1) {
|
| - converter_.reset(new media::FFmpegBitstreamConverter(
|
| - "vc1_asftoannexg", codec_context_));
|
| - }
|
| -
|
| - if (converter_.get() && !converter_->Initialize()) {
|
| - converter_.reset();
|
| - LOG(ERROR) << "failed to initialize h264_mp4toannexb filter";
|
| - return false;
|
| - }
|
| - return true;
|
| -}
|
| -
|
| -void FFmpegFileReader::Read(uint8** output, int* size) {
|
| - if (!format_context_ || !codec_context_ || target_stream_ == -1) {
|
| - *size = 0;
|
| - *output = NULL;
|
| - return;
|
| - }
|
| -
|
| - AVPacket packet;
|
| - bool found = false;
|
| - while (!found) {
|
| - int result = av_read_frame(format_context_, &packet);
|
| - if (result < 0) {
|
| - *output = NULL;
|
| - *size = 0;
|
| - return;
|
| - }
|
| - if (packet.stream_index == target_stream_) {
|
| - if (converter_.get() && !converter_->ConvertPacket(&packet)) {
|
| - LOG(ERROR) << "failed to convert AVPacket";
|
| - }
|
| - *output = new uint8[packet.size];
|
| - *size = packet.size;
|
| - memcpy(*output, packet.data, packet.size);
|
| - found = true;
|
| - }
|
| - av_free_packet(&packet);
|
| - }
|
| -}
|
| -
|
| -//////////////////////////////////////////////////////////////////////////////
|
| -// H264FileReader
|
| -const int kH264ReadSize = 1024 * 1024;
|
| -
|
| -H264FileReader::H264FileReader(const FilePath& path)
|
| - : BasicFileReader(path),
|
| - read_buf_(new uint8[kH264ReadSize]),
|
| - current_(0),
|
| - used_(0) {
|
| -}
|
| -
|
| -H264FileReader::~H264FileReader() {}
|
| -
|
| -void H264FileReader::Read(uint8** output, int *size) {
|
| - // Fill the buffer when it's less than half full.
|
| - int read = 0;
|
| - if (used_ < kH264ReadSize / 2) {
|
| - read = fread(read_buf_.get(), 1, kH264ReadSize - used_, file());
|
| - CHECK(read >= 0);
|
| - used_ += read;
|
| - }
|
| -
|
| - // If we failed to read.
|
| - if (current_ == used_) {
|
| - *output = NULL;
|
| - *size = 0;
|
| - return;
|
| - }
|
| -
|
| - // Try to find start code of 0x00, 0x00, 0x01.
|
| - bool found = false;
|
| - int pos = current_ + 3;
|
| - for (; pos < used_ - 2; ++pos) {
|
| - if (read_buf_[pos] == 0 &&
|
| - read_buf_[pos+1] == 0 &&
|
| - read_buf_[pos+2] == 1) {
|
| - found = true;
|
| - break;
|
| - }
|
| - }
|
| -
|
| - // If next NALU is found.
|
| - if (found) {
|
| - CHECK(pos > current_);
|
| - *size = pos - current_;
|
| - *output = new uint8[*size];
|
| - memcpy(*output, read_buf_.get() + current_, *size);
|
| - current_ = pos;
|
| -
|
| - // If we have used_ more than half of the available buffer.
|
| - // Then move the unused_ buffer to the front to give space
|
| - // for more incoming output.
|
| - if (current_ > used_ / 2) {
|
| - CHECK(used_ > current_);
|
| - memcpy(read_buf_.get(),
|
| - read_buf_.get() + current_,
|
| - used_ - current_);
|
| - used_ = used_ - current_;
|
| - current_ = 0;
|
| - }
|
| - return;
|
| - }
|
| -
|
| - // If next NALU is not found, assume the remaining data is a NALU
|
| - // and return the data.
|
| - CHECK(used_ > current_);
|
| - *size = used_ - current_;
|
| - *output = new uint8[*size];
|
| - memcpy(*output, read_buf_.get() + current_, *size);
|
| - current_ = used_;
|
| -}
|
| -
|
| -} // namespace media
|
|
|