#pragma once
/*
* Copyright (C) 2005-2013 Team XBMC
* http://xbmc.org
*
* This Program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2, or (at your option)
* any later version.
*
* 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 XBMC; see the file COPYING. If not, see
* .
*
*/
#include
#include "system.h"
#include "DVDDemuxPacket.h"
class CDVDInputStream;
#ifndef __GNUC__
#pragma warning(push)
#pragma warning(disable:4244)
#endif
#if (defined HAVE_CONFIG_H) && (!defined TARGET_WINDOWS)
#include "config.h"
#endif
extern "C" {
#include "libavcodec/avcodec.h"
}
#ifndef __GNUC__
#pragma warning(pop)
#endif
enum AVDiscard;
enum StreamType
{
STREAM_NONE = 0,// if unknown
STREAM_AUDIO, // audio stream
STREAM_VIDEO, // video stream
STREAM_DATA, // data stream
STREAM_SUBTITLE,// subtitle stream
STREAM_TELETEXT // Teletext data stream
};
enum StreamSource {
STREAM_SOURCE_NONE = 0x000,
STREAM_SOURCE_DEMUX = 0x100,
STREAM_SOURCE_NAV = 0x200,
STREAM_SOURCE_DEMUX_SUB = 0x300,
STREAM_SOURCE_TEXT = 0x400,
STREAM_SOURCE_VIDEOMUX = 0x500
};
#define STREAM_SOURCE_MASK(a) ((a) & 0xf00)
/*
* CDemuxStream
* Base class for all demuxer streams
*/
class CDemuxStream
{
public:
CDemuxStream()
{
iId = 0;
iPhysicalId = 0;
codec = (AVCodecID)0; // AV_CODEC_ID_NONE
codec_fourcc = 0;
profile = FF_PROFILE_UNKNOWN;
level = FF_LEVEL_UNKNOWN;
type = STREAM_NONE;
source = STREAM_SOURCE_NONE;
iDuration = 0;
pPrivate = NULL;
ExtraData = NULL;
ExtraSize = 0;
memset(language, 0, sizeof(language));
disabled = false;
changes = 0;
flags = FLAG_NONE;
orig_type = 0;
}
virtual ~CDemuxStream()
{
delete [] ExtraData;
}
virtual void GetStreamInfo(std::string& strInfo)
{
strInfo = "";
}
virtual void GetStreamName(std::string& strInfo);
virtual void SetDiscard(AVDiscard discard);
virtual AVDiscard GetDiscard();
int iId; // most of the time starting from 0
int iPhysicalId; // id
AVCodecID codec;
unsigned int codec_fourcc; // if available
int profile; // encoder profile of the stream reported by the decoder. used to qualify hw decoders.
int level; // encoder level of the stream reported by the decoder. used to qualify hw decoders.
StreamType type;
int source;
int iDuration; // in mseconds
void* pPrivate; // private pointer for the demuxer
uint8_t* ExtraData; // extra data for codec to use
unsigned int ExtraSize; // size of extra data
char language[4]; // ISO 639 3-letter language code (empty string if undefined)
bool disabled; // set when stream is disabled. (when no decoder exists)
int changes; // increment on change which player may need to know about
int orig_type; // type of original source
enum EFlags
{ FLAG_NONE = 0x0000
, FLAG_DEFAULT = 0x0001
, FLAG_DUB = 0x0002
, FLAG_ORIGINAL = 0x0004
, FLAG_COMMENT = 0x0008
, FLAG_LYRICS = 0x0010
, FLAG_KARAOKE = 0x0020
, FLAG_FORCED = 0x0040
, FLAG_HEARING_IMPAIRED = 0x0080
, FLAG_VISUAL_IMPAIRED = 0x0100
} flags;
};
class CDemuxStreamVideo : public CDemuxStream
{
public:
CDemuxStreamVideo() : CDemuxStream()
{
iFpsScale = 0;
iFpsRate = 0;
irFpsScale = 0;
irFpsRate = 0;
iHeight = 0;
iWidth = 0;
fAspect = 0.0;
bVFR = false;
bPTSInvalid = false;
bForcedAspect = false;
type = STREAM_VIDEO;
iOrientation = 0;
iBitsPerPixel = 0;
}
virtual ~CDemuxStreamVideo() {}
int iFpsScale; // scale of 1000 and a rate of 29970 will result in 29.97 fps
int iFpsRate;
int irFpsScale;
int irFpsRate;
int iHeight; // height of the stream reported by the demuxer
int iWidth; // width of the stream reported by the demuxer
float fAspect; // display aspect of stream
bool bVFR; // variable framerate
bool bPTSInvalid; // pts cannot be trusted (avi's).
bool bForcedAspect; // aspect is forced from container
int iOrientation; // orientation of the video in degress counter clockwise
int iBitsPerPixel;
std::string stereo_mode; // expected stereo mode
};
class CDemuxStreamAudio : public CDemuxStream
{
public:
CDemuxStreamAudio() : CDemuxStream()
{
iChannels = 0;
iSampleRate = 0;
iBlockAlign = 0;
iBitRate = 0;
iBitsPerSample = 0;
type = STREAM_AUDIO;
}
virtual ~CDemuxStreamAudio() {}
void GetStreamType(std::string& strInfo);
int iChannels;
int iSampleRate;
int iBlockAlign;
int iBitRate;
int iBitsPerSample;
};
class CDemuxStreamSubtitle : public CDemuxStream
{
public:
CDemuxStreamSubtitle() : CDemuxStream()
{
type = STREAM_SUBTITLE;
}
};
class CDemuxStreamTeletext : public CDemuxStream
{
public:
CDemuxStreamTeletext() : CDemuxStream()
{
type = STREAM_TELETEXT;
}
virtual void GetStreamInfo(std::string& strInfo);
};
class CDVDDemux
{
public:
CDVDDemux() {}
virtual ~CDVDDemux() {}
/*
* Reset the entire demuxer (same result as closing and opening it)
*/
virtual void Reset() = 0;
/*
* Aborts any internal reading that might be stalling main thread
* NOTICE - this can be called from another thread
*/
virtual void Abort() = 0;
/*
* Flush the demuxer, if any data is kept in buffers, this should be freed now
*/
virtual void Flush() = 0;
/*
* Read a packet, returns NULL on error
*
*/
virtual DemuxPacket* Read() = 0;
/*
* Seek, time in msec calculated from stream start
*/
virtual bool SeekTime(int time, bool backwords = false, double* startpts = NULL) = 0;
/*
* Seek to a specified chapter.
* startpts can be updated to the point where display should start
*/
virtual bool SeekChapter(int chapter, double* startpts = NULL) { return false; }
/*
* Get the number of chapters available
*/
virtual int GetChapterCount() { return 0; }
/*
* Get current chapter
*/
virtual int GetChapter() { return 0; }
/*
* Get the name of a chapter
* \param strChapterName[out] Name of chapter
* \param chapterIdx -1 for current chapter, else a chapter index
*/
virtual void GetChapterName(std::string& strChapterName, int chapterIdx=-1) {}
/*
* Get the position of a chapter
* \param chapterIdx -1 for current chapter, else a chapter index
*/
virtual int64_t GetChapterPos(int chapterIdx=-1) { return 0; }
/*
* Set the playspeed, if demuxer can handle different
* speeds of playback
*/
virtual void SetSpeed(int iSpeed) = 0;
/*
* returns the total time in msec
*/
virtual int GetStreamLength() = 0;
/*
* returns the stream or NULL on error, starting from 0
*/
virtual CDemuxStream* GetStream(int iStreamId) = 0;
/*
* return nr of streams, 0 if none
*/
virtual int GetNrOfStreams() = 0;
/*
* returns opened filename
*/
virtual std::string GetFileName() = 0;
/*
* return nr of audio streams, 0 if none
*/
int GetNrOfAudioStreams();
/*
* return nr of video streams, 0 if none
*/
int GetNrOfVideoStreams();
/*
* return nr of subtitle streams, 0 if none
*/
int GetNrOfSubtitleStreams();
/*
* return nr of teletext streams, 0 if none
*/
int GetNrOfTeletextStreams();
/*
* return the audio stream, or NULL if it does not exist
*/
CDemuxStreamAudio* GetStreamFromAudioId(int iAudioIndex);
/*
* return the video stream, or NULL if it does not exist
*/
CDemuxStreamVideo* GetStreamFromVideoId(int iVideoIndex);
/*
* return the subtitle stream, or NULL if it does not exist
*/
CDemuxStreamSubtitle* GetStreamFromSubtitleId(int iSubtitleIndex);
/*
* return the teletext stream, or NULL if it does not exist
*/
CDemuxStreamTeletext* GetStreamFromTeletextId(int iTeletextIndex);
/*
* return a user-presentable codec name of the given stream
*/
virtual void GetStreamCodecName(int iStreamId, std::string &strName) {};
};