loggerd: switch to v4l encoder try 2 (#24380)
* start v4l encoder
* v4l encoder starts
* start and stop
* fill in proper controls
* it dequeued a buffer
* getting bytes
* it made a video
* it does make files
* getting close
* ahh, so that's how dequeue works
* qcam works (no remuxing)
* remuxing works
* we just need to make shutdown and rollover graceful
* graceful destruction
* switch to polling
* should work now
* fix pc build
* refactors, stop properly
* touchups, remove a copy
* add v4l encoder to release
* inlcude file
* move writing to it's own thread
* fix minor memory leak
* block instead of dropping frames
* add counter, fix tests maybe
* better debugging and test print
* print file path in assert
* format string in test
* no more oversized qlogs
* match qcam
* touchups, remove omx encoder
* remove omx include files
* checked ioctl, better debugging, open by name
* unused import
* move linux includes to third_party/linux/include
* simple encoderd
* full packet
* encoderd should be complete
* lagging print
* updates
* name dq thread
* subset idx
* video file writing works
* debug
* potential bugfix
* rotation works
* iframe
* keep writing support
* ci should pass
* loggerd, not encoderd
* remote encoder code
* support remote encoder
* cereal to master, add encoderd
* header no longer required
* put that back there
* realtime
* lower decoder latency
* don't use queue for VisionIpcBufExtra, disable realtime again
* assert all written
* hmm simpler
* only push to to_write if we are writing
* assert timestamp is right
* use at and remove assert
* revert to queue
Co-authored-by: Comma Device <device@comma.ai>
old-commit-hash: 0baa4c3e2ad9ee6f8daba8267db44c2cd44caa62
3 years ago
# include <cassert>
# include <string>
loggerd: switch to v4l encoder try 2 (#24380)
* start v4l encoder
* v4l encoder starts
* start and stop
* fill in proper controls
* it dequeued a buffer
* getting bytes
* it made a video
* it does make files
* getting close
* ahh, so that's how dequeue works
* qcam works (no remuxing)
* remuxing works
* we just need to make shutdown and rollover graceful
* graceful destruction
* switch to polling
* should work now
* fix pc build
* refactors, stop properly
* touchups, remove a copy
* add v4l encoder to release
* inlcude file
* move writing to it's own thread
* fix minor memory leak
* block instead of dropping frames
* add counter, fix tests maybe
* better debugging and test print
* print file path in assert
* format string in test
* no more oversized qlogs
* match qcam
* touchups, remove omx encoder
* remove omx include files
* checked ioctl, better debugging, open by name
* unused import
* move linux includes to third_party/linux/include
* simple encoderd
* full packet
* encoderd should be complete
* lagging print
* updates
* name dq thread
* subset idx
* video file writing works
* debug
* potential bugfix
* rotation works
* iframe
* keep writing support
* ci should pass
* loggerd, not encoderd
* remote encoder code
* support remote encoder
* cereal to master, add encoderd
* header no longer required
* put that back there
* realtime
* lower decoder latency
* don't use queue for VisionIpcBufExtra, disable realtime again
* assert all written
* hmm simpler
* only push to to_write if we are writing
* assert timestamp is right
* use at and remove assert
* revert to queue
Co-authored-by: Comma Device <device@comma.ai>
old-commit-hash: 0baa4c3e2ad9ee6f8daba8267db44c2cd44caa62
3 years ago
# include <sys/ioctl.h>
# include <poll.h>
# include "system/loggerd/encoder/v4l_encoder.h"
# include "common/util.h"
# include "common/timing.h"
loggerd: switch to v4l encoder try 2 (#24380)
* start v4l encoder
* v4l encoder starts
* start and stop
* fill in proper controls
* it dequeued a buffer
* getting bytes
* it made a video
* it does make files
* getting close
* ahh, so that's how dequeue works
* qcam works (no remuxing)
* remuxing works
* we just need to make shutdown and rollover graceful
* graceful destruction
* switch to polling
* should work now
* fix pc build
* refactors, stop properly
* touchups, remove a copy
* add v4l encoder to release
* inlcude file
* move writing to it's own thread
* fix minor memory leak
* block instead of dropping frames
* add counter, fix tests maybe
* better debugging and test print
* print file path in assert
* format string in test
* no more oversized qlogs
* match qcam
* touchups, remove omx encoder
* remove omx include files
* checked ioctl, better debugging, open by name
* unused import
* move linux includes to third_party/linux/include
* simple encoderd
* full packet
* encoderd should be complete
* lagging print
* updates
* name dq thread
* subset idx
* video file writing works
* debug
* potential bugfix
* rotation works
* iframe
* keep writing support
* ci should pass
* loggerd, not encoderd
* remote encoder code
* support remote encoder
* cereal to master, add encoderd
* header no longer required
* put that back there
* realtime
* lower decoder latency
* don't use queue for VisionIpcBufExtra, disable realtime again
* assert all written
* hmm simpler
* only push to to_write if we are writing
* assert timestamp is right
* use at and remove assert
* revert to queue
Co-authored-by: Comma Device <device@comma.ai>
old-commit-hash: 0baa4c3e2ad9ee6f8daba8267db44c2cd44caa62
3 years ago
# include "third_party/libyuv/include/libyuv.h"
# include "third_party/linux/include/msm_media_info.h"
loggerd: switch to v4l encoder try 2 (#24380)
* start v4l encoder
* v4l encoder starts
* start and stop
* fill in proper controls
* it dequeued a buffer
* getting bytes
* it made a video
* it does make files
* getting close
* ahh, so that's how dequeue works
* qcam works (no remuxing)
* remuxing works
* we just need to make shutdown and rollover graceful
* graceful destruction
* switch to polling
* should work now
* fix pc build
* refactors, stop properly
* touchups, remove a copy
* add v4l encoder to release
* inlcude file
* move writing to it's own thread
* fix minor memory leak
* block instead of dropping frames
* add counter, fix tests maybe
* better debugging and test print
* print file path in assert
* format string in test
* no more oversized qlogs
* match qcam
* touchups, remove omx encoder
* remove omx include files
* checked ioctl, better debugging, open by name
* unused import
* move linux includes to third_party/linux/include
* simple encoderd
* full packet
* encoderd should be complete
* lagging print
* updates
* name dq thread
* subset idx
* video file writing works
* debug
* potential bugfix
* rotation works
* iframe
* keep writing support
* ci should pass
* loggerd, not encoderd
* remote encoder code
* support remote encoder
* cereal to master, add encoderd
* header no longer required
* put that back there
* realtime
* lower decoder latency
* don't use queue for VisionIpcBufExtra, disable realtime again
* assert all written
* hmm simpler
* only push to to_write if we are writing
* assert timestamp is right
* use at and remove assert
* revert to queue
Co-authored-by: Comma Device <device@comma.ai>
old-commit-hash: 0baa4c3e2ad9ee6f8daba8267db44c2cd44caa62
3 years ago
// has to be in this order
# include "third_party/linux/include/v4l2-controls.h"
loggerd: switch to v4l encoder try 2 (#24380)
* start v4l encoder
* v4l encoder starts
* start and stop
* fill in proper controls
* it dequeued a buffer
* getting bytes
* it made a video
* it does make files
* getting close
* ahh, so that's how dequeue works
* qcam works (no remuxing)
* remuxing works
* we just need to make shutdown and rollover graceful
* graceful destruction
* switch to polling
* should work now
* fix pc build
* refactors, stop properly
* touchups, remove a copy
* add v4l encoder to release
* inlcude file
* move writing to it's own thread
* fix minor memory leak
* block instead of dropping frames
* add counter, fix tests maybe
* better debugging and test print
* print file path in assert
* format string in test
* no more oversized qlogs
* match qcam
* touchups, remove omx encoder
* remove omx include files
* checked ioctl, better debugging, open by name
* unused import
* move linux includes to third_party/linux/include
* simple encoderd
* full packet
* encoderd should be complete
* lagging print
* updates
* name dq thread
* subset idx
* video file writing works
* debug
* potential bugfix
* rotation works
* iframe
* keep writing support
* ci should pass
* loggerd, not encoderd
* remote encoder code
* support remote encoder
* cereal to master, add encoderd
* header no longer required
* put that back there
* realtime
* lower decoder latency
* don't use queue for VisionIpcBufExtra, disable realtime again
* assert all written
* hmm simpler
* only push to to_write if we are writing
* assert timestamp is right
* use at and remove assert
* revert to queue
Co-authored-by: Comma Device <device@comma.ai>
old-commit-hash: 0baa4c3e2ad9ee6f8daba8267db44c2cd44caa62
3 years ago
# include <linux/videodev2.h>
# define V4L2_QCOM_BUF_FLAG_CODECCONFIG 0x00020000
# define V4L2_QCOM_BUF_FLAG_EOS 0x02000000
// echo 0x7fffffff > /sys/kernel/debug/msm_vidc/debug_level
const int env_debug_encoder = ( getenv ( " DEBUG_ENCODER " ) ! = NULL ) ? atoi ( getenv ( " DEBUG_ENCODER " ) ) : 0 ;
static void checked_ioctl ( int fd , unsigned long request , void * argp ) {
int ret = util : : safe_ioctl ( fd , request , argp ) ;
if ( ret ! = 0 ) {
LOGE ( " checked_ioctl failed with error %d (%d %lx %p) " , errno , fd , request , argp ) ;
assert ( 0 ) ;
}
}
loggerd: switch to v4l encoder try 2 (#24380)
* start v4l encoder
* v4l encoder starts
* start and stop
* fill in proper controls
* it dequeued a buffer
* getting bytes
* it made a video
* it does make files
* getting close
* ahh, so that's how dequeue works
* qcam works (no remuxing)
* remuxing works
* we just need to make shutdown and rollover graceful
* graceful destruction
* switch to polling
* should work now
* fix pc build
* refactors, stop properly
* touchups, remove a copy
* add v4l encoder to release
* inlcude file
* move writing to it's own thread
* fix minor memory leak
* block instead of dropping frames
* add counter, fix tests maybe
* better debugging and test print
* print file path in assert
* format string in test
* no more oversized qlogs
* match qcam
* touchups, remove omx encoder
* remove omx include files
* checked ioctl, better debugging, open by name
* unused import
* move linux includes to third_party/linux/include
* simple encoderd
* full packet
* encoderd should be complete
* lagging print
* updates
* name dq thread
* subset idx
* video file writing works
* debug
* potential bugfix
* rotation works
* iframe
* keep writing support
* ci should pass
* loggerd, not encoderd
* remote encoder code
* support remote encoder
* cereal to master, add encoderd
* header no longer required
* put that back there
* realtime
* lower decoder latency
* don't use queue for VisionIpcBufExtra, disable realtime again
* assert all written
* hmm simpler
* only push to to_write if we are writing
* assert timestamp is right
* use at and remove assert
* revert to queue
Co-authored-by: Comma Device <device@comma.ai>
old-commit-hash: 0baa4c3e2ad9ee6f8daba8267db44c2cd44caa62
3 years ago
static void dequeue_buffer ( int fd , v4l2_buf_type buf_type , unsigned int * index = NULL , unsigned int * bytesused = NULL , unsigned int * flags = NULL , struct timeval * timestamp = NULL ) {
v4l2_plane plane = { 0 } ;
v4l2_buffer v4l_buf = {
. type = buf_type ,
. memory = V4L2_MEMORY_USERPTR ,
. m = { . planes = & plane , } ,
. length = 1 ,
} ;
checked_ioctl ( fd , VIDIOC_DQBUF , & v4l_buf ) ;
if ( index ) * index = v4l_buf . index ;
if ( bytesused ) * bytesused = v4l_buf . m . planes [ 0 ] . bytesused ;
if ( flags ) * flags = v4l_buf . flags ;
if ( timestamp ) * timestamp = v4l_buf . timestamp ;
assert ( v4l_buf . m . planes [ 0 ] . data_offset = = 0 ) ;
}
static void queue_buffer ( int fd , v4l2_buf_type buf_type , unsigned int index , VisionBuf * buf , struct timeval timestamp = { } ) {
loggerd: switch to v4l encoder try 2 (#24380)
* start v4l encoder
* v4l encoder starts
* start and stop
* fill in proper controls
* it dequeued a buffer
* getting bytes
* it made a video
* it does make files
* getting close
* ahh, so that's how dequeue works
* qcam works (no remuxing)
* remuxing works
* we just need to make shutdown and rollover graceful
* graceful destruction
* switch to polling
* should work now
* fix pc build
* refactors, stop properly
* touchups, remove a copy
* add v4l encoder to release
* inlcude file
* move writing to it's own thread
* fix minor memory leak
* block instead of dropping frames
* add counter, fix tests maybe
* better debugging and test print
* print file path in assert
* format string in test
* no more oversized qlogs
* match qcam
* touchups, remove omx encoder
* remove omx include files
* checked ioctl, better debugging, open by name
* unused import
* move linux includes to third_party/linux/include
* simple encoderd
* full packet
* encoderd should be complete
* lagging print
* updates
* name dq thread
* subset idx
* video file writing works
* debug
* potential bugfix
* rotation works
* iframe
* keep writing support
* ci should pass
* loggerd, not encoderd
* remote encoder code
* support remote encoder
* cereal to master, add encoderd
* header no longer required
* put that back there
* realtime
* lower decoder latency
* don't use queue for VisionIpcBufExtra, disable realtime again
* assert all written
* hmm simpler
* only push to to_write if we are writing
* assert timestamp is right
* use at and remove assert
* revert to queue
Co-authored-by: Comma Device <device@comma.ai>
old-commit-hash: 0baa4c3e2ad9ee6f8daba8267db44c2cd44caa62
3 years ago
v4l2_plane plane = {
. length = ( unsigned int ) buf - > len ,
. m = { . userptr = ( unsigned long ) buf - > addr , } ,
. bytesused = ( uint32_t ) buf - > len ,
loggerd: switch to v4l encoder try 2 (#24380)
* start v4l encoder
* v4l encoder starts
* start and stop
* fill in proper controls
* it dequeued a buffer
* getting bytes
* it made a video
* it does make files
* getting close
* ahh, so that's how dequeue works
* qcam works (no remuxing)
* remuxing works
* we just need to make shutdown and rollover graceful
* graceful destruction
* switch to polling
* should work now
* fix pc build
* refactors, stop properly
* touchups, remove a copy
* add v4l encoder to release
* inlcude file
* move writing to it's own thread
* fix minor memory leak
* block instead of dropping frames
* add counter, fix tests maybe
* better debugging and test print
* print file path in assert
* format string in test
* no more oversized qlogs
* match qcam
* touchups, remove omx encoder
* remove omx include files
* checked ioctl, better debugging, open by name
* unused import
* move linux includes to third_party/linux/include
* simple encoderd
* full packet
* encoderd should be complete
* lagging print
* updates
* name dq thread
* subset idx
* video file writing works
* debug
* potential bugfix
* rotation works
* iframe
* keep writing support
* ci should pass
* loggerd, not encoderd
* remote encoder code
* support remote encoder
* cereal to master, add encoderd
* header no longer required
* put that back there
* realtime
* lower decoder latency
* don't use queue for VisionIpcBufExtra, disable realtime again
* assert all written
* hmm simpler
* only push to to_write if we are writing
* assert timestamp is right
* use at and remove assert
* revert to queue
Co-authored-by: Comma Device <device@comma.ai>
old-commit-hash: 0baa4c3e2ad9ee6f8daba8267db44c2cd44caa62
3 years ago
. reserved = { ( unsigned int ) buf - > fd }
} ;
v4l2_buffer v4l_buf = {
. type = buf_type ,
. index = index ,
. memory = V4L2_MEMORY_USERPTR ,
. m = { . planes = & plane , } ,
. length = 1 ,
. flags = V4L2_BUF_FLAG_TIMESTAMP_COPY ,
. timestamp = timestamp
} ;
checked_ioctl ( fd , VIDIOC_QBUF , & v4l_buf ) ;
}
static void request_buffers ( int fd , v4l2_buf_type buf_type , unsigned int count ) {
struct v4l2_requestbuffers reqbuf = {
. type = buf_type ,
. memory = V4L2_MEMORY_USERPTR ,
. count = count
} ;
checked_ioctl ( fd , VIDIOC_REQBUFS , & reqbuf ) ;
}
void V4LEncoder : : dequeue_handler ( V4LEncoder * e ) {
std : : string dequeue_thread_name = " dq- " + std : : string ( e - > encoder_info . publish_name ) ;
loggerd: switch to v4l encoder try 2 (#24380)
* start v4l encoder
* v4l encoder starts
* start and stop
* fill in proper controls
* it dequeued a buffer
* getting bytes
* it made a video
* it does make files
* getting close
* ahh, so that's how dequeue works
* qcam works (no remuxing)
* remuxing works
* we just need to make shutdown and rollover graceful
* graceful destruction
* switch to polling
* should work now
* fix pc build
* refactors, stop properly
* touchups, remove a copy
* add v4l encoder to release
* inlcude file
* move writing to it's own thread
* fix minor memory leak
* block instead of dropping frames
* add counter, fix tests maybe
* better debugging and test print
* print file path in assert
* format string in test
* no more oversized qlogs
* match qcam
* touchups, remove omx encoder
* remove omx include files
* checked ioctl, better debugging, open by name
* unused import
* move linux includes to third_party/linux/include
* simple encoderd
* full packet
* encoderd should be complete
* lagging print
* updates
* name dq thread
* subset idx
* video file writing works
* debug
* potential bugfix
* rotation works
* iframe
* keep writing support
* ci should pass
* loggerd, not encoderd
* remote encoder code
* support remote encoder
* cereal to master, add encoderd
* header no longer required
* put that back there
* realtime
* lower decoder latency
* don't use queue for VisionIpcBufExtra, disable realtime again
* assert all written
* hmm simpler
* only push to to_write if we are writing
* assert timestamp is right
* use at and remove assert
* revert to queue
Co-authored-by: Comma Device <device@comma.ai>
old-commit-hash: 0baa4c3e2ad9ee6f8daba8267db44c2cd44caa62
3 years ago
util : : set_thread_name ( dequeue_thread_name . c_str ( ) ) ;
e - > segment_num + + ;
uint32_t idx = - 1 ;
bool exit = false ;
// POLLIN is capture, POLLOUT is frame
struct pollfd pfd ;
pfd . events = POLLIN | POLLOUT ;
pfd . fd = e - > fd ;
// save the header
kj : : Array < capnp : : byte > header ;
while ( ! exit ) {
int rc = poll ( & pfd , 1 , 1000 ) ;
if ( rc < 0 ) {
if ( errno ! = EINTR ) {
// TODO: exit encoder?
// ignore the error and keep going
LOGE ( " poll failed (%d - %d) " , rc , errno ) ;
}
continue ;
} else if ( rc = = 0 ) {
LOGE ( " encoder dequeue poll timeout " ) ;
continue ;
}
loggerd: switch to v4l encoder try 2 (#24380)
* start v4l encoder
* v4l encoder starts
* start and stop
* fill in proper controls
* it dequeued a buffer
* getting bytes
* it made a video
* it does make files
* getting close
* ahh, so that's how dequeue works
* qcam works (no remuxing)
* remuxing works
* we just need to make shutdown and rollover graceful
* graceful destruction
* switch to polling
* should work now
* fix pc build
* refactors, stop properly
* touchups, remove a copy
* add v4l encoder to release
* inlcude file
* move writing to it's own thread
* fix minor memory leak
* block instead of dropping frames
* add counter, fix tests maybe
* better debugging and test print
* print file path in assert
* format string in test
* no more oversized qlogs
* match qcam
* touchups, remove omx encoder
* remove omx include files
* checked ioctl, better debugging, open by name
* unused import
* move linux includes to third_party/linux/include
* simple encoderd
* full packet
* encoderd should be complete
* lagging print
* updates
* name dq thread
* subset idx
* video file writing works
* debug
* potential bugfix
* rotation works
* iframe
* keep writing support
* ci should pass
* loggerd, not encoderd
* remote encoder code
* support remote encoder
* cereal to master, add encoderd
* header no longer required
* put that back there
* realtime
* lower decoder latency
* don't use queue for VisionIpcBufExtra, disable realtime again
* assert all written
* hmm simpler
* only push to to_write if we are writing
* assert timestamp is right
* use at and remove assert
* revert to queue
Co-authored-by: Comma Device <device@comma.ai>
old-commit-hash: 0baa4c3e2ad9ee6f8daba8267db44c2cd44caa62
3 years ago
if ( env_debug_encoder > = 2 ) {
printf ( " %20s poll %x at %.2f ms \n " , e - > encoder_info . publish_name , pfd . revents , millis_since_boot ( ) ) ;
loggerd: switch to v4l encoder try 2 (#24380)
* start v4l encoder
* v4l encoder starts
* start and stop
* fill in proper controls
* it dequeued a buffer
* getting bytes
* it made a video
* it does make files
* getting close
* ahh, so that's how dequeue works
* qcam works (no remuxing)
* remuxing works
* we just need to make shutdown and rollover graceful
* graceful destruction
* switch to polling
* should work now
* fix pc build
* refactors, stop properly
* touchups, remove a copy
* add v4l encoder to release
* inlcude file
* move writing to it's own thread
* fix minor memory leak
* block instead of dropping frames
* add counter, fix tests maybe
* better debugging and test print
* print file path in assert
* format string in test
* no more oversized qlogs
* match qcam
* touchups, remove omx encoder
* remove omx include files
* checked ioctl, better debugging, open by name
* unused import
* move linux includes to third_party/linux/include
* simple encoderd
* full packet
* encoderd should be complete
* lagging print
* updates
* name dq thread
* subset idx
* video file writing works
* debug
* potential bugfix
* rotation works
* iframe
* keep writing support
* ci should pass
* loggerd, not encoderd
* remote encoder code
* support remote encoder
* cereal to master, add encoderd
* header no longer required
* put that back there
* realtime
* lower decoder latency
* don't use queue for VisionIpcBufExtra, disable realtime again
* assert all written
* hmm simpler
* only push to to_write if we are writing
* assert timestamp is right
* use at and remove assert
* revert to queue
Co-authored-by: Comma Device <device@comma.ai>
old-commit-hash: 0baa4c3e2ad9ee6f8daba8267db44c2cd44caa62
3 years ago
}
int frame_id = - 1 ;
if ( pfd . revents & POLLIN ) {
unsigned int bytesused , flags , index ;
struct timeval timestamp ;
dequeue_buffer ( e - > fd , V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE , & index , & bytesused , & flags , & timestamp ) ;
e - > buf_out [ index ] . sync ( VISIONBUF_SYNC_FROM_DEVICE ) ;
uint8_t * buf = ( uint8_t * ) e - > buf_out [ index ] . addr ;
int64_t ts = timestamp . tv_sec * 1000000 + timestamp . tv_usec ;
// eof packet, we exit
if ( flags & V4L2_QCOM_BUF_FLAG_EOS ) {
exit = true ;
} else if ( flags & V4L2_QCOM_BUF_FLAG_CODECCONFIG ) {
// save header
header = kj : : heapArray < capnp : : byte > ( buf , bytesused ) ;
} else {
VisionIpcBufExtra extra = e - > extras . pop ( ) ;
assert ( extra . timestamp_eof / 1000 = = ts ) ; // stay in sync
frame_id = extra . frame_id ;
+ + idx ;
e - > publisher_publish ( e , e - > segment_num , idx , extra , flags , header , kj : : arrayPtr < capnp : : byte > ( buf , bytesused ) ) ;
loggerd: switch to v4l encoder try 2 (#24380)
* start v4l encoder
* v4l encoder starts
* start and stop
* fill in proper controls
* it dequeued a buffer
* getting bytes
* it made a video
* it does make files
* getting close
* ahh, so that's how dequeue works
* qcam works (no remuxing)
* remuxing works
* we just need to make shutdown and rollover graceful
* graceful destruction
* switch to polling
* should work now
* fix pc build
* refactors, stop properly
* touchups, remove a copy
* add v4l encoder to release
* inlcude file
* move writing to it's own thread
* fix minor memory leak
* block instead of dropping frames
* add counter, fix tests maybe
* better debugging and test print
* print file path in assert
* format string in test
* no more oversized qlogs
* match qcam
* touchups, remove omx encoder
* remove omx include files
* checked ioctl, better debugging, open by name
* unused import
* move linux includes to third_party/linux/include
* simple encoderd
* full packet
* encoderd should be complete
* lagging print
* updates
* name dq thread
* subset idx
* video file writing works
* debug
* potential bugfix
* rotation works
* iframe
* keep writing support
* ci should pass
* loggerd, not encoderd
* remote encoder code
* support remote encoder
* cereal to master, add encoderd
* header no longer required
* put that back there
* realtime
* lower decoder latency
* don't use queue for VisionIpcBufExtra, disable realtime again
* assert all written
* hmm simpler
* only push to to_write if we are writing
* assert timestamp is right
* use at and remove assert
* revert to queue
Co-authored-by: Comma Device <device@comma.ai>
old-commit-hash: 0baa4c3e2ad9ee6f8daba8267db44c2cd44caa62
3 years ago
}
if ( env_debug_encoder ) {
printf ( " %20s got(%d) %6d bytes flags %8x idx %3d/%4d id %8d ts %ld lat %.2f ms (%lu frames free) \n " ,
e - > encoder_info . publish_name , index , bytesused , flags , e - > segment_num , idx , frame_id , ts , millis_since_boot ( ) - ( ts / 1000. ) , e - > free_buf_in . size ( ) ) ;
loggerd: switch to v4l encoder try 2 (#24380)
* start v4l encoder
* v4l encoder starts
* start and stop
* fill in proper controls
* it dequeued a buffer
* getting bytes
* it made a video
* it does make files
* getting close
* ahh, so that's how dequeue works
* qcam works (no remuxing)
* remuxing works
* we just need to make shutdown and rollover graceful
* graceful destruction
* switch to polling
* should work now
* fix pc build
* refactors, stop properly
* touchups, remove a copy
* add v4l encoder to release
* inlcude file
* move writing to it's own thread
* fix minor memory leak
* block instead of dropping frames
* add counter, fix tests maybe
* better debugging and test print
* print file path in assert
* format string in test
* no more oversized qlogs
* match qcam
* touchups, remove omx encoder
* remove omx include files
* checked ioctl, better debugging, open by name
* unused import
* move linux includes to third_party/linux/include
* simple encoderd
* full packet
* encoderd should be complete
* lagging print
* updates
* name dq thread
* subset idx
* video file writing works
* debug
* potential bugfix
* rotation works
* iframe
* keep writing support
* ci should pass
* loggerd, not encoderd
* remote encoder code
* support remote encoder
* cereal to master, add encoderd
* header no longer required
* put that back there
* realtime
* lower decoder latency
* don't use queue for VisionIpcBufExtra, disable realtime again
* assert all written
* hmm simpler
* only push to to_write if we are writing
* assert timestamp is right
* use at and remove assert
* revert to queue
Co-authored-by: Comma Device <device@comma.ai>
old-commit-hash: 0baa4c3e2ad9ee6f8daba8267db44c2cd44caa62
3 years ago
}
// requeue the buffer
queue_buffer ( e - > fd , V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE , index , & e - > buf_out [ index ] ) ;
}
if ( pfd . revents & POLLOUT ) {
unsigned int index ;
dequeue_buffer ( e - > fd , V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE , & index ) ;
e - > free_buf_in . push ( index ) ;
}
}
}
V4LEncoder : : V4LEncoder ( const EncoderInfo & encoder_info , int in_width , int in_height )
: VideoEncoder ( encoder_info , in_width , in_height ) {
loggerd: switch to v4l encoder try 2 (#24380)
* start v4l encoder
* v4l encoder starts
* start and stop
* fill in proper controls
* it dequeued a buffer
* getting bytes
* it made a video
* it does make files
* getting close
* ahh, so that's how dequeue works
* qcam works (no remuxing)
* remuxing works
* we just need to make shutdown and rollover graceful
* graceful destruction
* switch to polling
* should work now
* fix pc build
* refactors, stop properly
* touchups, remove a copy
* add v4l encoder to release
* inlcude file
* move writing to it's own thread
* fix minor memory leak
* block instead of dropping frames
* add counter, fix tests maybe
* better debugging and test print
* print file path in assert
* format string in test
* no more oversized qlogs
* match qcam
* touchups, remove omx encoder
* remove omx include files
* checked ioctl, better debugging, open by name
* unused import
* move linux includes to third_party/linux/include
* simple encoderd
* full packet
* encoderd should be complete
* lagging print
* updates
* name dq thread
* subset idx
* video file writing works
* debug
* potential bugfix
* rotation works
* iframe
* keep writing support
* ci should pass
* loggerd, not encoderd
* remote encoder code
* support remote encoder
* cereal to master, add encoderd
* header no longer required
* put that back there
* realtime
* lower decoder latency
* don't use queue for VisionIpcBufExtra, disable realtime again
* assert all written
* hmm simpler
* only push to to_write if we are writing
* assert timestamp is right
* use at and remove assert
* revert to queue
Co-authored-by: Comma Device <device@comma.ai>
old-commit-hash: 0baa4c3e2ad9ee6f8daba8267db44c2cd44caa62
3 years ago
fd = open ( " /dev/v4l/by-path/platform-aa00000.qcom_vidc-video-index1 " , O_RDWR | O_NONBLOCK ) ;
assert ( fd > = 0 ) ;
struct v4l2_capability cap ;
checked_ioctl ( fd , VIDIOC_QUERYCAP , & cap ) ;
LOGD ( " opened encoder device %s %s = %d " , cap . driver , cap . card , fd ) ;
assert ( strcmp ( ( const char * ) cap . driver , " msm_vidc_driver " ) = = 0 ) ;
assert ( strcmp ( ( const char * ) cap . card , " msm_vidc_venc " ) = = 0 ) ;
struct v4l2_format fmt_out = {
. type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE ,
. fmt = {
. pix_mp = {
// downscales are free with v4l
. width = ( unsigned int ) encoder_info . frame_width ,
. height = ( unsigned int ) encoder_info . frame_height ,
. pixelformat = ( encoder_info . encode_type = = cereal : : EncodeIndex : : Type : : FULL_H_E_V_C ) ? V4L2_PIX_FMT_HEVC : V4L2_PIX_FMT_H264 ,
loggerd: switch to v4l encoder try 2 (#24380)
* start v4l encoder
* v4l encoder starts
* start and stop
* fill in proper controls
* it dequeued a buffer
* getting bytes
* it made a video
* it does make files
* getting close
* ahh, so that's how dequeue works
* qcam works (no remuxing)
* remuxing works
* we just need to make shutdown and rollover graceful
* graceful destruction
* switch to polling
* should work now
* fix pc build
* refactors, stop properly
* touchups, remove a copy
* add v4l encoder to release
* inlcude file
* move writing to it's own thread
* fix minor memory leak
* block instead of dropping frames
* add counter, fix tests maybe
* better debugging and test print
* print file path in assert
* format string in test
* no more oversized qlogs
* match qcam
* touchups, remove omx encoder
* remove omx include files
* checked ioctl, better debugging, open by name
* unused import
* move linux includes to third_party/linux/include
* simple encoderd
* full packet
* encoderd should be complete
* lagging print
* updates
* name dq thread
* subset idx
* video file writing works
* debug
* potential bugfix
* rotation works
* iframe
* keep writing support
* ci should pass
* loggerd, not encoderd
* remote encoder code
* support remote encoder
* cereal to master, add encoderd
* header no longer required
* put that back there
* realtime
* lower decoder latency
* don't use queue for VisionIpcBufExtra, disable realtime again
* assert all written
* hmm simpler
* only push to to_write if we are writing
* assert timestamp is right
* use at and remove assert
* revert to queue
Co-authored-by: Comma Device <device@comma.ai>
old-commit-hash: 0baa4c3e2ad9ee6f8daba8267db44c2cd44caa62
3 years ago
. field = V4L2_FIELD_ANY ,
. colorspace = V4L2_COLORSPACE_DEFAULT ,
}
}
} ;
checked_ioctl ( fd , VIDIOC_S_FMT , & fmt_out ) ;
v4l2_streamparm streamparm = {
. type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE ,
. parm = {
. output = {
// TODO: more stuff here? we don't know
. timeperframe = {
. numerator = 1 ,
. denominator = 20
}
}
}
} ;
checked_ioctl ( fd , VIDIOC_S_PARM , & streamparm ) ;
struct v4l2_format fmt_in = {
. type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE ,
. fmt = {
. pix_mp = {
. width = ( unsigned int ) in_width ,
. height = ( unsigned int ) in_height ,
. pixelformat = V4L2_PIX_FMT_NV12 ,
. field = V4L2_FIELD_ANY ,
. colorspace = V4L2_COLORSPACE_470_SYSTEM_BG ,
}
}
} ;
checked_ioctl ( fd , VIDIOC_S_FMT , & fmt_in ) ;
LOGD ( " in buffer size %d, out buffer size %d " ,
fmt_in . fmt . pix_mp . plane_fmt [ 0 ] . sizeimage ,
fmt_out . fmt . pix_mp . plane_fmt [ 0 ] . sizeimage ) ;
// shared ctrls
{
struct v4l2_control ctrls [ ] = {
{ . id = V4L2_CID_MPEG_VIDEO_HEADER_MODE , . value = V4L2_MPEG_VIDEO_HEADER_MODE_SEPARATE } ,
{ . id = V4L2_CID_MPEG_VIDEO_BITRATE , . value = encoder_info . bitrate } ,
loggerd: switch to v4l encoder try 2 (#24380)
* start v4l encoder
* v4l encoder starts
* start and stop
* fill in proper controls
* it dequeued a buffer
* getting bytes
* it made a video
* it does make files
* getting close
* ahh, so that's how dequeue works
* qcam works (no remuxing)
* remuxing works
* we just need to make shutdown and rollover graceful
* graceful destruction
* switch to polling
* should work now
* fix pc build
* refactors, stop properly
* touchups, remove a copy
* add v4l encoder to release
* inlcude file
* move writing to it's own thread
* fix minor memory leak
* block instead of dropping frames
* add counter, fix tests maybe
* better debugging and test print
* print file path in assert
* format string in test
* no more oversized qlogs
* match qcam
* touchups, remove omx encoder
* remove omx include files
* checked ioctl, better debugging, open by name
* unused import
* move linux includes to third_party/linux/include
* simple encoderd
* full packet
* encoderd should be complete
* lagging print
* updates
* name dq thread
* subset idx
* video file writing works
* debug
* potential bugfix
* rotation works
* iframe
* keep writing support
* ci should pass
* loggerd, not encoderd
* remote encoder code
* support remote encoder
* cereal to master, add encoderd
* header no longer required
* put that back there
* realtime
* lower decoder latency
* don't use queue for VisionIpcBufExtra, disable realtime again
* assert all written
* hmm simpler
* only push to to_write if we are writing
* assert timestamp is right
* use at and remove assert
* revert to queue
Co-authored-by: Comma Device <device@comma.ai>
old-commit-hash: 0baa4c3e2ad9ee6f8daba8267db44c2cd44caa62
3 years ago
{ . id = V4L2_CID_MPEG_VIDC_VIDEO_RATE_CONTROL , . value = V4L2_CID_MPEG_VIDC_VIDEO_RATE_CONTROL_VBR_CFR } ,
{ . id = V4L2_CID_MPEG_VIDC_VIDEO_PRIORITY , . value = V4L2_MPEG_VIDC_VIDEO_PRIORITY_REALTIME_DISABLE } ,
{ . id = V4L2_CID_MPEG_VIDC_VIDEO_IDR_PERIOD , . value = 1 } ,
} ;
for ( auto ctrl : ctrls ) {
checked_ioctl ( fd , VIDIOC_S_CTRL , & ctrl ) ;
}
}
if ( encoder_info . encode_type = = cereal : : EncodeIndex : : Type : : FULL_H_E_V_C ) {
loggerd: switch to v4l encoder try 2 (#24380)
* start v4l encoder
* v4l encoder starts
* start and stop
* fill in proper controls
* it dequeued a buffer
* getting bytes
* it made a video
* it does make files
* getting close
* ahh, so that's how dequeue works
* qcam works (no remuxing)
* remuxing works
* we just need to make shutdown and rollover graceful
* graceful destruction
* switch to polling
* should work now
* fix pc build
* refactors, stop properly
* touchups, remove a copy
* add v4l encoder to release
* inlcude file
* move writing to it's own thread
* fix minor memory leak
* block instead of dropping frames
* add counter, fix tests maybe
* better debugging and test print
* print file path in assert
* format string in test
* no more oversized qlogs
* match qcam
* touchups, remove omx encoder
* remove omx include files
* checked ioctl, better debugging, open by name
* unused import
* move linux includes to third_party/linux/include
* simple encoderd
* full packet
* encoderd should be complete
* lagging print
* updates
* name dq thread
* subset idx
* video file writing works
* debug
* potential bugfix
* rotation works
* iframe
* keep writing support
* ci should pass
* loggerd, not encoderd
* remote encoder code
* support remote encoder
* cereal to master, add encoderd
* header no longer required
* put that back there
* realtime
* lower decoder latency
* don't use queue for VisionIpcBufExtra, disable realtime again
* assert all written
* hmm simpler
* only push to to_write if we are writing
* assert timestamp is right
* use at and remove assert
* revert to queue
Co-authored-by: Comma Device <device@comma.ai>
old-commit-hash: 0baa4c3e2ad9ee6f8daba8267db44c2cd44caa62
3 years ago
struct v4l2_control ctrls [ ] = {
{ . id = V4L2_CID_MPEG_VIDC_VIDEO_HEVC_PROFILE , . value = V4L2_MPEG_VIDC_VIDEO_HEVC_PROFILE_MAIN } ,
{ . id = V4L2_CID_MPEG_VIDC_VIDEO_HEVC_TIER_LEVEL , . value = V4L2_MPEG_VIDC_VIDEO_HEVC_LEVEL_HIGH_TIER_LEVEL_5 } ,
{ . id = V4L2_CID_MPEG_VIDC_VIDEO_VUI_TIMING_INFO , . value = V4L2_MPEG_VIDC_VIDEO_VUI_TIMING_INFO_ENABLED } ,
loggerd: switch to v4l encoder try 2 (#24380)
* start v4l encoder
* v4l encoder starts
* start and stop
* fill in proper controls
* it dequeued a buffer
* getting bytes
* it made a video
* it does make files
* getting close
* ahh, so that's how dequeue works
* qcam works (no remuxing)
* remuxing works
* we just need to make shutdown and rollover graceful
* graceful destruction
* switch to polling
* should work now
* fix pc build
* refactors, stop properly
* touchups, remove a copy
* add v4l encoder to release
* inlcude file
* move writing to it's own thread
* fix minor memory leak
* block instead of dropping frames
* add counter, fix tests maybe
* better debugging and test print
* print file path in assert
* format string in test
* no more oversized qlogs
* match qcam
* touchups, remove omx encoder
* remove omx include files
* checked ioctl, better debugging, open by name
* unused import
* move linux includes to third_party/linux/include
* simple encoderd
* full packet
* encoderd should be complete
* lagging print
* updates
* name dq thread
* subset idx
* video file writing works
* debug
* potential bugfix
* rotation works
* iframe
* keep writing support
* ci should pass
* loggerd, not encoderd
* remote encoder code
* support remote encoder
* cereal to master, add encoderd
* header no longer required
* put that back there
* realtime
* lower decoder latency
* don't use queue for VisionIpcBufExtra, disable realtime again
* assert all written
* hmm simpler
* only push to to_write if we are writing
* assert timestamp is right
* use at and remove assert
* revert to queue
Co-authored-by: Comma Device <device@comma.ai>
old-commit-hash: 0baa4c3e2ad9ee6f8daba8267db44c2cd44caa62
3 years ago
{ . id = V4L2_CID_MPEG_VIDC_VIDEO_NUM_P_FRAMES , . value = 29 } ,
{ . id = V4L2_CID_MPEG_VIDC_VIDEO_NUM_B_FRAMES , . value = 0 } ,
} ;
for ( auto ctrl : ctrls ) {
checked_ioctl ( fd , VIDIOC_S_CTRL , & ctrl ) ;
}
} else {
struct v4l2_control ctrls [ ] = {
{ . id = V4L2_CID_MPEG_VIDEO_H264_PROFILE , . value = V4L2_MPEG_VIDEO_H264_PROFILE_HIGH } ,
{ . id = V4L2_CID_MPEG_VIDEO_H264_LEVEL , . value = V4L2_MPEG_VIDEO_H264_LEVEL_UNKNOWN } ,
{ . id = V4L2_CID_MPEG_VIDC_VIDEO_NUM_P_FRAMES , . value = 14 } ,
loggerd: switch to v4l encoder try 2 (#24380)
* start v4l encoder
* v4l encoder starts
* start and stop
* fill in proper controls
* it dequeued a buffer
* getting bytes
* it made a video
* it does make files
* getting close
* ahh, so that's how dequeue works
* qcam works (no remuxing)
* remuxing works
* we just need to make shutdown and rollover graceful
* graceful destruction
* switch to polling
* should work now
* fix pc build
* refactors, stop properly
* touchups, remove a copy
* add v4l encoder to release
* inlcude file
* move writing to it's own thread
* fix minor memory leak
* block instead of dropping frames
* add counter, fix tests maybe
* better debugging and test print
* print file path in assert
* format string in test
* no more oversized qlogs
* match qcam
* touchups, remove omx encoder
* remove omx include files
* checked ioctl, better debugging, open by name
* unused import
* move linux includes to third_party/linux/include
* simple encoderd
* full packet
* encoderd should be complete
* lagging print
* updates
* name dq thread
* subset idx
* video file writing works
* debug
* potential bugfix
* rotation works
* iframe
* keep writing support
* ci should pass
* loggerd, not encoderd
* remote encoder code
* support remote encoder
* cereal to master, add encoderd
* header no longer required
* put that back there
* realtime
* lower decoder latency
* don't use queue for VisionIpcBufExtra, disable realtime again
* assert all written
* hmm simpler
* only push to to_write if we are writing
* assert timestamp is right
* use at and remove assert
* revert to queue
Co-authored-by: Comma Device <device@comma.ai>
old-commit-hash: 0baa4c3e2ad9ee6f8daba8267db44c2cd44caa62
3 years ago
{ . id = V4L2_CID_MPEG_VIDC_VIDEO_NUM_B_FRAMES , . value = 0 } ,
{ . id = V4L2_CID_MPEG_VIDEO_H264_ENTROPY_MODE , . value = V4L2_MPEG_VIDEO_H264_ENTROPY_MODE_CABAC } ,
{ . id = V4L2_CID_MPEG_VIDC_VIDEO_H264_CABAC_MODEL , . value = V4L2_CID_MPEG_VIDC_VIDEO_H264_CABAC_MODEL_0 } ,
{ . id = V4L2_CID_MPEG_VIDEO_H264_LOOP_FILTER_MODE , . value = 0 } ,
{ . id = V4L2_CID_MPEG_VIDEO_H264_LOOP_FILTER_ALPHA , . value = 0 } ,
{ . id = V4L2_CID_MPEG_VIDEO_H264_LOOP_FILTER_BETA , . value = 0 } ,
{ . id = V4L2_CID_MPEG_VIDEO_MULTI_SLICE_MODE , . value = 0 } ,
} ;
for ( auto ctrl : ctrls ) {
checked_ioctl ( fd , VIDIOC_S_CTRL , & ctrl ) ;
}
}
// allocate buffers
request_buffers ( fd , V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE , BUF_OUT_COUNT ) ;
request_buffers ( fd , V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE , BUF_IN_COUNT ) ;
// start encoder
v4l2_buf_type buf_type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE ;
checked_ioctl ( fd , VIDIOC_STREAMON , & buf_type ) ;
buf_type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE ;
checked_ioctl ( fd , VIDIOC_STREAMON , & buf_type ) ;
// queue up output buffers
for ( unsigned int i = 0 ; i < BUF_OUT_COUNT ; i + + ) {
buf_out [ i ] . allocate ( fmt_out . fmt . pix_mp . plane_fmt [ 0 ] . sizeimage ) ;
queue_buffer ( fd , V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE , i , & buf_out [ i ] ) ;
}
// queue up input buffers
for ( unsigned int i = 0 ; i < BUF_IN_COUNT ; i + + ) {
free_buf_in . push ( i ) ;
}
}
void V4LEncoder : : encoder_open ( const char * path ) {
dequeue_handler_thread = std : : thread ( V4LEncoder : : dequeue_handler , this ) ;
this - > is_open = true ;
this - > counter = 0 ;
}
int V4LEncoder : : encode_frame ( VisionBuf * buf , VisionIpcBufExtra * extra ) {
loggerd: switch to v4l encoder try 2 (#24380)
* start v4l encoder
* v4l encoder starts
* start and stop
* fill in proper controls
* it dequeued a buffer
* getting bytes
* it made a video
* it does make files
* getting close
* ahh, so that's how dequeue works
* qcam works (no remuxing)
* remuxing works
* we just need to make shutdown and rollover graceful
* graceful destruction
* switch to polling
* should work now
* fix pc build
* refactors, stop properly
* touchups, remove a copy
* add v4l encoder to release
* inlcude file
* move writing to it's own thread
* fix minor memory leak
* block instead of dropping frames
* add counter, fix tests maybe
* better debugging and test print
* print file path in assert
* format string in test
* no more oversized qlogs
* match qcam
* touchups, remove omx encoder
* remove omx include files
* checked ioctl, better debugging, open by name
* unused import
* move linux includes to third_party/linux/include
* simple encoderd
* full packet
* encoderd should be complete
* lagging print
* updates
* name dq thread
* subset idx
* video file writing works
* debug
* potential bugfix
* rotation works
* iframe
* keep writing support
* ci should pass
* loggerd, not encoderd
* remote encoder code
* support remote encoder
* cereal to master, add encoderd
* header no longer required
* put that back there
* realtime
* lower decoder latency
* don't use queue for VisionIpcBufExtra, disable realtime again
* assert all written
* hmm simpler
* only push to to_write if we are writing
* assert timestamp is right
* use at and remove assert
* revert to queue
Co-authored-by: Comma Device <device@comma.ai>
old-commit-hash: 0baa4c3e2ad9ee6f8daba8267db44c2cd44caa62
3 years ago
struct timeval timestamp {
. tv_sec = ( long ) ( extra - > timestamp_eof / 1000000000 ) ,
. tv_usec = ( long ) ( ( extra - > timestamp_eof / 1000 ) % 1000000 ) ,
} ;
// reserve buffer
int buffer_in = free_buf_in . pop ( ) ;
loggerd: switch to v4l encoder try 2 (#24380)
* start v4l encoder
* v4l encoder starts
* start and stop
* fill in proper controls
* it dequeued a buffer
* getting bytes
* it made a video
* it does make files
* getting close
* ahh, so that's how dequeue works
* qcam works (no remuxing)
* remuxing works
* we just need to make shutdown and rollover graceful
* graceful destruction
* switch to polling
* should work now
* fix pc build
* refactors, stop properly
* touchups, remove a copy
* add v4l encoder to release
* inlcude file
* move writing to it's own thread
* fix minor memory leak
* block instead of dropping frames
* add counter, fix tests maybe
* better debugging and test print
* print file path in assert
* format string in test
* no more oversized qlogs
* match qcam
* touchups, remove omx encoder
* remove omx include files
* checked ioctl, better debugging, open by name
* unused import
* move linux includes to third_party/linux/include
* simple encoderd
* full packet
* encoderd should be complete
* lagging print
* updates
* name dq thread
* subset idx
* video file writing works
* debug
* potential bugfix
* rotation works
* iframe
* keep writing support
* ci should pass
* loggerd, not encoderd
* remote encoder code
* support remote encoder
* cereal to master, add encoderd
* header no longer required
* put that back there
* realtime
* lower decoder latency
* don't use queue for VisionIpcBufExtra, disable realtime again
* assert all written
* hmm simpler
* only push to to_write if we are writing
* assert timestamp is right
* use at and remove assert
* revert to queue
Co-authored-by: Comma Device <device@comma.ai>
old-commit-hash: 0baa4c3e2ad9ee6f8daba8267db44c2cd44caa62
3 years ago
// push buffer
extras . push ( * extra ) ;
//buf->sync(VISIONBUF_SYNC_TO_DEVICE);
queue_buffer ( fd , V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE , buffer_in , buf , timestamp ) ;
loggerd: switch to v4l encoder try 2 (#24380)
* start v4l encoder
* v4l encoder starts
* start and stop
* fill in proper controls
* it dequeued a buffer
* getting bytes
* it made a video
* it does make files
* getting close
* ahh, so that's how dequeue works
* qcam works (no remuxing)
* remuxing works
* we just need to make shutdown and rollover graceful
* graceful destruction
* switch to polling
* should work now
* fix pc build
* refactors, stop properly
* touchups, remove a copy
* add v4l encoder to release
* inlcude file
* move writing to it's own thread
* fix minor memory leak
* block instead of dropping frames
* add counter, fix tests maybe
* better debugging and test print
* print file path in assert
* format string in test
* no more oversized qlogs
* match qcam
* touchups, remove omx encoder
* remove omx include files
* checked ioctl, better debugging, open by name
* unused import
* move linux includes to third_party/linux/include
* simple encoderd
* full packet
* encoderd should be complete
* lagging print
* updates
* name dq thread
* subset idx
* video file writing works
* debug
* potential bugfix
* rotation works
* iframe
* keep writing support
* ci should pass
* loggerd, not encoderd
* remote encoder code
* support remote encoder
* cereal to master, add encoderd
* header no longer required
* put that back there
* realtime
* lower decoder latency
* don't use queue for VisionIpcBufExtra, disable realtime again
* assert all written
* hmm simpler
* only push to to_write if we are writing
* assert timestamp is right
* use at and remove assert
* revert to queue
Co-authored-by: Comma Device <device@comma.ai>
old-commit-hash: 0baa4c3e2ad9ee6f8daba8267db44c2cd44caa62
3 years ago
return this - > counter + + ;
}
void V4LEncoder : : encoder_close ( ) {
if ( this - > is_open ) {
// pop all the frames before closing, then put the buffers back
for ( int i = 0 ; i < BUF_IN_COUNT ; i + + ) free_buf_in . pop ( ) ;
for ( int i = 0 ; i < BUF_IN_COUNT ; i + + ) free_buf_in . push ( i ) ;
// no frames, stop the encoder
struct v4l2_encoder_cmd encoder_cmd = { . cmd = V4L2_ENC_CMD_STOP } ;
checked_ioctl ( fd , VIDIOC_ENCODER_CMD , & encoder_cmd ) ;
// join waits for V4L2_QCOM_BUF_FLAG_EOS
dequeue_handler_thread . join ( ) ;
assert ( extras . empty ( ) ) ;
}
this - > is_open = false ;
}
V4LEncoder : : ~ V4LEncoder ( ) {
encoder_close ( ) ;
v4l2_buf_type buf_type = V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE ;
checked_ioctl ( fd , VIDIOC_STREAMOFF , & buf_type ) ;
request_buffers ( fd , V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE , 0 ) ;
buf_type = V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE ;
checked_ioctl ( fd , VIDIOC_STREAMOFF , & buf_type ) ;
request_buffers ( fd , V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE , 0 ) ;
close ( fd ) ;
for ( int i = 0 ; i < BUF_OUT_COUNT ; i + + ) {
if ( buf_out [ i ] . free ( ) ! = 0 ) {
LOGE ( " Failed to free buffer " ) ;
}
}
loggerd: switch to v4l encoder try 2 (#24380)
* start v4l encoder
* v4l encoder starts
* start and stop
* fill in proper controls
* it dequeued a buffer
* getting bytes
* it made a video
* it does make files
* getting close
* ahh, so that's how dequeue works
* qcam works (no remuxing)
* remuxing works
* we just need to make shutdown and rollover graceful
* graceful destruction
* switch to polling
* should work now
* fix pc build
* refactors, stop properly
* touchups, remove a copy
* add v4l encoder to release
* inlcude file
* move writing to it's own thread
* fix minor memory leak
* block instead of dropping frames
* add counter, fix tests maybe
* better debugging and test print
* print file path in assert
* format string in test
* no more oversized qlogs
* match qcam
* touchups, remove omx encoder
* remove omx include files
* checked ioctl, better debugging, open by name
* unused import
* move linux includes to third_party/linux/include
* simple encoderd
* full packet
* encoderd should be complete
* lagging print
* updates
* name dq thread
* subset idx
* video file writing works
* debug
* potential bugfix
* rotation works
* iframe
* keep writing support
* ci should pass
* loggerd, not encoderd
* remote encoder code
* support remote encoder
* cereal to master, add encoderd
* header no longer required
* put that back there
* realtime
* lower decoder latency
* don't use queue for VisionIpcBufExtra, disable realtime again
* assert all written
* hmm simpler
* only push to to_write if we are writing
* assert timestamp is right
* use at and remove assert
* revert to queue
Co-authored-by: Comma Device <device@comma.ai>
old-commit-hash: 0baa4c3e2ad9ee6f8daba8267db44c2cd44caa62
3 years ago
}