cleanups, code style, free resample_context

This commit is contained in:
Isaac Connor 2016-09-26 11:01:47 -04:00
parent 8f6007bb49
commit bd22d72e18
4 changed files with 57 additions and 55 deletions

View File

@ -63,10 +63,6 @@ FfmpegCamera::FfmpegCamera( int p_id, const std::string &p_path, const std::stri
mOpenStart = 0; mOpenStart = 0;
mReopenThread = 0; mReopenThread = 0;
videoStore = NULL; videoStore = NULL;
audio_last_pts = 0;
audio_last_dts = 0;
video_last_pts = 0;
video_last_dts = 0;
#if HAVE_LIBSWSCALE #if HAVE_LIBSWSCALE
mConvertContext = NULL; mConvertContext = NULL;
@ -313,34 +309,31 @@ int FfmpegCamera::OpenFfmpeg() {
// The one we want Might not be the first // The one we want Might not be the first
mVideoStreamId = -1; mVideoStreamId = -1;
mAudioStreamId = -1; mAudioStreamId = -1;
for (unsigned int i=0; i < mFormatContext->nb_streams; i++ ) for (unsigned int i=0; i < mFormatContext->nb_streams; i++ ) {
{
#if (LIBAVCODEC_VERSION_CHECK(52, 64, 0, 64, 0) || LIBAVUTIL_VERSION_CHECK(50, 14, 0, 14, 0)) #if (LIBAVCODEC_VERSION_CHECK(52, 64, 0, 64, 0) || LIBAVUTIL_VERSION_CHECK(50, 14, 0, 14, 0))
if ( mFormatContext->streams[i]->codec->codec_type == AVMEDIA_TYPE_VIDEO ) if ( mFormatContext->streams[i]->codec->codec_type == AVMEDIA_TYPE_VIDEO ) {
#else #else
if ( mFormatContext->streams[i]->codec->codec_type == CODEC_TYPE_VIDEO ) if ( mFormatContext->streams[i]->codec->codec_type == CODEC_TYPE_VIDEO ) {
#endif #endif
{ if ( mVideoStreamId == -1 ) {
if ( mVideoStreamId == -1 ) { mVideoStreamId = i;
mVideoStreamId = i; // if we break, then we won't find the audio stream
// if we break, then we won't find the audio stream continue;
continue; } else {
} else { Debug(2, "Have another video stream." );
Debug(2, "Have another video stream." );
}
} }
}
#if (LIBAVCODEC_VERSION_CHECK(52, 64, 0, 64, 0) || LIBAVUTIL_VERSION_CHECK(50, 14, 0, 14, 0)) #if (LIBAVCODEC_VERSION_CHECK(52, 64, 0, 64, 0) || LIBAVUTIL_VERSION_CHECK(50, 14, 0, 14, 0))
if ( mFormatContext->streams[i]->codec->codec_type == AVMEDIA_TYPE_AUDIO ) if ( mFormatContext->streams[i]->codec->codec_type == AVMEDIA_TYPE_AUDIO ) {
#else #else
if ( mFormatContext->streams[i]->codec->codec_type == CODEC_TYPE_AUDIO ) if ( mFormatContext->streams[i]->codec->codec_type == CODEC_TYPE_AUDIO ) {
#endif #endif
{ if ( mAudioStreamId == -1 ) {
if ( mAudioStreamId == -1 ) { mAudioStreamId = i;
mAudioStreamId = i; } else {
} else { Debug(2, "Have another audio stream." );
Debug(2, "Have another audio stream." );
}
} }
}
} }
if ( mVideoStreamId == -1 ) if ( mVideoStreamId == -1 )
Fatal( "Unable to locate video stream in %s", mPath.c_str() ); Fatal( "Unable to locate video stream in %s", mPath.c_str() );
@ -423,6 +416,14 @@ int FfmpegCamera::OpenFfmpeg() {
Fatal("swscale does not support the target format: %c%c%c%c",(imagePixFormat)&0xff,((imagePixFormat>>8)&0xff),((imagePixFormat>>16)&0xff),((imagePixFormat>>24)&0xff)); Fatal("swscale does not support the target format: %c%c%c%c",(imagePixFormat)&0xff,((imagePixFormat>>8)&0xff),((imagePixFormat>>16)&0xff),((imagePixFormat>>24)&0xff));
} }
mConvertContext = sws_getContext(mVideoCodecContext->width,
mVideoCodecContext->height,
mVideoCodecContext->pix_fmt,
width, height,
imagePixFormat, SWS_BICUBIC, NULL,
NULL, NULL);
if ( mConvertContext == NULL )
Fatal( "Unable to create conversion context for %s", mPath.c_str() );
#else // HAVE_LIBSWSCALE #else // HAVE_LIBSWSCALE
Fatal( "You must compile ffmpeg with the --enable-swscale option to use ffmpeg cameras" ); Fatal( "You must compile ffmpeg with the --enable-swscale option to use ffmpeg cameras" );
#endif // HAVE_LIBSWSCALE #endif // HAVE_LIBSWSCALE
@ -476,8 +477,7 @@ int FfmpegCamera::CloseFfmpeg(){
mAudioCodecContext = NULL; // Freed by av_close_input_file mAudioCodecContext = NULL; // Freed by av_close_input_file
} }
if ( mFormatContext ) if ( mFormatContext ) {
{
#if !LIBAVFORMAT_VERSION_CHECK(53, 17, 0, 25, 0) #if !LIBAVFORMAT_VERSION_CHECK(53, 17, 0, 25, 0)
av_close_input_file( mFormatContext ); av_close_input_file( mFormatContext );
#else #else
@ -567,7 +567,7 @@ Debug(5, "After av_read_frame (%d)", ret );
(ret == AVERROR_EOF || (mFormatContext->pb && mFormatContext->pb->eof_reached)) || (ret == AVERROR_EOF || (mFormatContext->pb && mFormatContext->pb->eof_reached)) ||
// Check for Connection failure. // Check for Connection failure.
(ret == -110) (ret == -110)
) { ) {
Info( "av_read_frame returned \"%s\". Reopening stream.", errbuf); Info( "av_read_frame returned \"%s\". Reopening stream.", errbuf);
ReopenFfmpeg(); ReopenFfmpeg();
} }
@ -690,7 +690,7 @@ Debug(5, "After av_read_frame (%d)", ret );
return 0; return 0;
} }
} }
Debug(3, "about to decode video" ); Debug(4, "about to decode video" );
ret = zm_avcodec_decode_video( mVideoCodecContext, mRawFrame, &frameComplete, &packet ); ret = zm_avcodec_decode_video( mVideoCodecContext, mRawFrame, &frameComplete, &packet );
if ( ret < 0 ) { if ( ret < 0 ) {
av_strerror( ret, errbuf, AV_ERROR_MAX_STRING_SIZE ); av_strerror( ret, errbuf, AV_ERROR_MAX_STRING_SIZE );
@ -715,25 +715,11 @@ Debug(5, "After av_read_frame (%d)", ret );
} }
avpicture_fill( (AVPicture *)mFrame, directbuffer, imagePixFormat, width, height); avpicture_fill( (AVPicture *)mFrame, directbuffer, imagePixFormat, width, height);
#if HAVE_LIBSWSCALE
if ( mConvertContext == NULL ) {
mConvertContext = sws_getContext(mVideoCodecContext->width,
mVideoCodecContext->height,
mVideoCodecContext->pix_fmt,
width, height,
imagePixFormat, SWS_BICUBIC, NULL,
NULL, NULL);
if ( mConvertContext == NULL )
Fatal( "Unable to create conversion context for %s", mPath.c_str() );
}
if (sws_scale(mConvertContext, mRawFrame->data, mRawFrame->linesize, if (sws_scale(mConvertContext, mRawFrame->data, mRawFrame->linesize,
0, mVideoCodecContext->height, mFrame->data, mFrame->linesize) < 0) 0, mVideoCodecContext->height, mFrame->data, mFrame->linesize) < 0) {
Fatal("Unable to convert raw format %u to target format %u at frame %d", Fatal("Unable to convert raw format %u to target format %u at frame %d",
mVideoCodecContext->pix_fmt, imagePixFormat, frameCount); mVideoCodecContext->pix_fmt, imagePixFormat, frameCount);
#else // HAVE_LIBSWSCALE }
Fatal( "You must compile ffmpeg with the --enable-swscale option to use ffmpeg cameras" );
#endif // HAVE_LIBSWSCALE
frameCount++; frameCount++;
} else { } else {
@ -769,6 +755,6 @@ Debug(5, "After av_read_frame (%d)", ret );
//} //}
} // end while ! frameComplete } // end while ! frameComplete
return (frameCount); return (frameCount);
} } // end FfmpegCamera::CaptureAndRecord
#endif // HAVE_LIBAVFORMAT #endif // HAVE_LIBAVFORMAT

View File

@ -2833,7 +2833,7 @@ int Monitor::Capture() {
unsigned int deinterlacing_value = deinterlacing & 0xff; unsigned int deinterlacing_value = deinterlacing & 0xff;
if ( deinterlacing_value == 4) { if ( deinterlacing_value == 4 ) {
if ( FirstCapture != 1 ) { if ( FirstCapture != 1 ) {
/* Copy the next image into the shared memory */ /* Copy the next image into the shared memory */
capture_image->CopyBuffer(*(next_buffer.image)); capture_image->CopyBuffer(*(next_buffer.image));

View File

@ -206,6 +206,7 @@ VideoStore::VideoStore(const char *filename_in, const char *format_in,
audio_output_codec = NULL; audio_output_codec = NULL;
audio_input_context = NULL; audio_input_context = NULL;
resample_context = NULL;
if (audio_input_stream) { if (audio_input_stream) {
audio_input_context = audio_input_stream->codec; audio_input_context = audio_input_stream->codec;
@ -236,7 +237,7 @@ Debug(2, "Have audio_output_context");
audio_output_context->sample_fmt = audio_input_context->sample_fmt; audio_output_context->sample_fmt = audio_input_context->sample_fmt;
//audio_output_context->refcounted_frames = 1; //audio_output_context->refcounted_frames = 1;
if (audio_output_codec->supported_samplerates) { if (audio_output_codec->supported_samplerates) {
int found = 0; int found = 0;
for ( unsigned int i = 0; audio_output_codec->supported_samplerates[i]; i++) { for ( unsigned int i = 0; audio_output_codec->supported_samplerates[i]; i++) {
if ( audio_output_context->sample_rate == audio_output_codec->supported_samplerates[i] ) { if ( audio_output_context->sample_rate == audio_output_codec->supported_samplerates[i] ) {
@ -250,7 +251,7 @@ Debug(2, "Have audio_output_context");
audio_output_context->sample_rate = audio_output_codec->supported_samplerates[0]; audio_output_context->sample_rate = audio_output_codec->supported_samplerates[0];
Debug(1, "Sampel rate is no good, setting to (%d)", audio_output_codec->supported_samplerates[0] ); Debug(1, "Sampel rate is no good, setting to (%d)", audio_output_codec->supported_samplerates[0] );
} }
} }
/* check that the encoder supports s16 pcm input */ /* check that the encoder supports s16 pcm input */
if (!check_sample_fmt( audio_output_codec, audio_output_context->sample_fmt)) { if (!check_sample_fmt( audio_output_codec, audio_output_context->sample_fmt)) {
@ -259,6 +260,18 @@ Debug(2, "Have audio_output_context");
audio_output_context->sample_fmt = AV_SAMPLE_FMT_FLTP; audio_output_context->sample_fmt = AV_SAMPLE_FMT_FLTP;
} }
Debug(3, "Audio Time bases input stream (%d/%d) input codec: (%d/%d) output_stream (%d/%d) output codec (%d/%d)",
audio_input_stream->time_base.num,
audio_input_stream->time_base.den,
audio_input_context->time_base.num,
audio_input_context->time_base.den,
audio_output_stream->time_base.num,
audio_output_stream->time_base.den,
audio_output_context->time_base.num,
audio_output_context->time_base.den
);
audio_output_stream->time_base = (AVRational){ 1, audio_output_context->sample_rate };
Debug(3, "Audio Time bases input stream (%d/%d) input codec: (%d/%d) output_stream (%d/%d) output codec (%d/%d)", Debug(3, "Audio Time bases input stream (%d/%d) input codec: (%d/%d) output_stream (%d/%d) output codec (%d/%d)",
audio_input_stream->time_base.num, audio_input_stream->time_base.num,
audio_input_stream->time_base.den, audio_input_stream->time_base.den,
@ -429,13 +442,13 @@ Debug(2, "Have audio_output_context");
//os->ctx_inited = 1; //os->ctx_inited = 1;
//avio_flush(ctx->pb); //avio_flush(ctx->pb);
//av_dict_free(&opts); //av_dict_free(&opts);
zm_dump_stream_format( oc, 0, 0, 1 );
if ( audio_output_stream )
zm_dump_stream_format( oc, 1, 0, 1 );
/* Write the stream header, if any. */ /* Write the stream header, if any. */
ret = avformat_write_header(oc, NULL); ret = avformat_write_header(oc, NULL);
if (ret < 0) { if (ret < 0) {
zm_dump_stream_format( oc, 0, 0, 1 );
if ( audio_output_stream )
zm_dump_stream_format( oc, 1, 0, 1 );
Error("Error occurred when writing output file header to %s: %s\n", Error("Error occurred when writing output file header to %s: %s\n",
filename, filename,
av_make_error_string(ret).c_str()); av_make_error_string(ret).c_str());
@ -485,13 +498,16 @@ VideoStore::~VideoStore(){
/* free the stream */ /* free the stream */
avformat_free_context(oc); avformat_free_context(oc);
if ( resample_context )
swr_free( &resample_context );
} }
void VideoStore::dumpPacket( AVPacket *pkt ){ void VideoStore::dumpPacket( AVPacket *pkt ){
char b[10240]; char b[10240];
snprintf(b, sizeof(b), " pts: %" PRId64 ", dts: %" PRId64 ", data: %p, size: %d, sindex: %d, dflags: %04x, s-pos: %" PRId64 ", c-duration: %" PRId64 "\n" snprintf(b, sizeof(b), " pts: %" PRId64 ", dts: %" PRId64 ", data: %p, size: %d, sindex: %d, dflags: %04x, s-pos: %" PRId64 ", c-duration: %d\n"
, pkt->pts , pkt->pts
, pkt->dts , pkt->dts
, pkt->data , pkt->data
@ -506,8 +522,6 @@ void VideoStore::dumpPacket( AVPacket *pkt ){
int VideoStore::writeVideoFramePacket( AVPacket *ipkt ) { int VideoStore::writeVideoFramePacket( AVPacket *ipkt ) {
AVPacket opkt;
AVPicture pict;
Debug(4, "writeVideoFrame init_packet"); Debug(4, "writeVideoFrame init_packet");
av_init_packet(&opkt); av_init_packet(&opkt);
@ -585,6 +599,7 @@ if ( opkt.dts != AV_NOPTS_VALUE ) {
#if 0 #if 0
if (video_output_context->codec_type == AVMEDIA_TYPE_VIDEO && (output_format->flags & AVFMT_RAWPICTURE)) { if (video_output_context->codec_type == AVMEDIA_TYPE_VIDEO && (output_format->flags & AVFMT_RAWPICTURE)) {
AVPicture pict;
Debug(3, "video and RAWPICTURE"); Debug(3, "video and RAWPICTURE");
/* store AVPicture in AVPacket, as expected by the output format */ /* store AVPicture in AVPacket, as expected by the output format */
avpicture_fill(&pict, opkt.data, video_output_context->pix_fmt, video_output_context->width, video_output_context->height, 0); avpicture_fill(&pict, opkt.data, video_output_context->pix_fmt, video_output_context->width, video_output_context->height, 0);
@ -641,7 +656,6 @@ int VideoStore::writeAudioFramePacket( AVPacket *ipkt ) {
int ret; int ret;
AVPacket opkt;
av_init_packet(&opkt); av_init_packet(&opkt);
Debug(5, "after init packet" ); Debug(5, "after init packet" );

View File

@ -24,6 +24,8 @@ private:
AVStream *video_input_stream; AVStream *video_input_stream;
AVStream *audio_input_stream; AVStream *audio_input_stream;
// Move this into the object so that we aren't constantly allocating/deallocating it on the stack
AVPacket opkt;
// we are transcoding // we are transcoding
AVFrame *input_frame; AVFrame *input_frame;
AVFrame *output_frame; AVFrame *output_frame;