/*------------------------------------------------------------------------- Returns the delay in time stamp counts. -------------------------------------------------------------------------*/ inline qword ReadTS_Diff(void) { if (!TS_Valid) {return 0;} qword Count = ReadTS(); qword Diff = Count - LastCount; LastCount = Count; return Diff; }
void StartLight(void) { EventString("LIGHTON"); /* ** turn on the LEDs */ WritePIO2(0xFF); /* ** activate sequence to turn off the light. This will control ** the duration of the LED on period */ sysinfo.seq[LIGHTSEQOFF].active = 1; sysinfo.seq[LIGHTSEQOFF].time = ReadTS(); }
void BlockSeqOn(void) { /* ** start acquisition */ EventString("BLOCKON"); /* ** activate sequence to start acq */ sysinfo.seq[STIMSEQON].active = 1; sysinfo.seq[STIMSEQON].time = 0; sysinfo.seq[BLOCKSEQOFF].active = 1; sysinfo.seq[BLOCKSEQOFF].time = ReadTS(); }
void StartStimAcq(void) { /* ** start acquisition */ StartAcq(); EventString("STIMON"); /* ** stimulate */ Stimulate(); /* ** activate sequence to stop acq */ sysinfo.seq[STIMSEQOFF].active = 1; sysinfo.seq[STIMSEQOFF].time = ReadTS(); }
FFMS_Index *FFLAVFIndexer::DoIndexing() { std::vector<SharedAudioContext> AudioContexts(FormatContext->nb_streams, SharedAudioContext(false)); std::vector<SharedVideoContext> VideoContexts(FormatContext->nb_streams, SharedVideoContext(false)); std::auto_ptr<FFMS_Index> TrackIndices(new FFMS_Index(Filesize, Digest)); TrackIndices->Decoder = FFMS_SOURCE_LAVF; for (unsigned int i = 0; i < FormatContext->nb_streams; i++) { TrackIndices->push_back(FFMS_Track((int64_t)FormatContext->streams[i]->time_base.num * 1000, FormatContext->streams[i]->time_base.den, static_cast<FFMS_TrackType>(FormatContext->streams[i]->codec->codec_type))); if (FormatContext->streams[i]->codec->codec_type == AVMEDIA_TYPE_VIDEO) { AVCodec *VideoCodec = avcodec_find_decoder(FormatContext->streams[i]->codec->codec_id); if (!VideoCodec) throw FFMS_Exception(FFMS_ERROR_CODEC, FFMS_ERROR_UNSUPPORTED, "Video codec not found"); if (avcodec_open2(FormatContext->streams[i]->codec, VideoCodec, NULL) < 0) throw FFMS_Exception(FFMS_ERROR_CODEC, FFMS_ERROR_DECODING, "Could not open video codec"); VideoContexts[i].CodecContext = FormatContext->streams[i]->codec; VideoContexts[i].Parser = av_parser_init(FormatContext->streams[i]->codec->codec_id); if (VideoContexts[i].Parser) VideoContexts[i].Parser->flags = PARSER_FLAG_COMPLETE_FRAMES; IndexMask |= 1 << i; } else if (IndexMask & (1 << i) && FormatContext->streams[i]->codec->codec_type == AVMEDIA_TYPE_AUDIO) { AVCodecContext *AudioCodecContext = FormatContext->streams[i]->codec; AVCodec *AudioCodec = avcodec_find_decoder(AudioCodecContext->codec_id); if (AudioCodec == NULL) throw FFMS_Exception(FFMS_ERROR_CODEC, FFMS_ERROR_UNSUPPORTED, "Audio codec not found"); if (avcodec_open2(AudioCodecContext, AudioCodec, NULL) < 0) throw FFMS_Exception(FFMS_ERROR_CODEC, FFMS_ERROR_DECODING, "Could not open audio codec"); AudioContexts[i].CodecContext = AudioCodecContext; } else { IndexMask &= ~(1 << i); } } AVPacket Packet; InitNullPacket(Packet); std::vector<int64_t> LastValidTS(FormatContext->nb_streams, ffms_av_nopts_value); std::vector<int> LastDuration(FormatContext->nb_streams, 0); #if (LIBAVFORMAT_VERSION_INT) < (AV_VERSION_INT(52,106,0)) int64_t filesize = FormatContext->file_size; #else int64_t filesize = avio_size(FormatContext->pb); #endif while (av_read_frame(FormatContext, &Packet) >= 0) { // Update progress // FormatContext->pb can apparently be NULL when opening images. if (IC && FormatContext->pb) { if ((*IC)(FormatContext->pb->pos, filesize, ICPrivate)) throw FFMS_Exception(FFMS_ERROR_CANCELLED, FFMS_ERROR_USER, "Cancelled by user"); } if (!(IndexMask & (1 << Packet.stream_index))) { av_free_packet(&Packet); continue; } int Track = Packet.stream_index; bool KeyFrame = !!(Packet.flags & AV_PKT_FLAG_KEY); ReadTS(Packet, LastValidTS[Track], (*TrackIndices)[Track].UseDTS); if (FormatContext->streams[Track]->codec->codec_type == AVMEDIA_TYPE_VIDEO) { int64_t PTS = LastValidTS[Track]; if (PTS == ffms_av_nopts_value) { if (Packet.duration == 0) throw FFMS_Exception(FFMS_ERROR_INDEXING, FFMS_ERROR_PARSER, "Invalid initial pts, dts, and duration"); if ((*TrackIndices)[Track].empty()) PTS = 0; else PTS = (*TrackIndices)[Track].back().PTS + LastDuration[Track]; (*TrackIndices)[Track].HasTS = false; LastDuration[Track] = Packet.duration; } int RepeatPict = -1; int FrameType = 0; ParseVideoPacket(VideoContexts[Track], Packet, &RepeatPict, &FrameType); (*TrackIndices)[Track].push_back(TFrameInfo::VideoFrameInfo(PTS, RepeatPict, KeyFrame, FrameType, Packet.pos)); } else if (FormatContext->streams[Track]->codec->codec_type == AVMEDIA_TYPE_AUDIO) { int64_t StartSample = AudioContexts[Track].CurrentSample; int64_t SampleCount = IndexAudioPacket(Track, &Packet, AudioContexts[Track], *TrackIndices); if (SampleCount != 0) (*TrackIndices)[Track].push_back(TFrameInfo::AudioFrameInfo(LastValidTS[Track], StartSample, SampleCount, KeyFrame, Packet.pos)); } av_free_packet(&Packet); } TrackIndices->Sort(); return TrackIndices.release(); }
void UdpSocket::OnRead() { #ifdef ENABLE_IPV6 #ifdef IPPROTO_IPV6 if (IsIpv6()) { struct sockaddr_in6 sa; socklen_t sa_len = sizeof(sa); if (m_b_read_ts) { struct timeval ts; Utility::GetTime(&ts); #if !defined(LINUX) && !defined(MACOSX) int n = recvfrom(GetSocket(), m_ibuf, m_ibufsz, 0, (struct sockaddr *)&sa, &sa_len); #else int n = ReadTS(m_ibuf, m_ibufsz, (struct sockaddr *)&sa, sa_len, &ts); #endif if (n > 0) { this -> OnRawData(m_ibuf, n, (struct sockaddr *)&sa, sa_len, &ts); } else if (n == -1) { #ifdef _WIN32 if (Errno != WSAEWOULDBLOCK) #else if (Errno != EWOULDBLOCK) #endif Handler().LogError(this, "recvfrom", Errno, StrError(Errno), LOG_LEVEL_ERROR); } return; } int n = recvfrom(GetSocket(), m_ibuf, m_ibufsz, 0, (struct sockaddr *)&sa, &sa_len); int q = m_retries; // receive max 10 at one cycle while (n > 0) { if (sa_len != sizeof(sa)) { Handler().LogError(this, "recvfrom", 0, "unexpected address struct size", LOG_LEVEL_WARNING); } this -> OnRawData(m_ibuf, n, (struct sockaddr *)&sa, sa_len); if (!q--) break; // n = recvfrom(GetSocket(), m_ibuf, m_ibufsz, 0, (struct sockaddr *)&sa, &sa_len); } if (n == -1) { #ifdef _WIN32 if (Errno != WSAEWOULDBLOCK) #else if (Errno != EWOULDBLOCK) #endif Handler().LogError(this, "recvfrom", Errno, StrError(Errno), LOG_LEVEL_ERROR); } return; } #endif #endif struct sockaddr_in sa; socklen_t sa_len = sizeof(sa); if (m_b_read_ts) { struct timeval ts; Utility::GetTime(&ts); #if !defined(LINUX) && !defined(MACOSX) int n = recvfrom(GetSocket(), m_ibuf, m_ibufsz, 0, (struct sockaddr *)&sa, &sa_len); #else int n = ReadTS(m_ibuf, m_ibufsz, (struct sockaddr *)&sa, sa_len, &ts); #endif if (n > 0) { this -> OnRawData(m_ibuf, n, (struct sockaddr *)&sa, sa_len, &ts); } else if (n == -1) { #ifdef _WIN32 if (Errno != WSAEWOULDBLOCK) #else if (Errno != EWOULDBLOCK) #endif Handler().LogError(this, "recvfrom", Errno, StrError(Errno), LOG_LEVEL_ERROR); } return; } int n = recvfrom(GetSocket(), m_ibuf, m_ibufsz, 0, (struct sockaddr *)&sa, &sa_len); int q = m_retries; while (n > 0) { if (sa_len != sizeof(sa)) { Handler().LogError(this, "recvfrom", 0, "unexpected address struct size", LOG_LEVEL_WARNING); } this -> OnRawData(m_ibuf, n, (struct sockaddr *)&sa, sa_len); if (!q--) break; // n = recvfrom(GetSocket(), m_ibuf, m_ibufsz, 0, (struct sockaddr *)&sa, &sa_len); } if (n == -1) { #ifdef _WIN32 if (Errno != WSAEWOULDBLOCK) #else if (Errno != EWOULDBLOCK) #endif Handler().LogError(this, "recvfrom", Errno, StrError(Errno), LOG_LEVEL_ERROR); } }
/*------------------------------------------------------------------------- Sets up the delay measurement by initializing the LastCount register. -------------------------------------------------------------------------*/ inline void TS_DiffStart(void) { if (!TS_Valid) {return;} LastCount = ReadTS(); }