bool Output::SwitchAudio(Track *track) { ScopedLock a_lock(audioMutex); if (audioTrack && track->stream == audioTrack->stream) return true; if (audiofd > -1) { dioctl(audiofd, AUDIO_STOP, NULL); ioctl(audiofd, AUDIO_CLEAR_BUFFER, NULL); } audioTrack = track; if (track->stream) { AVCodecContext *avcc = track->stream->codec; if (!avcc) return false; audioWriter = Writer::GetWriter(avcc->codec_id, avcc->codec_type, audioTrack->ac3flags); audioWriter->Init(audiofd, audioTrack->stream, player); if (audiofd > -1) { audio_encoding_t audioEncoding = AUDIO_ENCODING_LPCMA; if (audioTrack->ac3flags != 6) audioEncoding = Writer::GetAudioEncoding(avcc->codec_id); dioctl(audiofd, AUDIO_SET_ENCODING, audioEncoding); dioctl(audiofd, AUDIO_PLAY, NULL); } } return true; }
bool Output::Stop() { bool ret = true; ScopedLock v_lock(videoMutex); ScopedLock a_lock(audioMutex); if (videofd > -1) { ioctl(videofd, VIDEO_CLEAR_BUFFER, NULL); /* set back to normal speed (end trickmodes) */ dioctl(videofd, VIDEO_SET_SPEED, DVB_SPEED_NORMAL_PLAY); if (dioctl(videofd, VIDEO_STOP, NULL)) ret = false; } if (audiofd > -1) { ioctl(audiofd, AUDIO_CLEAR_BUFFER, NULL); /* set back to normal speed (end trickmodes) */ dioctl(audiofd, AUDIO_SET_SPEED, DVB_SPEED_NORMAL_PLAY); if (dioctl(audiofd, AUDIO_STOP, NULL)) ret = false; } return ret; }
bool Output::Open() { ScopedLock v_lock(videoMutex); ScopedLock a_lock(audioMutex); if (videofd < 0) videofd = open(VIDEODEV, O_RDWR); if (videofd < 0) return false; ioctl(videofd, VIDEO_CLEAR_BUFFER, NULL); dioctl(videofd, VIDEO_SELECT_SOURCE, (void *) VIDEO_SOURCE_MEMORY); dioctl(videofd, VIDEO_SET_STREAMTYPE, (void *) STREAM_TYPE_PROGRAM); dioctl(videofd, VIDEO_SET_SPEED, DVB_SPEED_NORMAL_PLAY); if (audiofd < 0) audiofd = open(AUDIODEV, O_RDWR); if (audiofd < 0) { close(videofd); videofd = -1; return false; } ioctl(audiofd, AUDIO_CLEAR_BUFFER, NULL); dioctl(audiofd, AUDIO_SELECT_SOURCE, (void *) AUDIO_SOURCE_MEMORY); dioctl(audiofd, AUDIO_SET_STREAMTYPE, (void *) STREAM_TYPE_PROGRAM); return true; }
bool Output::Play() { bool ret = true; ScopedLock v_lock(videoMutex); ScopedLock a_lock(audioMutex); AVCodecContext *avcc; if (videoTrack && videoTrack->stream && videofd > -1 && (avcc = videoTrack->stream->codec)) { videoWriter = Writer::GetWriter(avcc->codec_id, avcc->codec_type, videoTrack->ac3flags); videoWriter->Init(videofd, videoTrack->stream, player); if (dioctl(videofd, VIDEO_SET_ENCODING, videoWriter->GetVideoEncoding(avcc->codec_id)) || dioctl(videofd, VIDEO_PLAY, NULL)) ret = false; } if (audioTrack && audioTrack->stream && audiofd > -1 && (avcc = audioTrack->stream->codec)) { audioWriter = Writer::GetWriter(avcc->codec_id, avcc->codec_type, audioTrack->ac3flags); audioWriter->Init(audiofd, audioTrack->stream, player); audio_encoding_t audioEncoding = AUDIO_ENCODING_LPCMA; if (audioTrack->ac3flags != 6) audioEncoding = audioWriter->GetAudioEncoding(avcc->codec_id); if (dioctl(audiofd, AUDIO_SET_ENCODING, audioEncoding) || dioctl(audiofd, AUDIO_PLAY, NULL)) ret = false; } return ret; }
bool Log::Output(const char* format, ...) { if ( !m_bfLogger.IsOpen() ) { return false; } AutoLock a_lock(m_mLock); char buf[MAX_BUFFER_SIZE] = ""; va_list arg_ptr; va_start(arg_ptr, format); vsnprintf(buf, sizeof(buf), format, arg_ptr); va_end(arg_ptr); std::string str_out = SimpleTime::Now().LLTimeStamp() + std::string("\x20\x20") + buf; m_bfLogger.Write(str_out); ++m_llLineCount; // Maximum file ? if ( CheckFileMaximum(str_out) ) { m_bfLogger.Write(str_out); OpenNewLogger(); } return true; }
bool Output::SwitchAudio(AVStream *stream) { ScopedLock a_lock(audioMutex); if (stream == audioStream) { return true; } if (audiofd > -1) { dioctl(audiofd, AUDIO_STOP, NULL); ioctl(audiofd, AUDIO_CLEAR_BUFFER, NULL); } audioStream = stream; if (stream) { AVCodecContext *avcc = stream->codec; if (!avcc) { return false; } audioWriter = Writer::GetWriter(avcc->codec_id, avcc->codec_type); audioWriter->Init(audiofd, audioStream, player); if (audiofd > -1) { dioctl(audiofd, AUDIO_SET_ENCODING, Writer::GetAudioEncoding(avcc->codec_id)); dioctl(audiofd, AUDIO_PLAY, NULL); } } return true; }
bool Output::Flush() { bool ret = true; ScopedLock v_lock(videoMutex); ScopedLock a_lock(audioMutex); if (videofd > -1 && ioctl(videofd, VIDEO_FLUSH, NULL)) { ret = false; } if (audiofd > -1 && audioWriter) { // 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; }
bool Output::Play() { bool ret = true; ScopedLock v_lock(videoMutex); ScopedLock a_lock(audioMutex); AVCodecContext *avcc; if (videoStream && videofd > -1 && (avcc = videoStream->codec)) { videoWriter = Writer::GetWriter(avcc->codec_id, avcc->codec_type); videoWriter->Init(videofd, videoStream, player); if (dioctl(videofd, VIDEO_SET_ENCODING, videoWriter->GetVideoEncoding(avcc->codec_id)) || dioctl(videofd, VIDEO_PLAY, NULL)) { ret = false; } } if (audioStream && audiofd > -1 && (avcc = audioStream->codec)) { audioWriter = Writer::GetWriter(avcc->codec_id, avcc->codec_type); audioWriter->Init(audiofd, audioStream, player); if (dioctl(audiofd, AUDIO_SET_ENCODING, audioWriter->GetAudioEncoding(avcc->codec_id)) || dioctl(audiofd, AUDIO_PLAY, NULL)) { ret = false; } } return ret; }
void Log::Notify() { AutoLock a_lock(m_mLock); m_bfLogger.Write("\n\n\x20\x20\x20\x20( INTERVAL TIME END )"); OpenNewLogger(); }
void Log::Init(const LogStrategy& strategy) { AutoLock a_lock(m_mLock); ImportStrategy(strategy); StartTimer(); OpenNewLogger(); }
bool Output::Write(AVStream *stream, AVPacket *packet, int64_t pts) { switch (stream->codec->codec_type) { case AVMEDIA_TYPE_VIDEO: { ScopedLock v_lock(videoMutex); return videofd > -1 && videoWriter && videoWriter->Write(packet, pts); } case AVMEDIA_TYPE_AUDIO: { ScopedLock a_lock(audioMutex); return audiofd > -1 && audioWriter && audioWriter->Write(packet, pts); } default: return false; } }
bool Output::Continue() { bool ret = true; ScopedLock v_lock(videoMutex); ScopedLock a_lock(audioMutex); if (videofd > -1 && dioctl(videofd, VIDEO_CONTINUE, NULL)) ret = false; if (audiofd > -1 && dioctl(audiofd, AUDIO_CONTINUE, NULL)) ret = false; return ret; }
bool Output::Pause() { bool ret = true; ScopedLock v_lock(videoMutex); ScopedLock a_lock(audioMutex); if (videofd > -1) { if (dioctl(videofd, VIDEO_FREEZE, NULL)) ret = false; } if (audiofd > -1) { if (dioctl(audiofd, AUDIO_PAUSE, NULL)) ret = false; } return ret; }
bool Output::Close() { Stop(); ScopedLock v_lock(videoMutex); ScopedLock a_lock(audioMutex); if (videofd > -1) { close(videofd); videofd = -1; } if (audiofd > -1) { close(audiofd); audiofd = -1; } videoTrack = NULL; audioTrack = NULL; return true; }
bool Output::Mute(bool b) { ScopedLock a_lock(audioMutex); //AUDIO_SET_MUTE has no effect with new player return audiofd > -1 && !dioctl(audiofd, b ? AUDIO_STOP : AUDIO_PLAY, NULL); }
bool Output::ClearAudio() { ScopedLock a_lock(audioMutex); return audiofd > -1 && !ioctl(audiofd, AUDIO_CLEAR_BUFFER, NULL); }
bool Output::AVSync(bool b) { ScopedLock a_lock(audioMutex); return audiofd > -1 && !dioctl(audiofd, AUDIO_SET_AV_SYNC, b); }