From ffca21f2743a7b367fa212799c6e2fea6190dd5d Mon Sep 17 00:00:00 2001 From: manuel Date: Tue, 3 Mar 2015 16:53:59 +0100 Subject: initial commit for kodi master --- xbmc/cores/dvdplayer/DVDDemuxers/DVDDemux.h | 359 ++++++++++++++++++++++++++++ 1 file changed, 359 insertions(+) create mode 100644 xbmc/cores/dvdplayer/DVDDemuxers/DVDDemux.h (limited to 'xbmc/cores/dvdplayer/DVDDemuxers/DVDDemux.h') diff --git a/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemux.h b/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemux.h new file mode 100644 index 0000000..fca164d --- /dev/null +++ b/xbmc/cores/dvdplayer/DVDDemuxers/DVDDemux.h @@ -0,0 +1,359 @@ +#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) {}; +}; -- cgit v1.2.3