// Copyright 2012 The Cobalt Authors. 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/progressive/progressive_parser.h"

#include "base/logging.h"
#include "cobalt/media/progressive/mp4_parser.h"
#include "third_party/chromium/media/base/timestamp_constants.h"

namespace cobalt {
namespace media {

// ==== ProgressiveParser
// ============================================================

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

// static
::media::PipelineStatus ProgressiveParser::Construct(
    scoped_refptr<DataSourceReader> reader,
    scoped_refptr<ProgressiveParser>* parser, 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 ::media::DEMUXER_ERROR_COULD_NOT_PARSE;
  }

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

ProgressiveParser::ProgressiveParser(scoped_refptr<DataSourceReader> reader)
    : reader_(reader),
      duration_(::media::kInfiniteDuration),
      bits_per_second_(0) {}

ProgressiveParser::~ProgressiveParser() {}

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

}  // namespace media
}  // namespace cobalt
