/*
 *  inptstrm.hh:  Input stream classes for MPEG multiplexing
 *  TODO: Split into the base classes and the different types of
 *  actual input stream.
 *
 *  Copyright (C) 2001 Andrew Stevens <andrew.stevens@philips.com>
 *
 *
 *  This program is free software; you can redistribute it and/or
 *  modify it under the terms of version 2 of the GNU General Public License
 *  as published by the Free Software Foundation.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 */

#ifndef __AUDIOSTRM_H__
#define __AUDIOSTRM_H__

#include "inputstrm.hh"

class AudioStream:public ElementaryStream
{
public:
  AudioStream (IBitStream & ibs, OutputStream & into);
  virtual void Init (const int stream_num) = 0;
  virtual void Close () = 0;

  void OutputSector ();
  bool RunOutComplete ();
  virtual unsigned int NominalBitRate () = 0;

  unsigned int num_syncword;
  unsigned int num_frames[2];
  unsigned int size_frames[2];
  unsigned int version_id;
  unsigned int layer;
  unsigned int protection;
  unsigned int bit_rate_code;
  unsigned int frequency;
  unsigned int mode;
  unsigned int mode_extension;
  unsigned int copyright;
  unsigned int original_copy;
  unsigned int emphasis;

protected:
    virtual bool AUBufferNeedsRefill ();
  virtual void FillAUbuffer (unsigned int frames_to_buffer) = 0;
  void InitAUbuffer ();

  /* State variables for scanning source bit-stream */
  unsigned int framesize;
  unsigned int skip;
  unsigned int samples_per_second;
  unsigned long long int length_sum;
  AAunit access_unit;
};

class MPAStream:public AudioStream
{
public:
  MPAStream (IBitStream & ibs, OutputStream & into);
  virtual void Init (const int stream_num);
  static bool Probe (IBitStream & bs);
  virtual void Close ();
  virtual unsigned int NominalBitRate ();


private:
  void OutputHdrInfo ();
  unsigned int SizeFrame (int bit_rate, int padding_bit);
  virtual void FillAUbuffer (unsigned int frames_to_buffer);


  /* State variables for scanning source bit-stream */
  unsigned int framesize;
  unsigned int skip;
  unsigned int samples_per_second;
};



class AC3Stream:public AudioStream
{
public:
  AC3Stream (IBitStream & ibs, OutputStream & into);
  virtual void Init (const int stream_num);
  static bool Probe (IBitStream & bs);
  virtual void Close ();
  virtual unsigned int NominalBitRate ();

  virtual unsigned int ReadPacketPayload (uint8_t * dst, unsigned int to_read);
  virtual unsigned int StreamHeaderSize ()
  {
    return 4;
  }


private:
  void OutputHdrInfo ();
  virtual void FillAUbuffer (unsigned int frames_to_buffer);

  static const unsigned int default_buffer_size = 16 * 1024;

  /* State variables for scanning source bit-stream */
  unsigned int framesize;
  unsigned int samples_per_second;
  unsigned int bit_rate;
  unsigned int stream_num;
};

class LPCMStream:public AudioStream
{
public:
  LPCMStream (IBitStream & ibs, OutputStream & into);
  virtual void Init (const int stream_num);
  static bool Probe (IBitStream & bs);
  virtual void Close ();
  virtual unsigned int NominalBitRate ();

  virtual unsigned int ReadPacketPayload (uint8_t * dst, unsigned int to_read);
  virtual unsigned int StreamHeaderSize ()
  {
    return 7;
  }


private:
  void OutputHdrInfo ();
  virtual void FillAUbuffer (unsigned int frames_to_buffer);

  static const unsigned int default_buffer_size = 232 * 1024;
  static const unsigned int ticks_per_frame_90kHz = 150;

  /* State variables for scanning source bit-stream */
  unsigned int stream_num;
  unsigned int samples_per_second;
  unsigned int channels;
  unsigned int bits_per_sample;
  unsigned int bytes_per_frame;
  unsigned int frame_index;
  unsigned int dynamic_range_code;
};


#endif // __AUDIOSTRM_H__


/* 
 * Local variables:
 *  c-file-style: "stroustrup"
 *  tab-width: 4
 *  indent-tabs-mode: nil
 * End:
 */