workarouns for omx

This commit is contained in:
Isaac Connor 2018-02-22 11:43:04 -05:00
parent 83785ac73f
commit 84b42ef4d7
3 changed files with 18 additions and 9 deletions

View File

@ -465,6 +465,7 @@ void Event::AddPacket( ZMPacket *packet, int score, Image *alarm_image ) {
have_video_keyframe = have_video_keyframe || ( ( packet->codec_type == AVMEDIA_TYPE_VIDEO ) && packet->keyframe );
if ( videoStore ) {
if ( have_video_keyframe ) {
Debug(2,"Have video keyframe, writing packet to videostore");
videoStore->writePacket( packet );
} else {
Debug(2, "No video keyframe yet, not writing");

View File

@ -2135,6 +2135,7 @@ AVStream *LocalCamera::get_VideoStream() {
AVFormatContext *oc = avformat_alloc_context();
video_stream = avformat_new_stream( oc, NULL );
if ( video_stream ) {
video_stream->time_base = (AVRational){1, 1000000}; // microseconds as base frame rate
#if LIBAVCODEC_VERSION_CHECK(57, 64, 0, 64, 0)
video_stream->codecpar->width = width;
video_stream->codecpar->height = height;

View File

@ -200,6 +200,7 @@ Debug(2,"Using mjpeg");
}
video_out_ctx->pix_fmt = pf;
video_out_ctx->level = 32;
} else {
Error("Unsupported output codec selected");
@ -268,16 +269,20 @@ Debug(2,"Using mjpeg");
}
/* video time_base can be set to whatever is handy and supported by encoder */
video_out_ctx->time_base = (AVRational){1, 1000000}; // microseconds as base frame rate
video_out_ctx->gop_size = 12;
video_out_ctx->qmin = 10;
video_out_ctx->qmax = 51;
video_out_ctx->qcompress = 0.6;
//video_out_ctx->bit_rate = 4000000;
//video_out_ctx->time_base = (AVRational){1, 1000000}; // microseconds as base frame rate
video_out_ctx->time_base = (AVRational){1, 30}; // microseconds as base frame rate
video_out_ctx->framerate = (AVRational){30,1};
//video_out_ctx->gop_size = 12;
//video_out_ctx->qmin = 10;
//video_out_ctx->qmax = 51;
//video_out_ctx->qcompress = 0.6;
video_out_ctx->bit_rate = 400*1024;
video_out_ctx->thread_count = 0;
if ( video_out_ctx->codec_id == AV_CODEC_ID_H264 ) {
video_out_ctx->max_b_frames = 1;
if ( video_out_ctx->priv_data ) {
av_opt_set(video_out_ctx->priv_data, "crf", "1", AV_OPT_SEARCH_CHILDREN);
av_opt_set(video_out_ctx->priv_data, "crf", "1", AV_OPT_SEARCH_CHILDREN);
//av_opt_set(video_out_ctx->priv_data, "preset", "ultrafast", 0);
} else {
Debug(2, "Not setting priv_data");
@ -1027,8 +1032,9 @@ int VideoStore::writeVideoFramePacket( ZMPacket * zm_packet ) {
zm_packet->out_frame->pts = 0;
zm_packet->out_frame->coded_picture_number = 0;
} else {
uint64_t seconds = zm_packet->timestamp->tv_sec*(uint64_t)1000000;
zm_packet->out_frame->pts = ( seconds + zm_packet->timestamp->tv_usec ) - video_start_pts;
uint64_t seconds = ( zm_packet->timestamp->tv_sec*(uint64_t)1000000 + zm_packet->timestamp->tv_usec ) - video_start_pts;
zm_packet->out_frame->pts = av_rescale_q( seconds, video_in_stream->time_base, video_out_ctx->time_base);
//zm_packet->out_frame->pkt_duration = zm_packet->out_frame->pts - video_start_pts;
Debug(2, " Setting pts for frame(%d), set to (%" PRId64 ") from (start %" PRIu64 " - %" PRIu64 " - secs(%d) usecs(%d)",
frame_count, zm_packet->out_frame->pts, video_start_pts, seconds, zm_packet->timestamp->tv_sec, zm_packet->timestamp->tv_usec );
@ -1044,6 +1050,7 @@ int VideoStore::writeVideoFramePacket( ZMPacket * zm_packet ) {
#if LIBAVCODEC_VERSION_CHECK(57, 64, 0, 64, 0)
// Do this to allow the encoder to choose whether to use I/P/B frame
zm_packet->out_frame->pict_type = AV_PICTURE_TYPE_NONE;
Debug(4, "Sending frame");
if ( (ret = avcodec_send_frame(video_out_ctx, zm_packet->out_frame)) < 0 ) {
Error("Could not send frame (error '%s')", av_make_error_string(ret).c_str());
return -1;