blob: ede9b05d2ab0b08e7e0f68df7dbcf9f898c46a2f [file] [log] [blame]
// Copyright 2019 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef ARC_CODEC_TEST_ENCODED_DATA_HELPER_H_
#define ARC_CODEC_TEST_ENCODED_DATA_HELPER_H_
#include <memory>
#include <string>
#include <vector>
#include "arc/codec-test/common.h"
namespace android {
// Helper class for MediaCodecDecoder to read encoded stream from input file,
// and slice it into fragments. MediaCodecDecoder could call GetNextFragment()
// to obtain fragment data sequentially.
class EncodedDataHelper {
public:
EncodedDataHelper(const std::string& file_path, VideoCodecType type);
~EncodedDataHelper();
// A fragment will contain the bytes of one AU (H264) or frame (VP8/9) in
// |data|, and |csd_flag| indicator for input buffer flag CODEC_CONFIG.
struct Fragment {
std::string data;
bool csd_flag = false;
};
// Return the next fragment to be sent to the decoder, and advance the
// iterator to after the returned fragment.
const Fragment* const GetNextFragment();
void Rewind() { next_fragment_iter_ = fragments_.begin(); }
bool IsValid() const { return !fragments_.empty(); }
size_t NumValidFragments() const { return fragments_.size(); }
bool AtHeadOfStream() const;
bool ReachEndOfStream() const;
private:
// NALU type enumeration as defined in H264 Annex-B. Only interested ones are
// listed here.
enum NALUType : uint8_t {
NON_IDR_SLICE = 0x1,
IDR_SLICE = 0x5,
SPS = 0x7,
PPS = 0x8,
};
// Slice input stream into fragments. This should be done in constructor.
void SliceToFragments(const std::string& data);
// For H264, parse csd_flag from |fragment| data and store inside. Return true
// if this fragment is in interest; false otherwise (fragment will be
// discarded.)
bool ParseAUFragmentType(Fragment* fragment);
VideoCodecType type_;
std::vector<std::unique_ptr<Fragment>> fragments_;
std::vector<std::unique_ptr<Fragment>>::iterator next_fragment_iter_;
};
} // namespace android
#endif // ARC_CODEC_TEST_ENCODED_DATA_HELPER_H_