mirror of
https://github.com/tuxbox-neutrino/libstb-hal.git
synced 2025-08-26 23:13:16 +02:00
libeplayer3: cleanup AVFormatContext propagation to writers
This commit is contained in:
@@ -44,13 +44,12 @@ struct Track
|
|||||||
{
|
{
|
||||||
std::string title;
|
std::string title;
|
||||||
int pid;
|
int pid;
|
||||||
AVFormatContext *avfc;
|
|
||||||
AVStream *stream;
|
AVStream *stream;
|
||||||
bool inactive;
|
bool inactive;
|
||||||
bool is_static;
|
bool is_static;
|
||||||
int ac3flags;
|
int ac3flags;
|
||||||
int type, mag, page; // for teletext
|
int type, mag, page; // for teletext
|
||||||
Track() : pid(-1), avfc(NULL), stream(NULL), inactive(0), is_static(0), ac3flags(0) {}
|
Track() : pid(-1), stream(NULL), inactive(0), is_static(0), ac3flags(0) {}
|
||||||
};
|
};
|
||||||
|
|
||||||
class Manager
|
class Manager
|
||||||
|
@@ -74,7 +74,7 @@ class Output
|
|||||||
bool GetFrameCount(int64_t &framecount);
|
bool GetFrameCount(int64_t &framecount);
|
||||||
bool SwitchAudio(AVStream *stream);
|
bool SwitchAudio(AVStream *stream);
|
||||||
bool SwitchVideo(AVStream *stream);
|
bool SwitchVideo(AVStream *stream);
|
||||||
bool Write(AVFormatContext *avfc, AVStream *stream, AVPacket *packet, int64_t Pts);
|
bool Write(AVStream *stream, AVPacket *packet, int64_t Pts);
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@@ -47,6 +47,6 @@ class Writer
|
|||||||
static Writer *GetWriter(enum AVCodecID id, enum AVMediaType codec_type);
|
static Writer *GetWriter(enum AVCodecID id, enum AVMediaType codec_type);
|
||||||
|
|
||||||
virtual void Init(void) { }
|
virtual void Init(void) { }
|
||||||
virtual bool Write(int fd, AVFormatContext *avfc, AVStream *stream, AVPacket *packet, int64_t pts);
|
virtual bool Write(int fd, AVStream *stream, AVPacket *packet, int64_t pts);
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
@@ -149,7 +149,7 @@ bool Input::Play()
|
|||||||
seek_target = INT64_MIN;
|
seek_target = INT64_MIN;
|
||||||
restart_audio_resampling = true;
|
restart_audio_resampling = true;
|
||||||
|
|
||||||
// flush streams
|
// clear streams
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
for (i = 0; i < avfc->nb_streams; i++)
|
for (i = 0; i < avfc->nb_streams; i++)
|
||||||
if (avfc->streams[i]->codec && avfc->streams[i]->codec->codec)
|
if (avfc->streams[i]->codec && avfc->streams[i]->codec->codec)
|
||||||
@@ -179,7 +179,7 @@ bool Input::Play()
|
|||||||
|
|
||||||
if (_videoTrack && (_videoTrack->stream == stream)) {
|
if (_videoTrack && (_videoTrack->stream == stream)) {
|
||||||
int64_t pts = calcPts(stream, packet.pts);
|
int64_t pts = calcPts(stream, packet.pts);
|
||||||
if (!player->output.Write(avfc, stream, &packet, pts)) {
|
if (!player->output.Write(stream, &packet, pts)) {
|
||||||
if (warnVideoWrite)
|
if (warnVideoWrite)
|
||||||
warnVideoWrite--;
|
warnVideoWrite--;
|
||||||
else {
|
else {
|
||||||
@@ -190,11 +190,11 @@ bool Input::Play()
|
|||||||
} else if (_audioTrack && (_audioTrack->stream == stream)) {
|
} else if (_audioTrack && (_audioTrack->stream == stream)) {
|
||||||
if (restart_audio_resampling) {
|
if (restart_audio_resampling) {
|
||||||
restart_audio_resampling = false;
|
restart_audio_resampling = false;
|
||||||
player->output.Write(avfc, stream, NULL, 0);
|
player->output.Write(stream, NULL, 0);
|
||||||
}
|
}
|
||||||
if (!player->isBackWard) {
|
if (!player->isBackWard) {
|
||||||
int64_t pts = calcPts(stream, packet.pts);
|
int64_t pts = calcPts(stream, packet.pts);
|
||||||
if (!player->output.Write(avfc, stream, &packet, _videoTrack ? pts : 0)) {
|
if (!player->output.Write(stream, &packet, _videoTrack ? pts : 0)) {
|
||||||
if (warnAudioWrite)
|
if (warnAudioWrite)
|
||||||
warnAudioWrite--;
|
warnAudioWrite--;
|
||||||
else {
|
else {
|
||||||
@@ -246,7 +246,7 @@ bool Input::Play()
|
|||||||
AVPacket packet;
|
AVPacket packet;
|
||||||
packet.data = NULL;
|
packet.data = NULL;
|
||||||
packet.size = 0;
|
packet.size = 0;
|
||||||
player->output.Write(avfc, _audioTrack->stream, &packet, 0);
|
player->output.Write(_audioTrack->stream, &packet, 0);
|
||||||
}
|
}
|
||||||
player->output.Flush();
|
player->output.Flush();
|
||||||
}
|
}
|
||||||
@@ -314,9 +314,6 @@ bool Input::ReadSubtitle(const char *filename, const char *format, int pid)
|
|||||||
AVPacket packet;
|
AVPacket packet;
|
||||||
av_init_packet(&packet);
|
av_init_packet(&packet);
|
||||||
|
|
||||||
if (c->subtitle_header)
|
|
||||||
fprintf(stderr, "%s\n", c->subtitle_header);
|
|
||||||
|
|
||||||
while (av_read_frame(subavfc, &packet) > -1) {
|
while (av_read_frame(subavfc, &packet) > -1) {
|
||||||
AVSubtitle sub;
|
AVSubtitle sub;
|
||||||
memset(&sub, 0, sizeof(sub));
|
memset(&sub, 0, sizeof(sub));
|
||||||
@@ -441,7 +438,6 @@ bool Input::UpdateTracks()
|
|||||||
stream->id = n + 1;
|
stream->id = n + 1;
|
||||||
|
|
||||||
Track track;
|
Track track;
|
||||||
track.avfc = avfc;
|
|
||||||
track.stream = stream;
|
track.stream = stream;
|
||||||
AVDictionaryEntry *lang = av_dict_get(stream->metadata, "language", NULL, 0);
|
AVDictionaryEntry *lang = av_dict_get(stream->metadata, "language", NULL, 0);
|
||||||
track.title = lang ? lang->value : "";
|
track.title = lang ? lang->value : "";
|
||||||
|
@@ -331,16 +331,16 @@ bool Output::SwitchVideo(AVStream *stream)
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Output::Write(AVFormatContext *avfc, AVStream *stream, AVPacket *packet, int64_t pts)
|
bool Output::Write(AVStream *stream, AVPacket *packet, int64_t pts)
|
||||||
{
|
{
|
||||||
switch (stream->codec->codec_type) {
|
switch (stream->codec->codec_type) {
|
||||||
case AVMEDIA_TYPE_VIDEO: {
|
case AVMEDIA_TYPE_VIDEO: {
|
||||||
OpenThreads::ScopedLock<OpenThreads::Mutex> v_lock(videoMutex);
|
OpenThreads::ScopedLock<OpenThreads::Mutex> v_lock(videoMutex);
|
||||||
return videofd > -1 && videoWriter && videoWriter->Write(videofd, avfc, stream, packet, pts);
|
return videofd > -1 && videoWriter && videoWriter->Write(videofd, stream, packet, pts);
|
||||||
}
|
}
|
||||||
case AVMEDIA_TYPE_AUDIO: {
|
case AVMEDIA_TYPE_AUDIO: {
|
||||||
OpenThreads::ScopedLock<OpenThreads::Mutex> a_lock(audioMutex);
|
OpenThreads::ScopedLock<OpenThreads::Mutex> a_lock(audioMutex);
|
||||||
return audiofd > -1 && audioWriter && audioWriter->Write(audiofd, avfc, stream, packet, pts);
|
return audiofd > -1 && audioWriter && audioWriter->Write(audiofd, stream, packet, pts);
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
return false;
|
return false;
|
||||||
|
@@ -35,11 +35,11 @@
|
|||||||
class WriterAC3 : public Writer
|
class WriterAC3 : public Writer
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
bool Write(int fd, AVFormatContext *avfc, AVStream *stream, AVPacket *packet, int64_t pts);
|
bool Write(int fd, AVStream *stream, AVPacket *packet, int64_t pts);
|
||||||
WriterAC3();
|
WriterAC3();
|
||||||
};
|
};
|
||||||
|
|
||||||
bool WriterAC3::Write(int fd, AVFormatContext * /* avfc */, AVStream * /* stream */, AVPacket *packet, int64_t pts)
|
bool WriterAC3::Write(int fd, AVStream * /* stream */, AVPacket *packet, int64_t pts)
|
||||||
{
|
{
|
||||||
if (fd < 0 || !packet || !packet->data)
|
if (fd < 0 || !packet || !packet->data)
|
||||||
return false;
|
return false;
|
||||||
|
@@ -38,7 +38,7 @@ class WriterDIVX : public Writer
|
|||||||
private:
|
private:
|
||||||
bool initialHeader;
|
bool initialHeader;
|
||||||
public:
|
public:
|
||||||
bool Write(int fd, AVFormatContext *avfc, AVStream *stream, AVPacket *packet, int64_t pts);
|
bool Write(int fd, AVStream *stream, AVPacket *packet, int64_t pts);
|
||||||
void Init();
|
void Init();
|
||||||
WriterDIVX();
|
WriterDIVX();
|
||||||
};
|
};
|
||||||
@@ -48,7 +48,7 @@ void WriterDIVX::Init()
|
|||||||
initialHeader = true;
|
initialHeader = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool WriterDIVX::Write(int fd, AVFormatContext * /* avfc */, AVStream *stream, AVPacket *packet, int64_t pts)
|
bool WriterDIVX::Write(int fd, AVStream *stream, AVPacket *packet, int64_t pts)
|
||||||
{
|
{
|
||||||
if (fd < 0 || !packet || !packet->data)
|
if (fd < 0 || !packet || !packet->data)
|
||||||
return false;
|
return false;
|
||||||
|
@@ -36,11 +36,11 @@
|
|||||||
class WriterDTS : public Writer
|
class WriterDTS : public Writer
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
bool Write(int fd, AVFormatContext *avfc, AVStream *stream, AVPacket *packet, int64_t pts);
|
bool Write(int fd, AVStream *stream, AVPacket *packet, int64_t pts);
|
||||||
WriterDTS();
|
WriterDTS();
|
||||||
};
|
};
|
||||||
|
|
||||||
bool WriterDTS::Write(int fd, AVFormatContext * /* avfc */, AVStream * /* stream */, AVPacket *packet, int64_t pts)
|
bool WriterDTS::Write(int fd, AVStream * /* stream */, AVPacket *packet, int64_t pts)
|
||||||
{
|
{
|
||||||
if (fd < 0 || !packet || !packet->data)
|
if (fd < 0 || !packet || !packet->data)
|
||||||
return false;
|
return false;
|
||||||
|
@@ -32,11 +32,11 @@
|
|||||||
class WriterH263 : public Writer
|
class WriterH263 : public Writer
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
bool Write(int fd, AVFormatContext *avfc, AVStream *stream, AVPacket *packet, int64_t pts);
|
bool Write(int fd, AVStream *stream, AVPacket *packet, int64_t pts);
|
||||||
WriterH263();
|
WriterH263();
|
||||||
};
|
};
|
||||||
|
|
||||||
bool WriterH263::Write(int fd, AVFormatContext * /* avfc */, AVStream * /* stream */, AVPacket *packet, int64_t pts)
|
bool WriterH263::Write(int fd, AVStream * /* stream */, AVPacket *packet, int64_t pts)
|
||||||
{
|
{
|
||||||
if (fd < 0 || !packet || !packet->data)
|
if (fd < 0 || !packet || !packet->data)
|
||||||
return false;
|
return false;
|
||||||
|
@@ -53,7 +53,7 @@ class WriterH264 : public Writer
|
|||||||
bool initialHeader;
|
bool initialHeader;
|
||||||
unsigned int NalLengthBytes;
|
unsigned int NalLengthBytes;
|
||||||
public:
|
public:
|
||||||
bool Write(int fd, AVFormatContext *avfc, AVStream *stream, AVPacket *packet, int64_t pts);
|
bool Write(int fd, AVStream *stream, AVPacket *packet, int64_t pts);
|
||||||
void Init();
|
void Init();
|
||||||
WriterH264();
|
WriterH264();
|
||||||
};
|
};
|
||||||
@@ -64,7 +64,7 @@ void WriterH264::Init(void)
|
|||||||
NalLengthBytes = 1;
|
NalLengthBytes = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool WriterH264::Write(int fd, AVFormatContext * /* avfc */, AVStream *stream, AVPacket *packet, int64_t pts)
|
bool WriterH264::Write(int fd, AVStream *stream, AVPacket *packet, int64_t pts)
|
||||||
{
|
{
|
||||||
if (fd < 0 || !packet || !packet->data)
|
if (fd < 0 || !packet || !packet->data)
|
||||||
return false;
|
return false;
|
||||||
|
@@ -35,11 +35,11 @@
|
|||||||
class WriterMP3 : public Writer
|
class WriterMP3 : public Writer
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
bool Write(int fd, AVFormatContext *avfc, AVStream *stream, AVPacket *packet, int64_t pts);
|
bool Write(int fd, AVStream *stream, AVPacket *packet, int64_t pts);
|
||||||
WriterMP3();
|
WriterMP3();
|
||||||
};
|
};
|
||||||
|
|
||||||
bool WriterMP3::Write(int fd, AVFormatContext * /* avfc */, AVStream * /* stream */, AVPacket *packet, int64_t pts)
|
bool WriterMP3::Write(int fd, AVStream * /* stream */, AVPacket *packet, int64_t pts)
|
||||||
{
|
{
|
||||||
if (fd < 0 || !packet || !packet->data)
|
if (fd < 0 || !packet || !packet->data)
|
||||||
return false;
|
return false;
|
||||||
|
@@ -35,11 +35,11 @@
|
|||||||
class WriterMPEG2 : public Writer
|
class WriterMPEG2 : public Writer
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
bool Write(int fd, AVFormatContext *avfc, AVStream *stream, AVPacket *packet, int64_t pts);
|
bool Write(int fd, AVStream *stream, AVPacket *packet, int64_t pts);
|
||||||
WriterMPEG2();
|
WriterMPEG2();
|
||||||
};
|
};
|
||||||
|
|
||||||
bool WriterMPEG2::Write(int fd, AVFormatContext * /* avfc */, AVStream * /* stream */, AVPacket *packet, int64_t pts)
|
bool WriterMPEG2::Write(int fd, AVStream * /* stream */, AVPacket *packet, int64_t pts)
|
||||||
{
|
{
|
||||||
if (fd < 0 || !packet || !packet->data)
|
if (fd < 0 || !packet || !packet->data)
|
||||||
return false;
|
return false;
|
||||||
|
@@ -80,7 +80,7 @@ class WriterPCM : public Writer
|
|||||||
bool restart_audio_resampling;
|
bool restart_audio_resampling;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
bool Write(int fd, AVFormatContext *avfc, AVStream *stream, AVPacket *packet, int64_t pts);
|
bool Write(int fd, AVStream *stream, AVPacket *packet, int64_t pts);
|
||||||
bool prepareClipPlay();
|
bool prepareClipPlay();
|
||||||
bool writePCM(int fd, int64_t Pts, uint8_t *data, unsigned int size);
|
bool writePCM(int fd, int64_t Pts, uint8_t *data, unsigned int size);
|
||||||
void Init();
|
void Init();
|
||||||
@@ -225,7 +225,7 @@ void WriterPCM::Init()
|
|||||||
restart_audio_resampling = true;
|
restart_audio_resampling = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool WriterPCM::Write(int fd, AVFormatContext * /*avfc*/, AVStream *stream, AVPacket *packet, int64_t pts)
|
bool WriterPCM::Write(int fd, AVStream *stream, AVPacket *packet, int64_t pts)
|
||||||
{
|
{
|
||||||
if (fd < 0)
|
if (fd < 0)
|
||||||
return false;
|
return false;
|
||||||
|
@@ -51,7 +51,7 @@ class WriterVC1 : public Writer
|
|||||||
bool initialHeader;
|
bool initialHeader;
|
||||||
uint8_t FrameHeaderSeen;
|
uint8_t FrameHeaderSeen;
|
||||||
public:
|
public:
|
||||||
bool Write(int fd, AVFormatContext *avfc, AVStream *stream, AVPacket *packet, int64_t pts);
|
bool Write(int fd, AVStream *stream, AVPacket *packet, int64_t pts);
|
||||||
void Init();
|
void Init();
|
||||||
WriterVC1();
|
WriterVC1();
|
||||||
};
|
};
|
||||||
@@ -61,7 +61,7 @@ void WriterVC1::Init()
|
|||||||
initialHeader = true;
|
initialHeader = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool WriterVC1::Write(int fd, AVFormatContext * /* avfc */, AVStream *stream, AVPacket *packet, int64_t pts)
|
bool WriterVC1::Write(int fd, AVStream *stream, AVPacket *packet, int64_t pts)
|
||||||
{
|
{
|
||||||
if (fd < 0 || !packet || !packet->data)
|
if (fd < 0 || !packet || !packet->data)
|
||||||
return false;
|
return false;
|
||||||
|
@@ -58,7 +58,7 @@ class WriterWMV : public Writer
|
|||||||
private:
|
private:
|
||||||
bool initialHeader;
|
bool initialHeader;
|
||||||
public:
|
public:
|
||||||
bool Write(int fd, AVFormatContext *avfc, AVStream *stream, AVPacket *packet, int64_t pts);
|
bool Write(int fd, AVStream *stream, AVPacket *packet, int64_t pts);
|
||||||
void Init();
|
void Init();
|
||||||
WriterWMV();
|
WriterWMV();
|
||||||
};
|
};
|
||||||
@@ -68,7 +68,7 @@ void WriterWMV::Init()
|
|||||||
initialHeader = true;
|
initialHeader = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool WriterWMV::Write(int fd, AVFormatContext * /* avfc */, AVStream *stream, AVPacket *packet, int64_t pts)
|
bool WriterWMV::Write(int fd, AVStream *stream, AVPacket *packet, int64_t pts)
|
||||||
{
|
{
|
||||||
if (fd < 0 || !packet || !packet->data)
|
if (fd < 0 || !packet || !packet->data)
|
||||||
return false;
|
return false;
|
||||||
|
@@ -58,7 +58,7 @@ void Writer::Register(Writer *w, enum AVCodecID id, audio_encoding_t encoding)
|
|||||||
aencoding[id] = encoding;
|
aencoding[id] = encoding;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Writer::Write(int /* fd */, AVFormatContext * /* avfc */, AVStream * /*stream*/, AVPacket * /* packet */, int64_t /* pts */)
|
bool Writer::Write(int /* fd */, AVStream * /*stream*/, AVPacket * /* packet */, int64_t /* pts */)
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user