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::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::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::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 Output::SwitchVideo(AVStream *stream) { ScopedLock v_lock(videoMutex); if (stream == videoStream) { return true; } if (videofd > -1) { dioctl(videofd, VIDEO_STOP, NULL); ioctl(videofd, VIDEO_CLEAR_BUFFER, NULL); } videoStream = stream; if (stream) { AVCodecContext *avcc = stream->codec; if (!avcc) { return false; } videoWriter = Writer::GetWriter(avcc->codec_id, avcc->codec_type); videoWriter->Init(videofd, videoStream, player); if (videofd > -1) { dioctl(videofd, VIDEO_SET_ENCODING, Writer::GetVideoEncoding(avcc->codec_id)); dioctl(videofd, VIDEO_PLAY, NULL); } } 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::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; }
bool Output::GetFrameCount(int64_t &framecount) { dvb_play_info_t playInfo; if ((videofd > -1 && !dioctl(videofd, VIDEO_GET_PLAY_INFO, (void *) &playInfo)) || (audiofd > -1 && !dioctl(audiofd, AUDIO_GET_PLAY_INFO, (void *) &playInfo))) { framecount = playInfo.frame_count; return true; } 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::AVSync(bool b) { ScopedLock a_lock(audioMutex); return audiofd > -1 && !dioctl(audiofd, AUDIO_SET_AV_SYNC, b); }
bool Output::SlowMotion(int speed) { ScopedLock v_lock(videoMutex); return videofd > -1 && !dioctl(videofd, VIDEO_SLOWMOTION, speed); }
bool Output::FastForward(int speed) { ScopedLock v_lock(videoMutex); return videofd > -1 && !dioctl(videofd, VIDEO_FAST_FORWARD, speed); }
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); }