blob: 6d349b0a13dda46c02bf4fb485f224306f74f1db [file] [log] [blame]
/*
* Copyright 2012 Google Inc. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef MEDIA_FILTERS_SHELL_PARSER_H_
#define MEDIA_FILTERS_SHELL_PARSER_H_
#include "base/memory/ref_counted.h"
#include "media/base/audio_decoder_config.h"
#include "media/base/demuxer_stream.h"
#include "media/base/pipeline.h"
#include "media/base/shell_buffer_factory.h"
#include "media/base/shell_data_source_reader.h"
#include "media/base/video_decoder_config.h"
#include "media/filters/shell_au.h"
namespace media {
// abstract base class to define a stream parser interface used by ShellDemuxer.
class ShellParser : public base::RefCountedThreadSafe<ShellParser> {
public:
static const int kInitialHeaderSize;
// Determine stream type, construct appropriate parser object, and returns
// PIPELINE_OK on success or error code.
static PipelineStatus Construct(scoped_refptr<ShellDataSourceReader> reader,
scoped_refptr<ShellParser>* parser);
explicit ShellParser(scoped_refptr<ShellDataSourceReader> reader);
// Seek through the file looking for audio and video configuration info,
// saving as much config state as is possible. Should try to be fast but this
// may result in the downloading of MB of data. Returns false on fatal error.
virtual bool ParseConfig() = 0;
// Returns a populated, valid AU indicating the needed information for
// downloding and decoding the next access unit in the stream, or NULL on
// fatal error. On success this advances the respective audio or video cursor
// to the next AU.
virtual scoped_refptr<ShellAU> GetNextAU(DemuxerStream::Type type) = 0;
// Write the appropriate prepend header for the supplied au into the supplied
// buffer. Return false on error.
virtual bool Prepend(scoped_refptr<ShellAU> au,
scoped_refptr<DecoderBuffer> buffer) = 0;
// Advance internal state to provided timestamp. Return false on error.
virtual bool SeekTo(base::TimeDelta timestamp) = 0;
// ======= config state methods, values should be set by ParseConfig()
// Returns true if all of the required variables defined below are valid.
// BitsPerSecond() is optional.
virtual bool IsConfigComplete();
// time-duration of file, may return kInfiniteDuration() if unknown
virtual base::TimeDelta Duration() { return duration_; }
// bits per second of media, if known, otherwise 0
virtual uint32 BitsPerSecond() { return bits_per_second_; }
virtual const AudioDecoderConfig& AudioConfig() { return audio_config_; }
virtual const VideoDecoderConfig& VideoConfig() { return video_config_; }
protected:
// only allow RefCountedThreadSafe to delete us
friend class base::RefCountedThreadSafe<ShellParser>;
virtual ~ShellParser();
scoped_refptr<ShellDataSourceReader> reader_;
AudioDecoderConfig audio_config_;
VideoDecoderConfig video_config_;
base::TimeDelta duration_;
uint32 bits_per_second_;
};
} // namespace media
#endif // MEDIA_FILTERS_SHELL_PARSER_H_