coverity scan fixes/cleanups
This commit is contained in:
parent
c766c1ddd1
commit
8518278476
|
@ -194,7 +194,7 @@ public:
|
||||||
SockAddrUnix();
|
SockAddrUnix();
|
||||||
SockAddrUnix( const SockAddrUnix &addr ) : SockAddr( (const struct sockaddr *)&mAddrUn ), mAddrUn( addr.mAddrUn ) {
|
SockAddrUnix( const SockAddrUnix &addr ) : SockAddr( (const struct sockaddr *)&mAddrUn ), mAddrUn( addr.mAddrUn ) {
|
||||||
}
|
}
|
||||||
SockAddrUnix( const struct sockaddr_un *addr ) : SockAddr( (const struct sockaddr *)&mAddrUn ), mAddrUn( *addr ) {
|
explicit SockAddrUnix( const struct sockaddr_un *addr ) : SockAddr( (const struct sockaddr *)&mAddrUn ), mAddrUn( *addr ) {
|
||||||
}
|
}
|
||||||
|
|
||||||
bool resolve( const char *path, const char *proto );
|
bool resolve( const char *path, const char *proto );
|
||||||
|
@ -622,9 +622,9 @@ protected:
|
||||||
|
|
||||||
public:
|
public:
|
||||||
Select();
|
Select();
|
||||||
Select( struct timeval timeout );
|
explicit Select( struct timeval timeout );
|
||||||
Select( int timeout );
|
explicit Select( int timeout );
|
||||||
Select( double timeout );
|
explicit Select( double timeout );
|
||||||
|
|
||||||
void setTimeout( int timeout );
|
void setTimeout( int timeout );
|
||||||
void setTimeout( double timeout );
|
void setTimeout( double timeout );
|
||||||
|
|
|
@ -243,7 +243,7 @@ void zm_dump_codecpar ( const AVCodecParameters *par ) {
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void zm_dump_codec ( const AVCodecContext *codec ) {
|
void zm_dump_codec(const AVCodecContext *codec) {
|
||||||
Debug(1, "Dumping codec_context codec_type(%d) codec_id(%d) width(%d) height(%d) timebase(%d/%d) format(%s)",
|
Debug(1, "Dumping codec_context codec_type(%d) codec_id(%d) width(%d) height(%d) timebase(%d/%d) format(%s)",
|
||||||
codec->codec_type,
|
codec->codec_type,
|
||||||
codec->codec_id,
|
codec->codec_id,
|
||||||
|
@ -425,7 +425,7 @@ int zm_receive_frame( AVCodecContext *context, AVFrame *frame, AVPacket &packet
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
# else
|
# else
|
||||||
int frameComplete;
|
int frameComplete = 0;
|
||||||
while ( !frameComplete ) {
|
while ( !frameComplete ) {
|
||||||
if ( (ret = zm_avcodec_decode_video( context, frame, &frameComplete, &packet )) < 0 ) {
|
if ( (ret = zm_avcodec_decode_video( context, frame, &frameComplete, &packet )) < 0 ) {
|
||||||
Error( "Unable to decode frame at frame: %s, continuing",
|
Error( "Unable to decode frame at frame: %s, continuing",
|
||||||
|
|
|
@ -129,13 +129,13 @@ FfmpegCamera::FfmpegCamera( int p_id, const std::string &p_path, const std::stri
|
||||||
} else {
|
} else {
|
||||||
Panic("Unexpected colours: %d",colours);
|
Panic("Unexpected colours: %d",colours);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
FfmpegCamera::~FfmpegCamera() {
|
FfmpegCamera::~FfmpegCamera() {
|
||||||
|
|
||||||
if ( videoStore ) {
|
if ( videoStore ) {
|
||||||
delete videoStore;
|
delete videoStore;
|
||||||
|
videoStore = NULL;
|
||||||
}
|
}
|
||||||
CloseFfmpeg();
|
CloseFfmpeg();
|
||||||
|
|
||||||
|
@ -631,14 +631,6 @@ int FfmpegCamera::OpenFfmpeg() {
|
||||||
return 0;
|
return 0;
|
||||||
} // int FfmpegCamera::OpenFfmpeg()
|
} // int FfmpegCamera::OpenFfmpeg()
|
||||||
|
|
||||||
int FfmpegCamera::ReopenFfmpeg() {
|
|
||||||
|
|
||||||
Debug(2, "ReopenFfmpeg called.");
|
|
||||||
|
|
||||||
CloseFfmpeg();
|
|
||||||
return OpenFfmpeg();
|
|
||||||
}
|
|
||||||
|
|
||||||
int FfmpegCamera::CloseFfmpeg() {
|
int FfmpegCamera::CloseFfmpeg() {
|
||||||
|
|
||||||
Debug(2, "CloseFfmpeg called.");
|
Debug(2, "CloseFfmpeg called.");
|
||||||
|
|
|
@ -74,11 +74,8 @@ class FfmpegCamera : public Camera {
|
||||||
AVPacket packet;
|
AVPacket packet;
|
||||||
|
|
||||||
int OpenFfmpeg();
|
int OpenFfmpeg();
|
||||||
int ReopenFfmpeg();
|
|
||||||
int CloseFfmpeg();
|
int CloseFfmpeg();
|
||||||
bool mIsOpening;
|
|
||||||
bool mCanCapture;
|
bool mCanCapture;
|
||||||
int mOpenStart;
|
|
||||||
#endif // HAVE_LIBAVFORMAT
|
#endif // HAVE_LIBAVFORMAT
|
||||||
|
|
||||||
VideoStore *videoStore;
|
VideoStore *videoStore;
|
||||||
|
|
|
@ -1649,30 +1649,24 @@ void Image::Blend( const Image &image, int transparency )
|
||||||
AssignDirect( width, height, colours, subpixelorder, new_buffer, size, ZM_BUFTYPE_ZM);
|
AssignDirect( width, height, colours, subpixelorder, new_buffer, size, ZM_BUFTYPE_ZM);
|
||||||
}
|
}
|
||||||
|
|
||||||
Image *Image::Merge( unsigned int n_images, Image *images[] )
|
Image *Image::Merge( unsigned int n_images, Image *images[] ) {
|
||||||
{
|
if ( n_images == 1 ) return new Image(*images[0]);
|
||||||
if ( n_images <= 0 ) return( 0 );
|
|
||||||
if ( n_images == 1 ) return( new Image( *images[0] ) );
|
|
||||||
|
|
||||||
unsigned int width = images[0]->width;
|
unsigned int width = images[0]->width;
|
||||||
unsigned int height = images[0]->height;
|
unsigned int height = images[0]->height;
|
||||||
unsigned int colours = images[0]->colours;
|
unsigned int colours = images[0]->colours;
|
||||||
for ( unsigned int i = 1; i < n_images; i++ )
|
for ( unsigned int i = 1; i < n_images; i++ ) {
|
||||||
{
|
if ( !(width == images[i]->width && height == images[i]->height && colours == images[i]->colours) ) {
|
||||||
if ( !(width == images[i]->width && height == images[i]->height && colours == images[i]->colours) )
|
|
||||||
{
|
|
||||||
Panic( "Attempt to merge different sized images, expected %dx%dx%d, got %dx%dx%d, for image %d", width, height, colours, images[i]->width, images[i]->height, images[i]->colours, i );
|
Panic( "Attempt to merge different sized images, expected %dx%dx%d, got %dx%dx%d, for image %d", width, height, colours, images[i]->width, images[i]->height, images[i]->colours, i );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Image *result = new Image( width, height, images[0]->colours, images[0]->subpixelorder);
|
Image *result = new Image( width, height, images[0]->colours, images[0]->subpixelorder);
|
||||||
unsigned int size = result->size;
|
unsigned int size = result->size;
|
||||||
for ( unsigned int i = 0; i < size; i++ )
|
for ( unsigned int i = 0; i < size; i++ ) {
|
||||||
{
|
|
||||||
unsigned int total = 0;
|
unsigned int total = 0;
|
||||||
uint8_t *pdest = result->buffer;
|
uint8_t *pdest = result->buffer;
|
||||||
for ( unsigned int j = 0; j < n_images; j++ )
|
for ( unsigned int j = 0; j < n_images; j++ ) {
|
||||||
{
|
|
||||||
uint8_t *psrc = images[j]->buffer;
|
uint8_t *psrc = images[j]->buffer;
|
||||||
total += *psrc;
|
total += *psrc;
|
||||||
psrc++;
|
psrc++;
|
||||||
|
@ -1680,21 +1674,17 @@ Image *Image::Merge( unsigned int n_images, Image *images[] )
|
||||||
*pdest = total/n_images;
|
*pdest = total/n_images;
|
||||||
pdest++;
|
pdest++;
|
||||||
}
|
}
|
||||||
return( result );
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
Image *Image::Merge( unsigned int n_images, Image *images[], double weight )
|
Image *Image::Merge( unsigned int n_images, Image *images[], double weight ) {
|
||||||
{
|
if ( n_images == 1 ) return new Image(*images[0]);
|
||||||
if ( n_images <= 0 ) return( 0 );
|
|
||||||
if ( n_images == 1 ) return( new Image( *images[0] ) );
|
|
||||||
|
|
||||||
unsigned int width = images[0]->width;
|
unsigned int width = images[0]->width;
|
||||||
unsigned int height = images[0]->height;
|
unsigned int height = images[0]->height;
|
||||||
unsigned int colours = images[0]->colours;
|
unsigned int colours = images[0]->colours;
|
||||||
for ( unsigned int i = 1; i < n_images; i++ )
|
for ( unsigned int i = 1; i < n_images; i++ ) {
|
||||||
{
|
if ( !(width == images[i]->width && height == images[i]->height && colours == images[i]->colours) ) {
|
||||||
if ( !(width == images[i]->width && height == images[i]->height && colours == images[i]->colours) )
|
|
||||||
{
|
|
||||||
Panic( "Attempt to merge different sized images, expected %dx%dx%d, got %dx%dx%d, for image %d", width, height, colours, images[i]->width, images[i]->height, images[i]->colours, i );
|
Panic( "Attempt to merge different sized images, expected %dx%dx%d, got %dx%dx%d, for image %d", width, height, colours, images[i]->width, images[i]->height, images[i]->colours, i );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1702,55 +1692,46 @@ Image *Image::Merge( unsigned int n_images, Image *images[], double weight )
|
||||||
Image *result = new Image( *images[0] );
|
Image *result = new Image( *images[0] );
|
||||||
unsigned int size = result->size;
|
unsigned int size = result->size;
|
||||||
double factor = 1.0*weight;
|
double factor = 1.0*weight;
|
||||||
for ( unsigned int i = 1; i < n_images; i++ )
|
for ( unsigned int i = 1; i < n_images; i++ ) {
|
||||||
{
|
|
||||||
uint8_t *pdest = result->buffer;
|
uint8_t *pdest = result->buffer;
|
||||||
uint8_t *psrc = images[i]->buffer;
|
uint8_t *psrc = images[i]->buffer;
|
||||||
for ( unsigned int j = 0; j < size; j++ )
|
for ( unsigned int j = 0; j < size; j++ ) {
|
||||||
{
|
|
||||||
*pdest = (uint8_t)(((*pdest)*(1.0-factor))+((*psrc)*factor));
|
*pdest = (uint8_t)(((*pdest)*(1.0-factor))+((*psrc)*factor));
|
||||||
pdest++;
|
pdest++;
|
||||||
psrc++;
|
psrc++;
|
||||||
}
|
}
|
||||||
factor *= weight;
|
factor *= weight;
|
||||||
}
|
}
|
||||||
return( result );
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
Image *Image::Highlight( unsigned int n_images, Image *images[], const Rgb threshold, const Rgb ref_colour )
|
Image *Image::Highlight( unsigned int n_images, Image *images[], const Rgb threshold, const Rgb ref_colour )
|
||||||
{
|
{
|
||||||
if ( n_images <= 0 ) return( 0 );
|
if ( n_images == 1 ) return new Image(*images[0]);
|
||||||
if ( n_images == 1 ) return( new Image( *images[0] ) );
|
|
||||||
|
|
||||||
unsigned int width = images[0]->width;
|
unsigned int width = images[0]->width;
|
||||||
unsigned int height = images[0]->height;
|
unsigned int height = images[0]->height;
|
||||||
unsigned int colours = images[0]->colours;
|
unsigned int colours = images[0]->colours;
|
||||||
for ( unsigned int i = 1; i < n_images; i++ )
|
for ( unsigned int i = 1; i < n_images; i++ ) {
|
||||||
{
|
if ( !(width == images[i]->width && height == images[i]->height && colours == images[i]->colours) ) {
|
||||||
if ( !(width == images[i]->width && height == images[i]->height && colours == images[i]->colours) )
|
|
||||||
{
|
|
||||||
Panic( "Attempt to highlight different sized images, expected %dx%dx%d, got %dx%dx%d, for image %d", width, height, colours, images[i]->width, images[i]->height, images[i]->colours, i );
|
Panic( "Attempt to highlight different sized images, expected %dx%dx%d, got %dx%dx%d, for image %d", width, height, colours, images[i]->width, images[i]->height, images[i]->colours, i );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Image *result = new Image( width, height, images[0]->colours, images[0]->subpixelorder );
|
Image *result = new Image( width, height, images[0]->colours, images[0]->subpixelorder );
|
||||||
unsigned int size = result->size;
|
unsigned int size = result->size;
|
||||||
for ( unsigned int c = 0; c < colours; c++ )
|
for ( unsigned int c = 0; c < colours; c++ ) {
|
||||||
{
|
|
||||||
unsigned int ref_colour_rgb = RGB_VAL(ref_colour,c);
|
unsigned int ref_colour_rgb = RGB_VAL(ref_colour,c);
|
||||||
|
|
||||||
for ( unsigned int i = 0; i < size; i++ )
|
for ( unsigned int i = 0; i < size; i++ ) {
|
||||||
{
|
|
||||||
unsigned int count = 0;
|
unsigned int count = 0;
|
||||||
uint8_t *pdest = result->buffer+c;
|
uint8_t *pdest = result->buffer+c;
|
||||||
for ( unsigned int j = 0; j < n_images; j++ )
|
for ( unsigned int j = 0; j < n_images; j++ ) {
|
||||||
{
|
|
||||||
uint8_t *psrc = images[j]->buffer+c;
|
uint8_t *psrc = images[j]->buffer+c;
|
||||||
|
|
||||||
unsigned int diff = ((*psrc)-ref_colour_rgb) > 0 ? (*psrc)-ref_colour_rgb : ref_colour_rgb - (*psrc);
|
unsigned int diff = ((*psrc)-ref_colour_rgb) > 0 ? (*psrc)-ref_colour_rgb : ref_colour_rgb - (*psrc);
|
||||||
|
|
||||||
if (diff >= RGB_VAL(threshold,c))
|
if (diff >= RGB_VAL(threshold,c)) {
|
||||||
{
|
|
||||||
count++;
|
count++;
|
||||||
}
|
}
|
||||||
psrc += colours;
|
psrc += colours;
|
||||||
|
|
|
@ -1587,7 +1587,7 @@ bool Monitor::Analyse() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
alarm_cause = cause+" "+alarm_cause;
|
alarm_cause = cause+" "+alarm_cause;
|
||||||
strncpy( shared_data->alarm_cause,alarm_cause.c_str() , sizeof(shared_data->alarm_cause) );
|
strncpy(shared_data->alarm_cause,alarm_cause.c_str(), sizeof(shared_data->alarm_cause)-1);
|
||||||
//set up video store data
|
//set up video store data
|
||||||
snprintf(video_store_data->event_file, sizeof(video_store_data->event_file), "%s", event->getEventFile());
|
snprintf(video_store_data->event_file, sizeof(video_store_data->event_file), "%s", event->getEventFile());
|
||||||
video_store_data->recording = event->StartTime();
|
video_store_data->recording = event->StartTime();
|
||||||
|
@ -1815,6 +1815,7 @@ void Monitor::Reload() {
|
||||||
ready_count = image_count+warmup_count;
|
ready_count = image_count+warmup_count;
|
||||||
|
|
||||||
ReloadLinkedMonitors( p_linked_monitors );
|
ReloadLinkedMonitors( p_linked_monitors );
|
||||||
|
delete row;
|
||||||
} // end if row
|
} // end if row
|
||||||
|
|
||||||
ReloadZones();
|
ReloadZones();
|
||||||
|
|
|
@ -58,7 +58,9 @@ class MonitorStream : public StreamBase {
|
||||||
void SingleImageZip( int scale=100 );
|
void SingleImageZip( int scale=100 );
|
||||||
|
|
||||||
public:
|
public:
|
||||||
MonitorStream() : ttl(0), playback_buffer(0), delayed(false), frame_count(0) {
|
MonitorStream() :
|
||||||
|
temp_image_buffer(NULL), temp_image_buffer_count(0), temp_read_index(0), temp_write_index(0),
|
||||||
|
ttl(0), playback_buffer(0), delayed(false), frame_count(0) {
|
||||||
}
|
}
|
||||||
void setStreamBuffer( int p_playback_buffer ) {
|
void setStreamBuffer( int p_playback_buffer ) {
|
||||||
playback_buffer = p_playback_buffer;
|
playback_buffer = p_playback_buffer;
|
||||||
|
|
|
@ -293,7 +293,7 @@ const char *VideoStream::MimeType( ) const {
|
||||||
return mime_type;
|
return mime_type;
|
||||||
}
|
}
|
||||||
|
|
||||||
void VideoStream::OpenStream( ) {
|
bool VideoStream::OpenStream( ) {
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
/* now that all the parameters are set, we can open the
|
/* now that all the parameters are set, we can open the
|
||||||
|
@ -308,7 +308,8 @@ void VideoStream::OpenStream( ) {
|
||||||
if ( (ret = avcodec_open2(codec_context, codec, 0)) < 0 )
|
if ( (ret = avcodec_open2(codec_context, codec, 0)) < 0 )
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
Fatal( "Could not open codec. Error code %d \"%s\"", ret, av_err2str(ret) );
|
Error("Could not open codec. Error code %d \"%s\"", ret, av_err2str(ret));
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
Debug( 1, "Opened codec" );
|
Debug( 1, "Opened codec" );
|
||||||
|
@ -316,22 +317,24 @@ void VideoStream::OpenStream( ) {
|
||||||
/* allocate the encoded raw picture */
|
/* allocate the encoded raw picture */
|
||||||
opicture = zm_av_frame_alloc( );
|
opicture = zm_av_frame_alloc( );
|
||||||
if ( !opicture ) {
|
if ( !opicture ) {
|
||||||
Panic( "Could not allocate opicture" );
|
Error("Could not allocate opicture");
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
opicture->width = codec_context->width;
|
opicture->width = codec_context->width;
|
||||||
opicture->height = codec_context->height;
|
opicture->height = codec_context->height;
|
||||||
opicture->format = codec_context->pix_fmt;
|
opicture->format = codec_context->pix_fmt;
|
||||||
|
|
||||||
#if LIBAVUTIL_VERSION_CHECK(54, 6, 0, 6, 0)
|
#if LIBAVUTIL_VERSION_CHECK(54, 6, 0, 6, 0)
|
||||||
int size = av_image_get_buffer_size( codec_context->pix_fmt, codec_context->width, codec_context->height, 1 );
|
int size = av_image_get_buffer_size(codec_context->pix_fmt, codec_context->width, codec_context->height, 1);
|
||||||
#else
|
#else
|
||||||
int size = avpicture_get_size( codec_context->pix_fmt, codec_context->width, codec_context->height );
|
int size = avpicture_get_size(codec_context->pix_fmt, codec_context->width, codec_context->height);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
uint8_t *opicture_buf = (uint8_t *)av_malloc( size );
|
uint8_t *opicture_buf = (uint8_t *)av_malloc(size);
|
||||||
if ( !opicture_buf ) {
|
if ( !opicture_buf ) {
|
||||||
av_frame_free( &opicture );
|
av_frame_free( &opicture );
|
||||||
Panic( "Could not allocate opicture_buf" );
|
Error( "Could not allocate opicture_buf" );
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
#if LIBAVUTIL_VERSION_CHECK(54, 6, 0, 6, 0)
|
#if LIBAVUTIL_VERSION_CHECK(54, 6, 0, 6, 0)
|
||||||
av_image_fill_arrays(opicture->data, opicture->linesize,
|
av_image_fill_arrays(opicture->data, opicture->linesize,
|
||||||
|
@ -352,7 +355,8 @@ void VideoStream::OpenStream( ) {
|
||||||
tmp_opicture = avcodec_alloc_frame( );
|
tmp_opicture = avcodec_alloc_frame( );
|
||||||
#endif
|
#endif
|
||||||
if ( !tmp_opicture ) {
|
if ( !tmp_opicture ) {
|
||||||
Panic( "Could not allocate tmp_opicture" );
|
Error( "Could not allocate tmp_opicture" );
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
#if LIBAVUTIL_VERSION_CHECK(54, 6, 0, 6, 0)
|
#if LIBAVUTIL_VERSION_CHECK(54, 6, 0, 6, 0)
|
||||||
int size = av_image_get_buffer_size( pf, codec_context->width, codec_context->height,1 );
|
int size = av_image_get_buffer_size( pf, codec_context->width, codec_context->height,1 );
|
||||||
|
@ -362,7 +366,8 @@ void VideoStream::OpenStream( ) {
|
||||||
uint8_t *tmp_opicture_buf = (uint8_t *)av_malloc( size );
|
uint8_t *tmp_opicture_buf = (uint8_t *)av_malloc( size );
|
||||||
if ( !tmp_opicture_buf ) {
|
if ( !tmp_opicture_buf ) {
|
||||||
av_frame_free( &tmp_opicture );
|
av_frame_free( &tmp_opicture );
|
||||||
Panic( "Could not allocate tmp_opicture_buf" );
|
Error( "Could not allocate tmp_opicture_buf" );
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
#if LIBAVUTIL_VERSION_CHECK(54, 6, 0, 6, 0)
|
#if LIBAVUTIL_VERSION_CHECK(54, 6, 0, 6, 0)
|
||||||
av_image_fill_arrays(tmp_opicture->data,
|
av_image_fill_arrays(tmp_opicture->data,
|
||||||
|
@ -385,12 +390,14 @@ void VideoStream::OpenStream( ) {
|
||||||
ret = url_fopen( &ofc->pb, filename, AVIO_FLAG_WRITE );
|
ret = url_fopen( &ofc->pb, filename, AVIO_FLAG_WRITE );
|
||||||
#endif
|
#endif
|
||||||
if ( ret < 0 ) {
|
if ( ret < 0 ) {
|
||||||
Fatal( "Could not open '%s'", filename );
|
Error("Could not open '%s'", filename);
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
Debug( 1, "Opened output \"%s\"", filename );
|
Debug(1, "Opened output \"%s\"", filename);
|
||||||
} else {
|
} else {
|
||||||
Fatal( "of->flags & AVFMT_NOFILE" );
|
Error( "of->flags & AVFMT_NOFILE" );
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
video_outbuf = NULL;
|
video_outbuf = NULL;
|
||||||
|
@ -417,14 +424,16 @@ void VideoStream::OpenStream( ) {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if !LIBAVFORMAT_VERSION_CHECK(53, 2, 0, 4, 0)
|
#if !LIBAVFORMAT_VERSION_CHECK(53, 2, 0, 4, 0)
|
||||||
ret = av_write_header( ofc );
|
ret = av_write_header(ofc);
|
||||||
#else
|
#else
|
||||||
ret = avformat_write_header(ofc, NULL);
|
ret = avformat_write_header(ofc, NULL);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if ( ret < 0 ) {
|
if ( ret < 0 ) {
|
||||||
Fatal( "?_write_header failed with error %d \"%s\"", ret, av_err2str( ret ) );
|
Error("?_write_header failed with error %d \"%s\"", ret, av_err2str(ret));
|
||||||
}
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
VideoStream::VideoStream( const char *in_filename, const char *in_format, int bitrate, double frame_rate, int colours, int subpixelorder, int width, int height ) :
|
VideoStream::VideoStream( const char *in_filename, const char *in_format, int bitrate, double frame_rate, int colours, int subpixelorder, int width, int height ) :
|
||||||
|
@ -550,19 +559,20 @@ VideoStream::~VideoStream( ) {
|
||||||
}
|
}
|
||||||
|
|
||||||
double VideoStream::EncodeFrame( const uint8_t *buffer, int buffer_size, bool _add_timestamp, unsigned int _timestamp ) {
|
double VideoStream::EncodeFrame( const uint8_t *buffer, int buffer_size, bool _add_timestamp, unsigned int _timestamp ) {
|
||||||
if ( pthread_mutex_lock( buffer_copy_lock ) != 0 ) {
|
if ( pthread_mutex_lock(buffer_copy_lock) != 0 ) {
|
||||||
Fatal( "EncodeFrame: pthread_mutex_lock failed." );
|
Fatal( "EncodeFrame: pthread_mutex_lock failed." );
|
||||||
}
|
}
|
||||||
|
|
||||||
if (buffer_copy_size < buffer_size) {
|
if (buffer_copy_size < buffer_size) {
|
||||||
if ( buffer_copy ) {
|
if ( buffer_copy ) {
|
||||||
av_free( buffer_copy );
|
av_free(buffer_copy);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Allocate a buffer to store source images for the streaming thread to encode.
|
// Allocate a buffer to store source images for the streaming thread to encode.
|
||||||
buffer_copy = (uint8_t *)av_malloc( buffer_size );
|
buffer_copy = (uint8_t *)av_malloc(buffer_size);
|
||||||
if ( !buffer_copy ) {
|
if ( !buffer_copy ) {
|
||||||
Panic( "Could not allocate buffer_copy" );
|
Error( "Could not allocate buffer_copy" );
|
||||||
|
pthread_mutex_unlock(buffer_copy_lock);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
buffer_copy_size = buffer_size;
|
buffer_copy_size = buffer_size;
|
||||||
|
@ -573,7 +583,7 @@ double VideoStream::EncodeFrame( const uint8_t *buffer, int buffer_size, bool _a
|
||||||
buffer_copy_used = buffer_size;
|
buffer_copy_used = buffer_size;
|
||||||
memcpy(buffer_copy, buffer, buffer_size);
|
memcpy(buffer_copy, buffer, buffer_size);
|
||||||
|
|
||||||
if ( pthread_mutex_unlock( buffer_copy_lock ) != 0 ) {
|
if ( pthread_mutex_unlock(buffer_copy_lock) != 0 ) {
|
||||||
Fatal( "EncodeFrame: pthread_mutex_unlock failed." );
|
Fatal( "EncodeFrame: pthread_mutex_unlock failed." );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,21 +1,21 @@
|
||||||
/*
|
/*
|
||||||
* ZoneMinder MPEG Interface, $Date$, $Revision$
|
* ZoneMinder MPEG Interface, $Date$, $Revision$
|
||||||
* Copyright (C) 2001-2008 Philip Coombes
|
* Copyright (C) 2001-2008 Philip Coombes
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or
|
* This program is free software; you can redistribute it and/or
|
||||||
* modify it under the terms of the GNU General Public License
|
* modify it under the terms of the GNU General Public License
|
||||||
* as published by the Free Software Foundation; either version 2
|
* as published by the Free Software Foundation; either version 2
|
||||||
* of the License, or (at your option) any later version.
|
* of the License, or (at your option) any later version.
|
||||||
*
|
*
|
||||||
* This program is distributed in the hope that it will be useful,
|
* This program is distributed in the hope that it will be useful,
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
* GNU General Public License for more details.
|
* GNU General Public License for more details.
|
||||||
*
|
*
|
||||||
* You should have received a copy of the GNU General Public License
|
* You should have received a copy of the GNU General Public License
|
||||||
* along with this program; if not, write to the Free Software
|
* along with this program; if not, write to the Free Software
|
||||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef ZM_MPEG_H
|
#ifndef ZM_MPEG_H
|
||||||
#define ZM_MPEG_H
|
#define ZM_MPEG_H
|
||||||
|
@ -51,7 +51,7 @@ protected:
|
||||||
uint8_t *video_outbuf;
|
uint8_t *video_outbuf;
|
||||||
int video_outbuf_size;
|
int video_outbuf_size;
|
||||||
double last_pts;
|
double last_pts;
|
||||||
|
|
||||||
pthread_t streaming_thread;
|
pthread_t streaming_thread;
|
||||||
bool do_streaming;
|
bool do_streaming;
|
||||||
bool add_timestamp;
|
bool add_timestamp;
|
||||||
|
@ -78,7 +78,7 @@ public:
|
||||||
VideoStream( const char *filename, const char *format, int bitrate, double frame_rate, int colours, int subpixelorder, int width, int height );
|
VideoStream( const char *filename, const char *format, int bitrate, double frame_rate, int colours, int subpixelorder, int width, int height );
|
||||||
~VideoStream();
|
~VideoStream();
|
||||||
const char *MimeType() const;
|
const char *MimeType() const;
|
||||||
void OpenStream();
|
bool OpenStream();
|
||||||
double EncodeFrame( const uint8_t *buffer, int buffer_size, bool add_timestamp=false, unsigned int timestamp=0 );
|
double EncodeFrame( const uint8_t *buffer, int buffer_size, bool add_timestamp=false, unsigned int timestamp=0 );
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -101,7 +101,7 @@ unsigned int zm_packetqueue::clearQueue( unsigned int frames_to_keep, int stream
|
||||||
}
|
}
|
||||||
if ( it != pktQueue.rend() ) {
|
if ( it != pktQueue.rend() ) {
|
||||||
// We want to keep this packet, so advance to the next
|
// We want to keep this packet, so advance to the next
|
||||||
it ++;
|
++it;
|
||||||
}
|
}
|
||||||
unsigned int delete_count = 0;
|
unsigned int delete_count = 0;
|
||||||
while ( it != pktQueue.rend() ) {
|
while ( it != pktQueue.rend() ) {
|
||||||
|
|
|
@ -54,7 +54,7 @@ private:
|
||||||
pthread_t pid() { return( pthread_self() ); }
|
pthread_t pid() { return( pthread_self() ); }
|
||||||
#endif
|
#endif
|
||||||
public:
|
public:
|
||||||
explicit ThreadException( const std::string &message ) : Exception( stringtf( "(%d) "+message, (long int)pid() ) ) {
|
explicit ThreadException( const std::string &message ) : Exception( stringtf("(%d) ", (long int)pid())+message ) {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -97,61 +97,53 @@ private:
|
||||||
ScopedMutex( const ScopedMutex & );
|
ScopedMutex( const ScopedMutex & );
|
||||||
};
|
};
|
||||||
|
|
||||||
class Condition
|
class Condition {
|
||||||
{
|
|
||||||
private:
|
private:
|
||||||
Mutex &mMutex;
|
Mutex &mMutex;
|
||||||
pthread_cond_t mCondition;
|
pthread_cond_t mCondition;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
Condition( Mutex &mutex );
|
explicit Condition(Mutex &mutex);
|
||||||
~Condition();
|
~Condition();
|
||||||
|
|
||||||
void wait();
|
void wait();
|
||||||
bool wait( int secs );
|
bool wait(int secs);
|
||||||
bool wait( double secs );
|
bool wait(double secs);
|
||||||
void signal();
|
void signal();
|
||||||
void broadcast();
|
void broadcast();
|
||||||
};
|
};
|
||||||
|
|
||||||
class Semaphore : public Condition
|
class Semaphore : public Condition {
|
||||||
{
|
|
||||||
private:
|
private:
|
||||||
Mutex mMutex;
|
Mutex mMutex;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
Semaphore() : Condition( mMutex )
|
Semaphore() : Condition(mMutex) {
|
||||||
{
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void wait()
|
void wait() {
|
||||||
{
|
|
||||||
mMutex.lock();
|
mMutex.lock();
|
||||||
Condition::wait();
|
Condition::wait();
|
||||||
mMutex.unlock();
|
mMutex.unlock();
|
||||||
}
|
}
|
||||||
bool wait( int secs )
|
bool wait(int secs) {
|
||||||
{
|
|
||||||
mMutex.lock();
|
mMutex.lock();
|
||||||
bool result = Condition::wait( secs );
|
bool result = Condition::wait(secs);
|
||||||
mMutex.unlock();
|
mMutex.unlock();
|
||||||
return( result );
|
return result;
|
||||||
}
|
}
|
||||||
bool wait( double secs )
|
bool wait(double secs) {
|
||||||
{
|
|
||||||
mMutex.lock();
|
mMutex.lock();
|
||||||
bool result = Condition::wait( secs );
|
bool result = Condition::wait(secs);
|
||||||
mMutex.unlock();
|
mMutex.unlock();
|
||||||
return( result );
|
return result;
|
||||||
}
|
}
|
||||||
void signal()
|
void signal() {
|
||||||
{
|
|
||||||
mMutex.lock();
|
mMutex.lock();
|
||||||
Condition::signal();
|
Condition::signal();
|
||||||
mMutex.unlock();
|
mMutex.unlock();
|
||||||
}
|
}
|
||||||
void broadcast()
|
void broadcast() {
|
||||||
{
|
|
||||||
mMutex.lock();
|
mMutex.lock();
|
||||||
Condition::broadcast();
|
Condition::broadcast();
|
||||||
mMutex.unlock();
|
mMutex.unlock();
|
||||||
|
@ -169,7 +161,7 @@ public:
|
||||||
__attribute__((used)) ThreadData() : mValue(0), mCondition( mMutex ) {
|
__attribute__((used)) ThreadData() : mValue(0), mCondition( mMutex ) {
|
||||||
mChanged = false;
|
mChanged = false;
|
||||||
}
|
}
|
||||||
__attribute__((used)) ThreadData( T value ) : mValue( value ), mCondition( mMutex ) {
|
explicit __attribute__((used)) ThreadData( T value ) : mValue( value ), mCondition( mMutex ) {
|
||||||
mChanged = false;
|
mChanged = false;
|
||||||
}
|
}
|
||||||
//~ThreadData() {}
|
//~ThreadData() {}
|
||||||
|
@ -200,8 +192,7 @@ public:
|
||||||
__attribute__((used)) void updateValueBroadcast( const T value );
|
__attribute__((used)) void updateValueBroadcast( const T value );
|
||||||
};
|
};
|
||||||
|
|
||||||
class Thread
|
class Thread {
|
||||||
{
|
|
||||||
public:
|
public:
|
||||||
typedef void *(*ThreadFunc)( void * );
|
typedef void *(*ThreadFunc)( void * );
|
||||||
|
|
||||||
|
@ -224,8 +215,7 @@ protected:
|
||||||
virtual ~Thread();
|
virtual ~Thread();
|
||||||
|
|
||||||
#ifndef SOLARIS
|
#ifndef SOLARIS
|
||||||
pid_t id() const
|
pid_t id() const {
|
||||||
{
|
|
||||||
pid_t tid;
|
pid_t tid;
|
||||||
#ifdef __FreeBSD__
|
#ifdef __FreeBSD__
|
||||||
long lwpid;
|
long lwpid;
|
||||||
|
@ -239,16 +229,14 @@ protected:
|
||||||
tid=syscall(SYS_gettid);
|
tid=syscall(SYS_gettid);
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
return tid;
|
return tid;
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
pthread_t id() const
|
pthread_t id() const {
|
||||||
{
|
return pthread_self();
|
||||||
return( pthread_self() );
|
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
void exit( int p_status = 0 )
|
void exit( int p_status = 0 ) {
|
||||||
{
|
|
||||||
//INFO( "Exiting" );
|
//INFO( "Exiting" );
|
||||||
pthread_exit( (void *)&p_status );
|
pthread_exit( (void *)&p_status );
|
||||||
}
|
}
|
||||||
|
@ -260,12 +248,11 @@ public:
|
||||||
void start();
|
void start();
|
||||||
void join();
|
void join();
|
||||||
void kill( int signal );
|
void kill( int signal );
|
||||||
bool isThread()
|
bool isThread() {
|
||||||
{
|
|
||||||
return( mPid > -1 && pthread_equal( pthread_self(), mThread ) );
|
return( mPid > -1 && pthread_equal( pthread_self(), mThread ) );
|
||||||
}
|
}
|
||||||
bool isStarted() const { return( mStarted ); }
|
bool isStarted() const { return mStarted; }
|
||||||
bool isRunning() const { return( mRunning ); }
|
bool isRunning() const { return mRunning; }
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // ZM_THREAD_H
|
#endif // ZM_THREAD_H
|
||||||
|
|
|
@ -53,8 +53,7 @@ private:
|
||||||
pthread_t pid() { return( pthread_self() ); }
|
pthread_t pid() { return( pthread_self() ); }
|
||||||
#endif
|
#endif
|
||||||
public:
|
public:
|
||||||
TimerException( const std::string &message ) : Exception( stringtf( "(%d) "+message, (long int)pid() ) )
|
explicit TimerException( const std::string &message ) : Exception( stringtf("(%d) ", (long int)pid())+message ) {
|
||||||
{
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -59,7 +59,7 @@ public:
|
||||||
~User();
|
~User();
|
||||||
User( User &u ) { Copy(u); }
|
User( User &u ) { Copy(u); }
|
||||||
void Copy( const User &u );
|
void Copy( const User &u );
|
||||||
User operator=(const User &u) {
|
User& operator=(const User &u) {
|
||||||
Copy(u); return *this;
|
Copy(u); return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -49,7 +49,7 @@ std::string trimSet(std::string str, std::string trimset) {
|
||||||
return str.substr( startpos, endpos-startpos+1 );
|
return str.substr( startpos, endpos-startpos+1 );
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string trimSpaces(std::string str) {
|
std::string trimSpaces(const std::string &str) {
|
||||||
return trimSet(str, " \t");
|
return trimSet(str, " \t");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -28,12 +28,12 @@
|
||||||
|
|
||||||
typedef std::vector<std::string> StringVector;
|
typedef std::vector<std::string> StringVector;
|
||||||
|
|
||||||
std::string trimSpaces(std::string str);
|
std::string trimSpaces(const std::string &str);
|
||||||
std::string trimSet(std::string str, std::string trimset);
|
std::string trimSet(std::string str, std::string trimset);
|
||||||
std::string replaceAll(std::string str, std::string from, std::string to);
|
std::string replaceAll(std::string str, std::string from, std::string to);
|
||||||
|
|
||||||
const std::string stringtf( const char *format, ... );
|
const std::string stringtf( const char *format, ... );
|
||||||
const std::string stringtf( const std::string format, ... );
|
const std::string stringtf( const std::string &format, ... );
|
||||||
|
|
||||||
bool startsWith( const std::string &haystack, const std::string &needle );
|
bool startsWith( const std::string &haystack, const std::string &needle );
|
||||||
StringVector split( const std::string &string, const std::string &chars, int limit=0 );
|
StringVector split( const std::string &string, const std::string &chars, int limit=0 );
|
||||||
|
|
|
@ -219,8 +219,7 @@ VideoStore::VideoStore(const char *filename_in, const char *format_in,
|
||||||
|
|
||||||
if (audio_in_ctx->codec_id != AV_CODEC_ID_AAC) {
|
if (audio_in_ctx->codec_id != AV_CODEC_ID_AAC) {
|
||||||
static char error_buffer[256];
|
static char error_buffer[256];
|
||||||
avcodec_string(error_buffer, sizeof(error_buffer), audio_in_ctx,
|
avcodec_string(error_buffer, sizeof(error_buffer), audio_in_ctx, 0);
|
||||||
0);
|
|
||||||
Debug(2, "Got something other than AAC (%s)", error_buffer);
|
Debug(2, "Got something other than AAC (%s)", error_buffer);
|
||||||
|
|
||||||
if (!setup_resampler()) {
|
if (!setup_resampler()) {
|
||||||
|
@ -361,8 +360,8 @@ VideoStore::~VideoStore() {
|
||||||
// Put encoder into flushing mode
|
// Put encoder into flushing mode
|
||||||
avcodec_send_frame(audio_out_ctx, NULL);
|
avcodec_send_frame(audio_out_ctx, NULL);
|
||||||
ret = avcodec_receive_packet(audio_out_ctx, &pkt);
|
ret = avcodec_receive_packet(audio_out_ctx, &pkt);
|
||||||
if (ret < 0) {
|
if ( ret < 0 ) {
|
||||||
if (AVERROR_EOF != ret) {
|
if ( AVERROR_EOF != ret ) {
|
||||||
Error("ERror encoding audio while flushing (%d) (%s)", ret,
|
Error("ERror encoding audio while flushing (%d) (%s)", ret,
|
||||||
av_err2str(ret));
|
av_err2str(ret));
|
||||||
}
|
}
|
||||||
|
@ -372,13 +371,13 @@ VideoStore::~VideoStore() {
|
||||||
int got_packet = 0;
|
int got_packet = 0;
|
||||||
ret =
|
ret =
|
||||||
avcodec_encode_audio2(audio_out_ctx, &pkt, NULL, &got_packet);
|
avcodec_encode_audio2(audio_out_ctx, &pkt, NULL, &got_packet);
|
||||||
if (ret < 0) {
|
if ( ret < 0 ) {
|
||||||
Error("ERror encoding audio while flushing (%d) (%s)", ret,
|
Error("ERror encoding audio while flushing (%d) (%s)", ret,
|
||||||
av_err2str(ret));
|
av_err2str(ret));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
Debug(1, "Have audio encoder, need to flush it's out");
|
Debug(1, "Have audio encoder, need to flush it's out");
|
||||||
if (!got_packet) {
|
if ( !got_packet ) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -387,7 +386,7 @@ VideoStore::~VideoStore() {
|
||||||
pkt.pts = audio_next_pts;
|
pkt.pts = audio_next_pts;
|
||||||
pkt.dts = audio_next_dts;
|
pkt.dts = audio_next_dts;
|
||||||
|
|
||||||
if (pkt.duration > 0)
|
if ( pkt.duration > 0 )
|
||||||
pkt.duration =
|
pkt.duration =
|
||||||
av_rescale_q(pkt.duration, audio_out_ctx->time_base,
|
av_rescale_q(pkt.duration, audio_out_ctx->time_base,
|
||||||
audio_out_stream->time_base);
|
audio_out_stream->time_base);
|
||||||
|
@ -429,12 +428,12 @@ VideoStore::~VideoStore() {
|
||||||
// allocation/de-allocation constantly, or whether we can just re-use it.
|
// allocation/de-allocation constantly, or whether we can just re-use it.
|
||||||
// Just do a file open/close/writeheader/etc.
|
// Just do a file open/close/writeheader/etc.
|
||||||
// What if we were only doing audio recording?
|
// What if we were only doing audio recording?
|
||||||
if (video_out_stream) {
|
if ( video_out_stream ) {
|
||||||
#if LIBAVCODEC_VERSION_CHECK(57, 64, 0, 64, 0)
|
#if LIBAVCODEC_VERSION_CHECK(57, 64, 0, 64, 0)
|
||||||
// We allocate and copy in newer ffmpeg, so need to free it
|
// We allocate and copy in newer ffmpeg, so need to free it
|
||||||
avcodec_free_context(&video_in_ctx);
|
avcodec_free_context(&video_in_ctx);
|
||||||
#endif
|
#endif
|
||||||
video_in_ctx=NULL;
|
video_in_ctx = NULL;
|
||||||
|
|
||||||
avcodec_close(video_out_ctx);
|
avcodec_close(video_out_ctx);
|
||||||
#if LIBAVCODEC_VERSION_CHECK(57, 64, 0, 64, 0)
|
#if LIBAVCODEC_VERSION_CHECK(57, 64, 0, 64, 0)
|
||||||
|
@ -445,13 +444,13 @@ VideoStore::~VideoStore() {
|
||||||
}
|
}
|
||||||
if ( audio_out_stream ) {
|
if ( audio_out_stream ) {
|
||||||
if ( audio_in_codec ) {
|
if ( audio_in_codec ) {
|
||||||
avcodec_close(audio_in_ctx);
|
avcodec_close(audio_in_ctx);
|
||||||
#if LIBAVCODEC_VERSION_CHECK(57, 64, 0, 64, 0)
|
#if LIBAVCODEC_VERSION_CHECK(57, 64, 0, 64, 0)
|
||||||
// We allocate and copy in newer ffmpeg, so need to free it
|
// We allocate and copy in newer ffmpeg, so need to free it
|
||||||
avcodec_free_context(&audio_in_ctx);
|
avcodec_free_context(&audio_in_ctx);
|
||||||
#endif
|
#endif
|
||||||
audio_in_ctx = NULL;
|
audio_in_ctx = NULL;
|
||||||
audio_in_codec = NULL;
|
audio_in_codec = NULL;
|
||||||
} // end if audio_in_codec
|
} // end if audio_in_codec
|
||||||
|
|
||||||
avcodec_close(audio_out_ctx);
|
avcodec_close(audio_out_ctx);
|
||||||
|
@ -460,19 +459,19 @@ VideoStore::~VideoStore() {
|
||||||
#endif
|
#endif
|
||||||
audio_out_ctx = NULL;
|
audio_out_ctx = NULL;
|
||||||
#ifdef HAVE_LIBAVRESAMPLE
|
#ifdef HAVE_LIBAVRESAMPLE
|
||||||
if (resample_ctx) {
|
if ( resample_ctx ) {
|
||||||
avresample_close(resample_ctx);
|
avresample_close(resample_ctx);
|
||||||
avresample_free(&resample_ctx);
|
avresample_free(&resample_ctx);
|
||||||
}
|
}
|
||||||
if (in_frame) {
|
if ( in_frame ) {
|
||||||
av_frame_free(&in_frame);
|
av_frame_free(&in_frame);
|
||||||
in_frame = NULL;
|
in_frame = NULL;
|
||||||
}
|
}
|
||||||
if (out_frame) {
|
if ( out_frame ) {
|
||||||
av_frame_free(&out_frame);
|
av_frame_free(&out_frame);
|
||||||
out_frame = NULL;
|
out_frame = NULL;
|
||||||
}
|
}
|
||||||
if (converted_in_samples) {
|
if ( converted_in_samples ) {
|
||||||
av_free(converted_in_samples);
|
av_free(converted_in_samples);
|
||||||
converted_in_samples = NULL;
|
converted_in_samples = NULL;
|
||||||
}
|
}
|
||||||
|
@ -481,11 +480,10 @@ VideoStore::~VideoStore() {
|
||||||
|
|
||||||
/* free the stream */
|
/* free the stream */
|
||||||
avformat_free_context(oc);
|
avformat_free_context(oc);
|
||||||
}
|
} // VideoStore::~VideoStore()
|
||||||
|
|
||||||
bool VideoStore::setup_resampler() {
|
bool VideoStore::setup_resampler() {
|
||||||
#ifdef HAVE_LIBAVRESAMPLE
|
#ifdef HAVE_LIBAVRESAMPLE
|
||||||
static char error_buffer[256];
|
|
||||||
|
|
||||||
#if LIBAVCODEC_VERSION_CHECK(57, 64, 0, 64, 0)
|
#if LIBAVCODEC_VERSION_CHECK(57, 64, 0, 64, 0)
|
||||||
// Newer ffmpeg wants to keep everything separate... so have to lookup our own
|
// Newer ffmpeg wants to keep everything separate... so have to lookup our own
|
||||||
|
@ -576,9 +574,8 @@ bool VideoStore::setup_resampler() {
|
||||||
}
|
}
|
||||||
ret = avcodec_open2(audio_out_ctx, audio_out_codec, &opts);
|
ret = avcodec_open2(audio_out_ctx, audio_out_codec, &opts);
|
||||||
av_dict_free(&opts);
|
av_dict_free(&opts);
|
||||||
if (ret < 0) {
|
if ( ret < 0 ) {
|
||||||
av_strerror(ret, error_buffer, sizeof(error_buffer));
|
Error("could not open codec (%d) (%s)\n", ret, av_make_error_string(ret).c_str());
|
||||||
Fatal("could not open codec (%d) (%s)\n", ret, error_buffer);
|
|
||||||
audio_out_codec = NULL;
|
audio_out_codec = NULL;
|
||||||
audio_out_ctx = NULL;
|
audio_out_ctx = NULL;
|
||||||
audio_out_stream = NULL;
|
audio_out_stream = NULL;
|
||||||
|
|
|
@ -3,8 +3,6 @@
|
||||||
|
|
||||||
#include "zm_ffmpeg.h"
|
#include "zm_ffmpeg.h"
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#include "libavutil/audio_fifo.h"
|
|
||||||
|
|
||||||
#ifdef HAVE_LIBAVRESAMPLE
|
#ifdef HAVE_LIBAVRESAMPLE
|
||||||
#include "libavresample/avresample.h"
|
#include "libavresample/avresample.h"
|
||||||
#endif
|
#endif
|
||||||
|
@ -40,19 +38,14 @@ private:
|
||||||
// The following are used when encoding the audio stream to AAC
|
// The following are used when encoding the audio stream to AAC
|
||||||
AVCodec *audio_out_codec;
|
AVCodec *audio_out_codec;
|
||||||
AVCodecContext *audio_out_ctx;
|
AVCodecContext *audio_out_ctx;
|
||||||
AVAudioFifo *fifo;
|
|
||||||
int out_frame_size;
|
|
||||||
#ifdef HAVE_LIBAVRESAMPLE
|
#ifdef HAVE_LIBAVRESAMPLE
|
||||||
AVAudioResampleContext* resample_ctx;
|
AVAudioResampleContext* resample_ctx;
|
||||||
#endif
|
#endif
|
||||||
uint8_t *converted_in_samples;
|
uint8_t *converted_in_samples;
|
||||||
|
|
||||||
const char *filename;
|
const char *filename;
|
||||||
const char *format;
|
const char *format;
|
||||||
|
|
||||||
bool keyframeMessage;
|
|
||||||
int keyframeSkipNumber;
|
|
||||||
|
|
||||||
// These are for in
|
// These are for in
|
||||||
int64_t video_last_pts;
|
int64_t video_last_pts;
|
||||||
int64_t video_last_dts;
|
int64_t video_last_dts;
|
||||||
|
|
Loading…
Reference in New Issue