mirror of
https://github.com/tuxbox-fork-migrations/recycled-ni-libstb-hal.git
synced 2025-08-26 23:12:44 +02:00
Merge remote-tracking branch 'martiis-libstb-hal/master'
Origin commit data
------------------
Branch: master
Commit: 03dfbc9cac
Author: max_10 <max_10@gmx.de>
Date: 2014-05-03 (Sat, 03 May 2014)
------------------
No further description and justification available within origin commit message!
------------------
This commit was generated by Migit
This commit is contained in:
@@ -44,14 +44,12 @@ struct Track
|
|||||||
{
|
{
|
||||||
std::string title;
|
std::string title;
|
||||||
int pid;
|
int pid;
|
||||||
int64_t duration;
|
|
||||||
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), duration(-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
|
||||||
|
@@ -39,6 +39,8 @@ extern "C" {
|
|||||||
|
|
||||||
class Writer
|
class Writer
|
||||||
{
|
{
|
||||||
|
protected:
|
||||||
|
int fd;
|
||||||
public:
|
public:
|
||||||
static void Register(Writer *w, enum AVCodecID id, video_encoding_t encoding);
|
static void Register(Writer *w, enum AVCodecID id, video_encoding_t encoding);
|
||||||
static void Register(Writer *w, enum AVCodecID id, audio_encoding_t encoding);
|
static void Register(Writer *w, enum AVCodecID id, audio_encoding_t encoding);
|
||||||
@@ -46,7 +48,7 @@ class Writer
|
|||||||
static audio_encoding_t GetAudioEncoding(enum AVCodecID id);
|
static audio_encoding_t GetAudioEncoding(enum AVCodecID id);
|
||||||
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(int _fd, AVStream * /*stream*/ ) { fd = _fd; }
|
||||||
virtual bool Write(int fd, AVFormatContext *avfc, AVStream *stream, AVPacket *packet, int64_t pts);
|
virtual bool Write(AVPacket *packet, int64_t pts);
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
@@ -88,6 +88,10 @@ bool Input::Play()
|
|||||||
int warnAudioWrite = 0;
|
int warnAudioWrite = 0;
|
||||||
int warnVideoWrite = 0;
|
int warnVideoWrite = 0;
|
||||||
|
|
||||||
|
// HACK: Drop all video frames until the first audio frame was seen to keep player2 from stuttering.
|
||||||
|
// This seems to be necessary for network streaming only ...
|
||||||
|
bool audioSeen = !audioTrack || !player->isHttp;
|
||||||
|
|
||||||
while (player->isPlaying && !player->abortRequested) {
|
while (player->isPlaying && !player->abortRequested) {
|
||||||
|
|
||||||
//IF MOVIE IS PAUSED, WAIT
|
//IF MOVIE IS PAUSED, WAIT
|
||||||
@@ -149,9 +153,8 @@ 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;
|
for (unsigned int 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)
|
||||||
avcodec_flush_buffers(avfc->streams[i]->codec);
|
avcodec_flush_buffers(avfc->streams[i]->codec);
|
||||||
player->output.ClearAudio();
|
player->output.ClearAudio();
|
||||||
@@ -179,7 +182,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 (audioSeen && !player->output.Write(stream, &packet, pts)) {
|
||||||
if (warnVideoWrite)
|
if (warnVideoWrite)
|
||||||
warnVideoWrite--;
|
warnVideoWrite--;
|
||||||
else {
|
else {
|
||||||
@@ -190,11 +193,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 {
|
||||||
@@ -203,6 +206,7 @@ bool Input::Play()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
audioSeen = true;
|
||||||
} else if (_subtitleTrack && (_subtitleTrack->stream == stream)) {
|
} else if (_subtitleTrack && (_subtitleTrack->stream == stream)) {
|
||||||
if (stream->codec->codec) {
|
if (stream->codec->codec) {
|
||||||
AVSubtitle sub;
|
AVSubtitle sub;
|
||||||
@@ -239,17 +243,8 @@ bool Input::Play()
|
|||||||
|
|
||||||
if (player->abortRequested)
|
if (player->abortRequested)
|
||||||
player->output.Clear();
|
player->output.Clear();
|
||||||
else {
|
else
|
||||||
Track *_audioTrack = audioTrack;
|
|
||||||
if (_audioTrack) {
|
|
||||||
// flush audio decoder
|
|
||||||
AVPacket packet;
|
|
||||||
av_init_packet(&packet);
|
|
||||||
packet.size = 0;
|
|
||||||
player->output.Write(avfc, _audioTrack->stream, &packet, 0);
|
|
||||||
}
|
|
||||||
player->output.Flush();
|
player->output.Flush();
|
||||||
}
|
|
||||||
|
|
||||||
dvbsub_ass_clear();
|
dvbsub_ass_clear();
|
||||||
abortPlayback = true;
|
abortPlayback = true;
|
||||||
@@ -278,7 +273,7 @@ bool Input::ReadSubtitle(const char *filename, const char *format, int pid)
|
|||||||
const char *lastDot = strrchr(filename, '.');
|
const char *lastDot = strrchr(filename, '.');
|
||||||
if (!lastDot)
|
if (!lastDot)
|
||||||
return false;
|
return false;
|
||||||
char *subfile = (char *) alloca(strlen(filename) + strlen(format));
|
char subfile[strlen(filename) + strlen(format)];
|
||||||
strcpy(subfile, filename);
|
strcpy(subfile, filename);
|
||||||
strcpy(subfile + (lastDot + 1 - filename), format);
|
strcpy(subfile + (lastDot + 1 - filename), format);
|
||||||
|
|
||||||
@@ -314,9 +309,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));
|
||||||
@@ -326,6 +318,7 @@ bool Input::ReadSubtitle(const char *filename, const char *format, int pid)
|
|||||||
dvbsub_ass_write(c, &sub, pid);
|
dvbsub_ass_write(c, &sub, pid);
|
||||||
av_free_packet(&packet);
|
av_free_packet(&packet);
|
||||||
}
|
}
|
||||||
|
avcodec_close(c);
|
||||||
avformat_close_input(&subavfc);
|
avformat_close_input(&subavfc);
|
||||||
avformat_free_context(subavfc);
|
avformat_free_context(subavfc);
|
||||||
|
|
||||||
@@ -441,15 +434,10 @@ 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 : "";
|
||||||
track.pid = stream->id;
|
track.pid = stream->id;
|
||||||
if (stream->duration == AV_NOPTS_VALUE)
|
|
||||||
track.duration = avfc->duration;
|
|
||||||
else
|
|
||||||
track.duration = av_rescale(stream->time_base.num * AV_TIME_BASE, stream->duration, stream->time_base.den);
|
|
||||||
|
|
||||||
switch (stream->codec->codec_type) {
|
switch (stream->codec->codec_type) {
|
||||||
case AVMEDIA_TYPE_VIDEO: {
|
case AVMEDIA_TYPE_VIDEO: {
|
||||||
@@ -531,8 +519,11 @@ bool Input::Stop()
|
|||||||
while (hasPlayThreadStarted != 0)
|
while (hasPlayThreadStarted != 0)
|
||||||
usleep(100000);
|
usleep(100000);
|
||||||
|
|
||||||
if (avfc)
|
if (avfc) {
|
||||||
|
for (unsigned int i = 0; i < avfc->nb_streams; i++)
|
||||||
|
avcodec_close(avfc->streams[i]->codec);
|
||||||
avformat_close_input(&avfc);
|
avformat_close_input(&avfc);
|
||||||
|
}
|
||||||
|
|
||||||
avformat_network_deinit();
|
avformat_network_deinit();
|
||||||
|
|
||||||
@@ -550,23 +541,11 @@ bool Input::Seek(int64_t avts, bool absolute)
|
|||||||
|
|
||||||
bool Input::GetDuration(int64_t &duration)
|
bool Input::GetDuration(int64_t &duration)
|
||||||
{
|
{
|
||||||
|
if (avfc) {
|
||||||
|
duration = avfc->duration;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
duration = 0;
|
duration = 0;
|
||||||
|
|
||||||
Track *track = videoTrack;
|
|
||||||
if (track && track->duration) {
|
|
||||||
duration = track->duration;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
track = audioTrack;
|
|
||||||
if (track && track->duration) {
|
|
||||||
duration = track->duration;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
track = subtitleTrack;
|
|
||||||
if (track && track->duration) {
|
|
||||||
duration = track->duration;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -574,7 +553,7 @@ bool Input::SwitchAudio(Track *track)
|
|||||||
{
|
{
|
||||||
audioTrack = track;
|
audioTrack = track;
|
||||||
player->output.SwitchAudio(track ? track->stream : NULL);
|
player->output.SwitchAudio(track ? track->stream : NULL);
|
||||||
player->Seek(-5000, false);
|
// player->Seek(-5000, false);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -593,6 +572,7 @@ bool Input::SwitchTeletext(Track *track)
|
|||||||
bool Input::SwitchVideo(Track *track)
|
bool Input::SwitchVideo(Track *track)
|
||||||
{
|
{
|
||||||
videoTrack = track;
|
videoTrack = track;
|
||||||
|
player->output.SwitchVideo(track ? track->stream : NULL);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -129,18 +129,20 @@ bool Output::Play()
|
|||||||
OpenThreads::ScopedLock<OpenThreads::Mutex> v_lock(videoMutex);
|
OpenThreads::ScopedLock<OpenThreads::Mutex> v_lock(videoMutex);
|
||||||
OpenThreads::ScopedLock<OpenThreads::Mutex> a_lock(audioMutex);
|
OpenThreads::ScopedLock<OpenThreads::Mutex> a_lock(audioMutex);
|
||||||
|
|
||||||
if (videoStream && videofd > -1) {
|
AVCodecContext *avcc;
|
||||||
videoWriter = Writer::GetWriter(videoStream->codec->codec_id, videoStream->codec->codec_type);
|
|
||||||
videoWriter->Init();
|
if (videoStream && videofd > -1 && (avcc = videoStream->codec)) {
|
||||||
if (dioctl(videofd, VIDEO_SET_ENCODING, videoWriter->GetVideoEncoding(videoStream->codec->codec_id))
|
videoWriter = Writer::GetWriter(avcc->codec_id, avcc->codec_type);
|
||||||
|
videoWriter->Init(videofd, videoStream);
|
||||||
|
if (dioctl(videofd, VIDEO_SET_ENCODING, videoWriter->GetVideoEncoding(avcc->codec_id))
|
||||||
|| dioctl(videofd, VIDEO_PLAY, NULL))
|
|| dioctl(videofd, VIDEO_PLAY, NULL))
|
||||||
ret = false;
|
ret = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (audioStream && audiofd > -1) {
|
if (audioStream && audiofd > -1 && (avcc = audioStream->codec)) {
|
||||||
audioWriter = Writer::GetWriter(audioStream->codec->codec_id, audioStream->codec->codec_type);
|
audioWriter = Writer::GetWriter(avcc->codec_id, avcc->codec_type);
|
||||||
audioWriter->Init();
|
audioWriter->Init(audiofd, audioStream);
|
||||||
if (dioctl(audiofd, AUDIO_SET_ENCODING, audioWriter->GetAudioEncoding(audioStream->codec->codec_id))
|
if (dioctl(audiofd, AUDIO_SET_ENCODING, audioWriter->GetAudioEncoding(avcc->codec_id))
|
||||||
|| dioctl(audiofd, AUDIO_PLAY, NULL))
|
|| dioctl(audiofd, AUDIO_PLAY, NULL))
|
||||||
ret = false;
|
ret = false;
|
||||||
}
|
}
|
||||||
@@ -227,8 +229,16 @@ bool Output::Flush()
|
|||||||
if (videofd > -1 && ioctl(videofd, VIDEO_FLUSH, NULL))
|
if (videofd > -1 && ioctl(videofd, VIDEO_FLUSH, NULL))
|
||||||
ret = false;
|
ret = false;
|
||||||
|
|
||||||
if (audiofd > -1 && ioctl(audiofd, AUDIO_FLUSH, NULL))
|
if (audiofd > -1 && audioWriter) {
|
||||||
ret = false;
|
// flush audio decoder
|
||||||
|
AVPacket packet;
|
||||||
|
packet.data = NULL;
|
||||||
|
packet.size = 0;
|
||||||
|
audioWriter->Write(&packet, 0);
|
||||||
|
|
||||||
|
if (ioctl(audiofd, AUDIO_FLUSH, NULL))
|
||||||
|
ret = false;
|
||||||
|
}
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
@@ -300,10 +310,13 @@ bool Output::SwitchAudio(AVStream *stream)
|
|||||||
}
|
}
|
||||||
audioStream = stream;
|
audioStream = stream;
|
||||||
if (stream) {
|
if (stream) {
|
||||||
audioWriter = Writer::GetWriter(stream->codec->codec_id, stream->codec->codec_type);
|
AVCodecContext *avcc = stream->codec;
|
||||||
audioWriter->Init();
|
if (!avcc)
|
||||||
|
return false;
|
||||||
|
audioWriter = Writer::GetWriter(avcc->codec_id, avcc->codec_type);
|
||||||
|
audioWriter->Init(audiofd, audioStream);
|
||||||
if (audiofd > -1) {
|
if (audiofd > -1) {
|
||||||
dioctl (audiofd, AUDIO_SET_ENCODING, Writer::GetAudioEncoding(stream->codec->codec_id));
|
dioctl(audiofd, AUDIO_SET_ENCODING, Writer::GetAudioEncoding(avcc->codec_id));
|
||||||
dioctl(audiofd, AUDIO_PLAY, NULL);
|
dioctl(audiofd, AUDIO_PLAY, NULL);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -321,26 +334,29 @@ bool Output::SwitchVideo(AVStream *stream)
|
|||||||
}
|
}
|
||||||
videoStream = stream;
|
videoStream = stream;
|
||||||
if (stream) {
|
if (stream) {
|
||||||
videoWriter = Writer::GetWriter(stream->codec->codec_id, stream->codec->codec_type);
|
AVCodecContext *avcc = stream->codec;
|
||||||
videoWriter->Init();
|
if (!avcc)
|
||||||
|
return false;
|
||||||
|
videoWriter = Writer::GetWriter(avcc->codec_id, avcc->codec_type);
|
||||||
|
videoWriter->Init(videofd, videoStream);
|
||||||
if (videofd > -1) {
|
if (videofd > -1) {
|
||||||
dioctl(videofd, VIDEO_SET_ENCODING, Writer::GetVideoEncoding(stream->codec->codec_id));
|
dioctl(videofd, VIDEO_SET_ENCODING, Writer::GetVideoEncoding(avcc->codec_id));
|
||||||
dioctl(videofd, VIDEO_PLAY, NULL);
|
dioctl(videofd, VIDEO_PLAY, NULL);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
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(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(packet, pts);
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
return false;
|
return false;
|
||||||
|
@@ -78,6 +78,7 @@ bool Player::Open(const char *Url, bool _noprobe)
|
|||||||
isHttp = true;
|
isHttp = true;
|
||||||
} else if (strstr(Url, "://")) {
|
} else if (strstr(Url, "://")) {
|
||||||
url = Url;
|
url = Url;
|
||||||
|
isHttp = strncmp("file://", Url, 7);
|
||||||
} else {
|
} else {
|
||||||
fprintf(stderr, "%s %s %d: Unknown stream (%s)\n", __FILE__, __func__, __LINE__, Url);
|
fprintf(stderr, "%s %s %d: Unknown stream (%s)\n", __FILE__, __func__, __LINE__, Url);
|
||||||
return false;
|
return false;
|
||||||
|
@@ -35,13 +35,13 @@
|
|||||||
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(AVPacket *packet, int64_t pts);
|
||||||
WriterAC3();
|
WriterAC3();
|
||||||
};
|
};
|
||||||
|
|
||||||
bool WriterAC3::Write(int fd, AVFormatContext * /* avfc */, AVStream * /* stream */, AVPacket *packet, int64_t pts)
|
bool WriterAC3::Write(AVPacket *packet, int64_t pts)
|
||||||
{
|
{
|
||||||
if (fd < 0 || !packet || !packet->data)
|
if (!packet || !packet->data)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
uint8_t PesHeader[PES_MAX_HEADER_SIZE];
|
uint8_t PesHeader[PES_MAX_HEADER_SIZE];
|
||||||
|
@@ -37,20 +37,23 @@ class WriterDIVX : public Writer
|
|||||||
{
|
{
|
||||||
private:
|
private:
|
||||||
bool initialHeader;
|
bool initialHeader;
|
||||||
|
AVStream *stream;
|
||||||
public:
|
public:
|
||||||
bool Write(int fd, AVFormatContext *avfc, AVStream *stream, AVPacket *packet, int64_t pts);
|
bool Write(AVPacket *packet, int64_t pts);
|
||||||
void Init();
|
void Init(int fd, AVStream *_stream);
|
||||||
WriterDIVX();
|
WriterDIVX();
|
||||||
};
|
};
|
||||||
|
|
||||||
void WriterDIVX::Init()
|
void WriterDIVX::Init(int _fd, AVStream *_stream)
|
||||||
{
|
{
|
||||||
|
fd = _fd;
|
||||||
|
stream = _stream;
|
||||||
initialHeader = true;
|
initialHeader = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool WriterDIVX::Write(int fd, AVFormatContext * /* avfc */, AVStream *stream, AVPacket *packet, int64_t pts)
|
bool WriterDIVX::Write(AVPacket *packet, int64_t pts)
|
||||||
{
|
{
|
||||||
if (fd < 0 || !packet || !packet->data)
|
if (!packet || !packet->data)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
uint8_t PesHeader[PES_MAX_HEADER_SIZE];
|
uint8_t PesHeader[PES_MAX_HEADER_SIZE];
|
||||||
@@ -101,7 +104,6 @@ WriterDIVX::WriterDIVX()
|
|||||||
Register(this, AV_CODEC_ID_MSMPEG4V1, VIDEO_ENCODING_MPEG4P2);
|
Register(this, AV_CODEC_ID_MSMPEG4V1, VIDEO_ENCODING_MPEG4P2);
|
||||||
Register(this, AV_CODEC_ID_MSMPEG4V2, VIDEO_ENCODING_MPEG4P2);
|
Register(this, AV_CODEC_ID_MSMPEG4V2, VIDEO_ENCODING_MPEG4P2);
|
||||||
Register(this, AV_CODEC_ID_MSMPEG4V3, VIDEO_ENCODING_MPEG4P2);
|
Register(this, AV_CODEC_ID_MSMPEG4V3, VIDEO_ENCODING_MPEG4P2);
|
||||||
Init();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static WriterDIVX writer_divx __attribute__ ((init_priority (300)));
|
static WriterDIVX writer_divx __attribute__ ((init_priority (300)));
|
||||||
|
@@ -36,13 +36,13 @@
|
|||||||
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(AVPacket *packet, int64_t pts);
|
||||||
WriterDTS();
|
WriterDTS();
|
||||||
};
|
};
|
||||||
|
|
||||||
bool WriterDTS::Write(int fd, AVFormatContext * /* avfc */, AVStream * /* stream */, AVPacket *packet, int64_t pts)
|
bool WriterDTS::Write(AVPacket *packet, int64_t pts)
|
||||||
{
|
{
|
||||||
if (fd < 0 || !packet || !packet->data)
|
if (!packet || !packet->data)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
uint8_t PesHeader[PES_AUDIO_HEADER_SIZE];
|
uint8_t PesHeader[PES_AUDIO_HEADER_SIZE];
|
||||||
|
@@ -32,13 +32,13 @@
|
|||||||
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(AVPacket *packet, int64_t pts);
|
||||||
WriterH263();
|
WriterH263();
|
||||||
};
|
};
|
||||||
|
|
||||||
bool WriterH263::Write(int fd, AVFormatContext * /* avfc */, AVStream * /* stream */, AVPacket *packet, int64_t pts)
|
bool WriterH263::Write(AVPacket *packet, int64_t pts)
|
||||||
{
|
{
|
||||||
if (fd < 0 || !packet || !packet->data)
|
if (!packet || !packet->data)
|
||||||
return false;
|
return false;
|
||||||
uint8_t PesHeader[PES_MAX_HEADER_SIZE];
|
uint8_t PesHeader[PES_MAX_HEADER_SIZE];
|
||||||
|
|
||||||
|
@@ -52,21 +52,24 @@ class WriterH264 : public Writer
|
|||||||
private:
|
private:
|
||||||
bool initialHeader;
|
bool initialHeader;
|
||||||
unsigned int NalLengthBytes;
|
unsigned int NalLengthBytes;
|
||||||
|
AVStream *stream;
|
||||||
public:
|
public:
|
||||||
bool Write(int fd, AVFormatContext *avfc, AVStream *stream, AVPacket *packet, int64_t pts);
|
bool Write(AVPacket *packet, int64_t pts);
|
||||||
void Init();
|
void Init(int _fd, AVStream *_stream);
|
||||||
WriterH264();
|
WriterH264();
|
||||||
};
|
};
|
||||||
|
|
||||||
void WriterH264::Init(void)
|
void WriterH264::Init(int _fd, AVStream *_stream)
|
||||||
{
|
{
|
||||||
|
fd = _fd;
|
||||||
|
stream = _stream;
|
||||||
initialHeader = true;
|
initialHeader = true;
|
||||||
NalLengthBytes = 1;
|
NalLengthBytes = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool WriterH264::Write(int fd, AVFormatContext * /* avfc */, AVStream *stream, AVPacket *packet, int64_t pts)
|
bool WriterH264::Write(AVPacket *packet, int64_t pts)
|
||||||
{
|
{
|
||||||
if (fd < 0 || !packet || !packet->data)
|
if (!packet || !packet->data)
|
||||||
return false;
|
return false;
|
||||||
uint8_t PesHeader[PES_MAX_HEADER_SIZE];
|
uint8_t PesHeader[PES_MAX_HEADER_SIZE];
|
||||||
unsigned int TimeDelta;
|
unsigned int TimeDelta;
|
||||||
@@ -249,7 +252,6 @@ bool WriterH264::Write(int fd, AVFormatContext * /* avfc */, AVStream *stream, A
|
|||||||
WriterH264::WriterH264()
|
WriterH264::WriterH264()
|
||||||
{
|
{
|
||||||
Register(this, AV_CODEC_ID_H264, VIDEO_ENCODING_H264);
|
Register(this, AV_CODEC_ID_H264, VIDEO_ENCODING_H264);
|
||||||
Init();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static WriterH264 writerh264 __attribute__ ((init_priority (300)));
|
static WriterH264 writerh264 __attribute__ ((init_priority (300)));
|
||||||
|
@@ -35,13 +35,13 @@
|
|||||||
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(AVPacket *packet, int64_t pts);
|
||||||
WriterMP3();
|
WriterMP3();
|
||||||
};
|
};
|
||||||
|
|
||||||
bool WriterMP3::Write(int fd, AVFormatContext * /* avfc */, AVStream * /* stream */, AVPacket *packet, int64_t pts)
|
bool WriterMP3::Write(AVPacket *packet, int64_t pts)
|
||||||
{
|
{
|
||||||
if (fd < 0 || !packet || !packet->data)
|
if (!packet || !packet->data)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
uint8_t PesHeader[PES_MAX_HEADER_SIZE];
|
uint8_t PesHeader[PES_MAX_HEADER_SIZE];
|
||||||
|
@@ -35,13 +35,13 @@
|
|||||||
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(AVPacket *packet, int64_t pts);
|
||||||
WriterMPEG2();
|
WriterMPEG2();
|
||||||
};
|
};
|
||||||
|
|
||||||
bool WriterMPEG2::Write(int fd, AVFormatContext * /* avfc */, AVStream * /* stream */, AVPacket *packet, int64_t pts)
|
bool WriterMPEG2::Write(AVPacket *packet, int64_t pts)
|
||||||
{
|
{
|
||||||
if (fd < 0 || !packet || !packet->data)
|
if (!packet || !packet->data)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
uint8_t PesHeader[PES_MAX_HEADER_SIZE];
|
uint8_t PesHeader[PES_MAX_HEADER_SIZE];
|
||||||
|
@@ -71,6 +71,7 @@ class WriterPCM : public Writer
|
|||||||
int uSampleRate;
|
int uSampleRate;
|
||||||
int uBitsPerSample;
|
int uBitsPerSample;
|
||||||
|
|
||||||
|
AVStream *stream;
|
||||||
SwrContext *swr;
|
SwrContext *swr;
|
||||||
AVFrame *decoded_frame;
|
AVFrame *decoded_frame;
|
||||||
int out_sample_rate;
|
int out_sample_rate;
|
||||||
@@ -80,10 +81,10 @@ 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(AVPacket *packet, int64_t pts);
|
||||||
bool prepareClipPlay();
|
bool prepareClipPlay();
|
||||||
bool writePCM(int fd, int64_t Pts, uint8_t *data, unsigned int size);
|
bool writePCM(int64_t Pts, uint8_t *data, unsigned int size);
|
||||||
void Init();
|
void Init(int _fd, AVStream *_stream);
|
||||||
WriterPCM();
|
WriterPCM();
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -128,8 +129,7 @@ bool WriterPCM::prepareClipPlay()
|
|||||||
SubFrameLen *= uBitsPerSample / 8;
|
SubFrameLen *= uBitsPerSample / 8;
|
||||||
|
|
||||||
//rewrite PES size to have as many complete subframes per PES as we can
|
//rewrite PES size to have as many complete subframes per PES as we can
|
||||||
// FIXME: PES header size was hardcoded to 18 in earlier code. Actual size returned by InsertPesHeader is 14.
|
SubFramesPerPES = ((sizeof(injectBuffer) - 14) - sizeof(lpcm_prv)) / SubFrameLen;
|
||||||
SubFramesPerPES = ((sizeof(injectBuffer) - 18) - sizeof(lpcm_prv)) / SubFrameLen;
|
|
||||||
SubFrameLen *= SubFramesPerPES;
|
SubFrameLen *= SubFramesPerPES;
|
||||||
|
|
||||||
//set number of channels
|
//set number of channels
|
||||||
@@ -148,7 +148,7 @@ bool WriterPCM::prepareClipPlay()
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool WriterPCM::writePCM(int fd, int64_t Pts, uint8_t *data, unsigned int size)
|
bool WriterPCM::writePCM(int64_t Pts, uint8_t *data, unsigned int size)
|
||||||
{
|
{
|
||||||
bool res = true;
|
bool res = true;
|
||||||
uint8_t PesHeader[PES_MAX_HEADER_SIZE];
|
uint8_t PesHeader[PES_MAX_HEADER_SIZE];
|
||||||
@@ -219,17 +219,16 @@ bool WriterPCM::writePCM(int fd, int64_t Pts, uint8_t *data, unsigned int size)
|
|||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
void WriterPCM::Init()
|
void WriterPCM::Init(int _fd, AVStream *_stream)
|
||||||
{
|
{
|
||||||
|
fd = _fd;
|
||||||
|
stream = _stream;
|
||||||
initialHeader = true;
|
initialHeader = true;
|
||||||
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(AVPacket *packet, int64_t pts)
|
||||||
{
|
{
|
||||||
if (fd < 0)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
if (!packet) {
|
if (!packet) {
|
||||||
restart_audio_resampling = true;
|
restart_audio_resampling = true;
|
||||||
return true;
|
return true;
|
||||||
@@ -248,6 +247,7 @@ bool WriterPCM::Write(int fd, AVFormatContext * /*avfc*/, AVStream *stream, AVPa
|
|||||||
fprintf(stderr, "%s %d: avcodec_find_decoder(%llx)\n", __func__, __LINE__, (unsigned long long) c->codec_id);
|
fprintf(stderr, "%s %d: avcodec_find_decoder(%llx)\n", __func__, __LINE__, (unsigned long long) c->codec_id);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
avcodec_close(c);
|
||||||
if (avcodec_open2(c, codec, NULL)) {
|
if (avcodec_open2(c, codec, NULL)) {
|
||||||
fprintf(stderr, "%s %d: avcodec_open2 failed\n", __func__, __LINE__);
|
fprintf(stderr, "%s %d: avcodec_open2 failed\n", __func__, __LINE__);
|
||||||
return false;
|
return false;
|
||||||
@@ -292,7 +292,7 @@ bool WriterPCM::Write(int fd, AVFormatContext * /*avfc*/, AVStream *stream, AVPa
|
|||||||
|
|
||||||
int e = swr_init(swr);
|
int e = swr_init(swr);
|
||||||
if (e < 0) {
|
if (e < 0) {
|
||||||
fprintf(stderr, "swr_init: %d (icl=%d ocl=%d isr=%d osr=%d isf=%d osf=%d\n",
|
fprintf(stderr, "swr_init: %d (icl=%d ocl=%d isr=%d osr=%d isf=%d osf=%d)\n",
|
||||||
-e, (int) c->channel_layout,
|
-e, (int) c->channel_layout,
|
||||||
(int) out_channel_layout, c->sample_rate, out_sample_rate, c->sample_fmt, AV_SAMPLE_FMT_S16);
|
(int) out_channel_layout, c->sample_rate, out_sample_rate, c->sample_fmt, AV_SAMPLE_FMT_S16);
|
||||||
restart_audio_resampling = true;
|
restart_audio_resampling = true;
|
||||||
@@ -332,7 +332,7 @@ bool WriterPCM::Write(int fd, AVFormatContext * /*avfc*/, AVStream *stream, AVPa
|
|||||||
|
|
||||||
out_samples = swr_convert(swr, &output, out_samples, (const uint8_t **) &decoded_frame->data[0], in_samples);
|
out_samples = swr_convert(swr, &output, out_samples, (const uint8_t **) &decoded_frame->data[0], in_samples);
|
||||||
|
|
||||||
if (!writePCM(fd, pts, output, out_samples * sizeof(short) * out_channels)) {
|
if (!writePCM(pts, output, out_samples * sizeof(short) * out_channels)) {
|
||||||
restart_audio_resampling = true;
|
restart_audio_resampling = true;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -353,7 +353,6 @@ WriterPCM::WriterPCM()
|
|||||||
decoded_frame = av_frame_alloc();
|
decoded_frame = av_frame_alloc();
|
||||||
|
|
||||||
Register(this, AV_CODEC_ID_INJECTPCM, AUDIO_ENCODING_LPCMA);
|
Register(this, AV_CODEC_ID_INJECTPCM, AUDIO_ENCODING_LPCMA);
|
||||||
Init();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static WriterPCM writer_pcm __attribute__ ((init_priority (300)));
|
static WriterPCM writer_pcm __attribute__ ((init_priority (300)));
|
||||||
|
@@ -107,7 +107,7 @@ int InsertPesHeader(uint8_t *data, int size, uint8_t stream_id, int64_t pts, int
|
|||||||
PutBits(&ld2, 0x1, 8); // Start Code
|
PutBits(&ld2, 0x1, 8); // Start Code
|
||||||
PutBits(&ld2, pic_start_code & 0xff, 8); // 00, for picture start
|
PutBits(&ld2, pic_start_code & 0xff, 8); // 00, for picture start
|
||||||
PutBits(&ld2, (pic_start_code >> 8) & 0xff, 8); // For any extra information (like in mpeg4p2, the pic_start_code)
|
PutBits(&ld2, (pic_start_code >> 8) & 0xff, 8); // For any extra information (like in mpeg4p2, the pic_start_code)
|
||||||
//14 + 4 = 18
|
//14 + 5 = 19
|
||||||
}
|
}
|
||||||
|
|
||||||
FlushBits(&ld2);
|
FlushBits(&ld2);
|
||||||
|
@@ -50,20 +50,23 @@ class WriterVC1 : public Writer
|
|||||||
private:
|
private:
|
||||||
bool initialHeader;
|
bool initialHeader;
|
||||||
uint8_t FrameHeaderSeen;
|
uint8_t FrameHeaderSeen;
|
||||||
|
AVStream *stream;
|
||||||
public:
|
public:
|
||||||
bool Write(int fd, AVFormatContext *avfc, AVStream *stream, AVPacket *packet, int64_t pts);
|
bool Write(AVPacket *packet, int64_t pts);
|
||||||
void Init();
|
void Init(int _fd, AVStream *_stream);
|
||||||
WriterVC1();
|
WriterVC1();
|
||||||
};
|
};
|
||||||
|
|
||||||
void WriterVC1::Init()
|
void WriterVC1::Init(int _fd, AVStream *_stream)
|
||||||
{
|
{
|
||||||
|
fd = _fd;
|
||||||
|
stream = _stream;
|
||||||
initialHeader = true;
|
initialHeader = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool WriterVC1::Write(int fd, AVFormatContext * /* avfc */, AVStream *stream, AVPacket *packet, int64_t pts)
|
bool WriterVC1::Write(AVPacket *packet, int64_t pts)
|
||||||
{
|
{
|
||||||
if (fd < 0 || !packet || !packet->data)
|
if (!packet || !packet->data)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (initialHeader) {
|
if (initialHeader) {
|
||||||
@@ -181,7 +184,6 @@ bool WriterVC1::Write(int fd, AVFormatContext * /* avfc */, AVStream *stream, AV
|
|||||||
WriterVC1::WriterVC1()
|
WriterVC1::WriterVC1()
|
||||||
{
|
{
|
||||||
Register(this, AV_CODEC_ID_VC1, VIDEO_ENCODING_VC1);
|
Register(this, AV_CODEC_ID_VC1, VIDEO_ENCODING_VC1);
|
||||||
Init();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static WriterVC1 writer_vc1 __attribute__ ((init_priority (300)));
|
static WriterVC1 writer_vc1 __attribute__ ((init_priority (300)));
|
||||||
|
@@ -57,20 +57,23 @@ class WriterWMV : public Writer
|
|||||||
{
|
{
|
||||||
private:
|
private:
|
||||||
bool initialHeader;
|
bool initialHeader;
|
||||||
|
AVStream *stream;
|
||||||
public:
|
public:
|
||||||
bool Write(int fd, AVFormatContext *avfc, AVStream *stream, AVPacket *packet, int64_t pts);
|
bool Write(AVPacket *packet, int64_t pts);
|
||||||
void Init();
|
void Init(int _fd, AVStream *_stream);
|
||||||
WriterWMV();
|
WriterWMV();
|
||||||
};
|
};
|
||||||
|
|
||||||
void WriterWMV::Init()
|
void WriterWMV::Init(int _fd, AVStream *_stream)
|
||||||
{
|
{
|
||||||
|
fd = _fd;
|
||||||
|
stream = _stream;
|
||||||
initialHeader = true;
|
initialHeader = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool WriterWMV::Write(int fd, AVFormatContext * /* avfc */, AVStream *stream, AVPacket *packet, int64_t pts)
|
bool WriterWMV::Write(AVPacket *packet, int64_t pts)
|
||||||
{
|
{
|
||||||
if (fd < 0 || !packet || !packet->data)
|
if (!packet || !packet->data)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (initialHeader) {
|
if (initialHeader) {
|
||||||
@@ -164,7 +167,6 @@ WriterWMV::WriterWMV()
|
|||||||
Register(this, AV_CODEC_ID_WMV1, VIDEO_ENCODING_WMV);
|
Register(this, AV_CODEC_ID_WMV1, VIDEO_ENCODING_WMV);
|
||||||
Register(this, AV_CODEC_ID_WMV2, VIDEO_ENCODING_WMV);
|
Register(this, AV_CODEC_ID_WMV2, VIDEO_ENCODING_WMV);
|
||||||
Register(this, AV_CODEC_ID_WMV3, VIDEO_ENCODING_WMV);
|
Register(this, AV_CODEC_ID_WMV3, VIDEO_ENCODING_WMV);
|
||||||
Init();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static WriterWMV writer_wmv __attribute__ ((init_priority (300)));
|
static WriterWMV writer_wmv __attribute__ ((init_priority (300)));
|
||||||
|
@@ -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(AVPacket * /* packet */, int64_t /* pts */)
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@@ -35,6 +35,7 @@ hw_caps_t *get_hwcaps(void)
|
|||||||
caps.can_shutdown = 1;
|
caps.can_shutdown = 1;
|
||||||
caps.display_type = HW_DISPLAY_LED_NUM;
|
caps.display_type = HW_DISPLAY_LED_NUM;
|
||||||
caps.has_HDMI = 1;
|
caps.has_HDMI = 1;
|
||||||
|
caps.has_SCART = 1;
|
||||||
caps.display_xres = 4;
|
caps.display_xres = 4;
|
||||||
strcpy(caps.boxvendor, "SPARK");
|
strcpy(caps.boxvendor, "SPARK");
|
||||||
const char *tmp;
|
const char *tmp;
|
||||||
@@ -65,89 +66,83 @@ hw_caps_t *get_hwcaps(void)
|
|||||||
switch (sys_id) {
|
switch (sys_id) {
|
||||||
case 0x090003:
|
case 0x090003:
|
||||||
tmp = "Truman Premier 1+";
|
tmp = "Truman Premier 1+";
|
||||||
caps.has_SCART = 1;
|
|
||||||
break;
|
break;
|
||||||
case 0x090007:
|
case 0x090007:
|
||||||
tmp = "GoldenMedia GM990";
|
tmp = "GoldenMedia GM990";
|
||||||
caps.has_SCART = 1;
|
|
||||||
break;
|
break;
|
||||||
case 0x090008:
|
case 0x090008:
|
||||||
tmp = "Edision Pingulux";
|
tmp = "Edision Pingulux";
|
||||||
caps.has_SCART = 1; // RCA qualifies ... --martii
|
|
||||||
if (caps.display_type == HW_DISPLAY_LINE_TEXT)
|
if (caps.display_type == HW_DISPLAY_LINE_TEXT)
|
||||||
tmp = "Edision Pingulux Plus";
|
tmp = "Edision Pingulux Plus";
|
||||||
break;
|
break;
|
||||||
case 0x09000a:
|
case 0x09000a:
|
||||||
tmp = "Amiko Alien SDH8900";
|
tmp = "Amiko Alien SDH8900";
|
||||||
caps.has_SCART = 1;
|
|
||||||
break;
|
break;
|
||||||
case 0x09000b:
|
case 0x09000b:
|
||||||
tmp = "GalaxyInnovations S8120";
|
tmp = "GalaxyInnovations S8120";
|
||||||
caps.has_SCART = 1;
|
|
||||||
break;
|
break;
|
||||||
case 0x09000d:
|
case 0x09000d:
|
||||||
tmp = "Dynavision Spark";
|
tmp = "Dynavision Spark";
|
||||||
caps.has_SCART = 1;
|
|
||||||
break;
|
break;
|
||||||
case 0x09000e:
|
case 0x09000e:
|
||||||
tmp = "SAB Unix F+ Solo (S902)";
|
tmp = "SAB Unix F+ Solo (S902)";
|
||||||
caps.has_SCART = 1;
|
|
||||||
break;
|
break;
|
||||||
case 0x090015:
|
case 0x090015:
|
||||||
tmp = "Superbox S 750 HD";
|
tmp = "Superbox S 750 HD";
|
||||||
caps.has_SCART = 1;
|
|
||||||
break;
|
break;
|
||||||
case 0x09001d:
|
case 0x09001d:
|
||||||
tmp = "Fulan Spark I+";
|
tmp = "Fulan Spark I+";
|
||||||
caps.has_SCART = 1;
|
|
||||||
break;
|
break;
|
||||||
case 0x090020:
|
case 0x090020:
|
||||||
tmp = "SAMSAT LINUX 1";
|
tmp = "SAMSAT LINUX 1";
|
||||||
caps.has_SCART = 1;
|
|
||||||
break;
|
break;
|
||||||
case 0x090021:
|
case 0x090021:
|
||||||
tmp = "Visionnet Hammer 5400"; // or Startrack SRT 2020 HD, or Visionnet Fireball 101
|
tmp = "Visionnet Hammer 5400"; // or Startrack SRT 2020 HD, or Visionnet Fireball 101
|
||||||
caps.has_SCART = 1;
|
break;
|
||||||
|
case 0x090043:
|
||||||
|
tmp = "Sogno Spark Revolution";
|
||||||
break;
|
break;
|
||||||
case 0x0c0003:
|
case 0x0c0003:
|
||||||
tmp = "Truman Top Box 2";
|
tmp = "Truman Top Box 2";
|
||||||
caps.has_SCART = 1;
|
break;
|
||||||
|
case 0x0c0004:
|
||||||
|
tmp = "Delta";
|
||||||
break;
|
break;
|
||||||
case 0x0c0007:
|
case 0x0c0007:
|
||||||
tmp = "GoldenMedia Triplex";
|
tmp = "GoldenMedia Triplex";
|
||||||
caps.has_SCART = 1;
|
|
||||||
break;
|
break;
|
||||||
case 0x0c000a:
|
case 0x0c000a:
|
||||||
tmp = "Amiko Alien 2";
|
tmp = "Amiko Alien 2";
|
||||||
caps.has_SCART = 1;
|
|
||||||
break;
|
break;
|
||||||
case 0x0c000b:
|
case 0x0c000b:
|
||||||
tmp = "GalaxyInnovations Avatar 3 (8820)";
|
tmp = "GalaxyInnovations Avatar 3 (8820)";
|
||||||
caps.has_SCART = 1;
|
|
||||||
break;
|
break;
|
||||||
case 0x0c000d:
|
case 0x0c000d:
|
||||||
tmp = "Dynavision 7162";
|
tmp = "Dynavision 7162";
|
||||||
caps.has_SCART = 1;
|
|
||||||
break;
|
break;
|
||||||
case 0x0c000e:
|
case 0x0c000e:
|
||||||
tmp = "SAB Unix Triple HD (S903)";
|
tmp = "SAB Unix Triple HD (S903)";
|
||||||
caps.has_SCART = 1;
|
break;
|
||||||
|
case 0x0c0015:
|
||||||
|
tmp = "Superbox Z500";
|
||||||
break;
|
break;
|
||||||
case 0x0c001d:
|
case 0x0c001d:
|
||||||
tmp = "Satcom 7162";
|
tmp = "Satcom 7162";
|
||||||
caps.has_SCART = 1;
|
|
||||||
break;
|
break;
|
||||||
case 0x0c0020:
|
case 0x0c0020:
|
||||||
tmp = "Samsat 7162";
|
tmp = "Samsat 7162";
|
||||||
caps.has_SCART = 1;
|
|
||||||
break;
|
break;
|
||||||
case 0x0c0021:
|
case 0x0c0021:
|
||||||
tmp = "Visionnet Falcon";
|
tmp = "Visionnet Falcon";
|
||||||
caps.has_SCART = 1;
|
|
||||||
break;
|
break;
|
||||||
case 0x0c002b00:
|
case 0x0c002b:
|
||||||
tmp = "Icecrypt S3700 CHD";
|
tmp = "Icecrypt S3700 CHD";
|
||||||
caps.has_SCART = 1;
|
break;
|
||||||
|
case 0x0c0043:
|
||||||
|
tmp = "Sogno Spark Triple";
|
||||||
|
break;
|
||||||
|
case 0x0c0045:
|
||||||
|
tmp = "Interstar";
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
tmp = p;
|
tmp = p;
|
||||||
|
Reference in New Issue
Block a user