// 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.

#include "cobalt/media/filters/shell_parser.h"

#include "base/logging.h"
#include "cobalt/media/base/timestamp_constants.h"
#include "cobalt/media/filters/shell_mp4_parser.h"

namespace cobalt {
namespace media {

// ==== ShellParser ============================================================

// how many bytes to download of the file to determine type?
const int ShellParser::kInitialHeaderSize = 9;

// static
PipelineStatus ShellParser::Construct(
    scoped_refptr<ShellDataSourceReader> reader,
    scoped_refptr<ShellParser>* parser,
    const scoped_refptr<MediaLog>& media_log) {
  DCHECK(parser);
  DCHECK(media_log);
  *parser = NULL;

  // download first 16 bytes of stream to determine file type and extract basic
  // container-specific stream configuration information
  uint8 header[kInitialHeaderSize];
  int bytes_read = reader->BlockingRead(0, kInitialHeaderSize, header);
  if (bytes_read != kInitialHeaderSize) {
    return DEMUXER_ERROR_COULD_NOT_PARSE;
  }

  // attempt to construct mp4 parser from this header
  return ShellMP4Parser::Construct(reader, header, parser, media_log);
}

ShellParser::ShellParser(scoped_refptr<ShellDataSourceReader> reader)
    : reader_(reader), duration_(kInfiniteDuration), bits_per_second_(0) {}

ShellParser::~ShellParser() {}

bool ShellParser::IsConfigComplete() {
  return video_config_.IsValidConfig() && audio_config_.IsValidConfig() &&
         duration_ != kInfiniteDuration;
}

}  // namespace media
}  // namespace cobalt
