forked from xbmc/xbmc
-
Notifications
You must be signed in to change notification settings - Fork 24
/
DVDDemuxFFmpeg.h
193 lines (161 loc) · 5.1 KB
/
DVDDemuxFFmpeg.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
#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
* <http://www.gnu.org/licenses/>.
*
*/
#include "DVDDemux.h"
#include "threads/CriticalSection.h"
#include "threads/SystemClock.h"
#include <map>
#include <vector>
#include <queue>
extern "C" {
#include "libavformat/avformat.h"
}
class CDVDDemuxFFmpeg;
class CURL;
class CDemuxStreamVideoFFmpeg
: public CDemuxStreamVideo
{
CDVDDemuxFFmpeg *m_parent;
AVStream* m_stream;
public:
CDemuxStreamVideoFFmpeg(CDVDDemuxFFmpeg *parent, AVStream* stream)
: m_parent(parent)
, m_stream(stream)
{}
std::string m_description;
virtual std::string GetStreamInfo() override;
virtual std::string GetStreamName() override;
};
class CDemuxStreamVideoFFmpegSSIF
: public CDemuxStreamVideo
{
CDVDDemuxFFmpeg *m_parent;
AVStream* m_mvcStream;
AVStream* m_h264Stream;
public:
CDemuxStreamVideoFFmpegSSIF(CDVDDemuxFFmpeg *parent, AVStream* mvc)
: m_parent(parent)
, m_mvcStream(mvc)
{}
};
class CDemuxStreamAudioFFmpeg
: public CDemuxStreamAudio
{
CDVDDemuxFFmpeg *m_parent;
AVStream* m_stream;
public:
CDemuxStreamAudioFFmpeg(CDVDDemuxFFmpeg *parent, AVStream* stream)
: m_parent(parent)
, m_stream(stream)
{}
std::string m_description;
virtual std::string GetStreamInfo() override;
virtual std::string GetStreamName() override;
};
class CDemuxStreamSubtitleFFmpeg
: public CDemuxStreamSubtitle
{
CDVDDemuxFFmpeg *m_parent;
AVStream* m_stream;
public:
CDemuxStreamSubtitleFFmpeg(CDVDDemuxFFmpeg *parent, AVStream* stream)
: m_parent(parent)
, m_stream(stream)
{}
std::string m_description;
virtual std::string GetStreamInfo() override;
virtual std::string GetStreamName() override;
};
#define FFMPEG_DVDNAV_BUFFER_SIZE 2048 // for dvd's
struct StereoModeConversionMap;
class CDVDDemuxFFmpeg : public CDVDDemux
{
public:
CDVDDemuxFFmpeg();
virtual ~CDVDDemuxFFmpeg();
bool Open(CDVDInputStream* pInput, bool streaminfo = true, bool fileinfo = false);
void Dispose();
void Reset();
void Flush();
void Abort();
void SetSpeed(int iSpeed);
virtual std::string GetFileName();
DemuxPacket* Read();
bool SeekTime(int time, bool backwords = false, double* startpts = NULL);
bool SeekByte(int64_t pos);
int GetStreamLength();
CDemuxStream* GetStream(int iStreamId);
int GetNrOfStreams();
bool SeekChapter(int chapter, double* startpts = NULL);
int GetChapterCount();
int GetChapter();
void GetChapterName(std::string& strChapterName, int chapterIdx=-1);
int64_t GetChapterPos(int chapterIdx=-1);
virtual std::string GetStreamCodecName(int iStreamId) override;
bool Aborted();
AVFormatContext* m_pFormatContext;
CDVDInputStream* m_pInput;
protected:
friend class CDemuxStreamAudioFFmpeg;
friend class CDemuxStreamVideoFFmpeg;
friend class CDemuxStreamSubtitleFFmpeg;
int ReadFrame(AVPacket *packet);
CDemuxStream* AddStream(int iId);
void AddStream(int iId, CDemuxStream* stream);
CDemuxStream* GetStreamInternal(int iStreamId);
void CreateStreams(unsigned int program = UINT_MAX);
void DisposeStreams();
void ParsePacket(AVPacket *pkt);
bool IsVideoReady();
void ResetVideoStreams();
DemuxPacket* GetMVCPacket();
AVDictionary *GetFFMpegOptionsFromURL(const CURL &url);
double ConvertTimestamp(int64_t pts, int den, int num);
void UpdateCurrentPTS();
bool IsProgramChange();
std::string GetStereoModeFromMetadata(AVDictionary *pMetadata);
std::string ConvertCodecToInternalStereoMode(const std::string &mode, const StereoModeConversionMap *conversionMap);
void GetL16Parameters(int &channels, int &samplerate);
double SelectAspect(AVStream* st, bool& forced);
CCriticalSection m_critSection;
std::map<int, CDemuxStream*> m_streams;
std::vector<std::map<int, CDemuxStream*>::iterator> m_stream_index;
AVIOContext* m_ioContext;
double m_currentPts; // used for stream length estimation
bool m_bMatroska;
bool m_bAVI;
bool m_bSSIF;
bool m_bSSIFSyncing;
std::queue<DemuxPacket*> m_H264queue;
std::queue<DemuxPacket*> m_MVCqueue;
int m_speed;
unsigned m_program;
XbmcThreads::EndTime m_timeout;
// Due to limitations of ffmpeg, we only can detect a program change
// with a packet. This struct saves the packet for the next read and
// signals STREAMCHANGE to player
struct
{
AVPacket pkt; // packet ffmpeg returned
int result; // result from av_read_packet
}m_pkt;
bool m_streaminfo;
bool m_checkvideo;
};