void VideoStream::drop_one_frame() { ASSERT(MAX_VIDEO_FRAMES > 2 && (_frames_head - _frames_tail) == MAX_VIDEO_FRAMES); int frame_index = _frames_head - _kill_mark++ % (MAX_VIDEO_FRAMES - 2) - 2; free_frame(frame_index); while (frame_index != _frames_tail) { --frame_index; _frames[frame_slot(frame_index + 1)] = _frames[frame_slot(frame_index)]; } _frames_tail++; }
uint32_t VideoStream::alloc_frame_slot() { if ((_frames_head - _frames_tail) == MAX_VIDEO_FRAMES) { drop_one_frame(); } return frame_slot(_frames_head++); }
void VideoStream::maintenance() { uint32_t mm_time = _client.get_mm_time(); remove_dead_frames(mm_time); if (!_update_mark && !_update_time && _frames_head != _frames_tail) { VideoFrame* tail = &_frames[frame_slot(_frames_tail)]; ASSERT(tail->compressed_data); uint8_t* data = tail->compressed_data; uint32_t length = tail->compressed_data_size; int got_picture = 0; got_picture =_mjpeg_decoder->decode_data(data, length); if (got_picture) { #ifdef WIN32 _canvas.put_image(_dc, _pixmap, _dest, _clip); #else _canvas.put_image(_pixmap, _dest, _clip); #endif if (is_time_to_display(mm_time, tail->mm_time)) { _update_mark = _channel.invalidate(_dest, true); Platform::yield(); } else { _update_time = tail->mm_time; _channel.stream_update_request(_update_time); } } free_frame(_frames_tail++); } }
void as_environment::add_local ( const tu_string &varname, const as_value &val ) // Add a local var with the given name and value to our // current local frame. Use this when you know the var // doesn't exist yet, since it's faster than set_local(); // e.g. when setting up args for a function. { assert ( varname.length() > 0 ); m_local_frames.push_back ( frame_slot ( varname, val ) ); }
void VideoStream::remove_dead_frames(uint32_t mm_time) { while (_frames_head != _frames_tail) { if (int(_frames[frame_slot(_frames_tail)].mm_time - mm_time) >= MAX_UNDER) { return; } free_frame(_frames_tail); _frames_tail++; } }
void VideoStream::free_frame(uint32_t frame_index) { int slot = frame_slot(frame_index); delete[] _frames[slot].compressed_data; _frames[slot].compressed_data = NULL; }