2004-03-04 23:05:54 +08:00
|
|
|
/*
|
|
|
|
* ZoneMinder MPEG Interface, $Date$, $Revision$
|
2008-07-25 17:33:23 +08:00
|
|
|
* Copyright (C) 2001-2008 Philip Coombes
|
2018-04-12 23:29:35 +08:00
|
|
|
*
|
2004-03-04 23:05:54 +08:00
|
|
|
* This program is free software; you can redistribute it and/or
|
|
|
|
* modify it under the terms of the GNU General Public License
|
|
|
|
* as published by the Free Software Foundation; either version 2
|
|
|
|
* of the License, or (at your option) any later version.
|
2018-04-12 23:29:35 +08:00
|
|
|
*
|
2004-03-04 23:05:54 +08:00
|
|
|
* This program is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
* GNU General Public License for more details.
|
2018-04-12 23:29:35 +08:00
|
|
|
*
|
2004-03-04 23:05:54 +08:00
|
|
|
* You should have received a copy of the GNU General Public License
|
|
|
|
* along with this program; if not, write to the Free Software
|
2016-12-26 23:23:16 +08:00
|
|
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
2018-04-12 23:29:35 +08:00
|
|
|
*/
|
2004-03-04 23:05:54 +08:00
|
|
|
|
|
|
|
#ifndef ZM_MPEG_H
|
|
|
|
#define ZM_MPEG_H
|
|
|
|
|
2008-07-16 16:35:59 +08:00
|
|
|
#include "zm_ffmpeg.h"
|
2005-12-09 08:25:12 +08:00
|
|
|
|
2008-07-25 00:57:39 +08:00
|
|
|
#if HAVE_LIBAVCODEC
|
|
|
|
|
2017-11-19 05:00:10 +08:00
|
|
|
class VideoStream {
|
2005-12-07 21:42:25 +08:00
|
|
|
protected:
|
2017-11-19 05:00:10 +08:00
|
|
|
struct MimeData {
|
2016-04-04 22:11:48 +08:00
|
|
|
const char *format;
|
|
|
|
const char *mime_type;
|
|
|
|
};
|
2005-12-07 21:42:25 +08:00
|
|
|
|
2004-03-04 23:05:54 +08:00
|
|
|
protected:
|
2016-04-04 22:11:48 +08:00
|
|
|
static bool initialised;
|
|
|
|
static struct MimeData mime_data[];
|
2004-03-04 23:05:54 +08:00
|
|
|
|
|
|
|
protected:
|
2016-04-04 22:11:48 +08:00
|
|
|
char *codec_and_format;
|
|
|
|
const char *filename;
|
|
|
|
const char *format;
|
|
|
|
const char *codec_name;
|
|
|
|
enum _AVPIXELFORMAT pf;
|
|
|
|
AVOutputFormat *of;
|
|
|
|
AVFormatContext *ofc;
|
|
|
|
AVStream *ost;
|
2017-11-08 10:21:51 +08:00
|
|
|
AVCodecContext *codec_context;
|
2016-04-04 22:11:48 +08:00
|
|
|
AVCodec *codec;
|
|
|
|
AVFrame *opicture;
|
|
|
|
AVFrame *tmp_opicture;
|
|
|
|
uint8_t *video_outbuf;
|
|
|
|
int video_outbuf_size;
|
|
|
|
double last_pts;
|
2018-04-12 23:29:35 +08:00
|
|
|
|
2016-04-04 22:11:48 +08:00
|
|
|
pthread_t streaming_thread;
|
|
|
|
bool do_streaming;
|
|
|
|
bool add_timestamp;
|
|
|
|
unsigned int timestamp;
|
2017-11-19 05:00:10 +08:00
|
|
|
uint8_t *buffer_copy;
|
2016-04-04 22:11:48 +08:00
|
|
|
pthread_mutex_t *buffer_copy_lock;
|
|
|
|
int buffer_copy_size;
|
|
|
|
int buffer_copy_used;
|
|
|
|
AVPacket** packet_buffers;
|
|
|
|
int packet_index;
|
|
|
|
int SendPacket(AVPacket *packet);
|
|
|
|
static void* StreamingThreadCallback(void *ctx);
|
2004-03-04 23:05:54 +08:00
|
|
|
|
|
|
|
protected:
|
2016-04-04 22:11:48 +08:00
|
|
|
static void Initialise();
|
2004-03-04 23:05:54 +08:00
|
|
|
|
2016-04-04 22:11:48 +08:00
|
|
|
void SetupFormat( );
|
|
|
|
void SetupCodec( int colours, int subpixelorder, int width, int height, int bitrate, double frame_rate );
|
|
|
|
void SetParameters();
|
|
|
|
void ActuallyOpenStream();
|
|
|
|
double ActuallyEncodeFrame( const uint8_t *buffer, int buffer_size, bool add_timestamp=false, unsigned int timestamp=0 );
|
2004-03-04 23:05:54 +08:00
|
|
|
|
|
|
|
public:
|
2016-04-04 22:11:48 +08:00
|
|
|
VideoStream( const char *filename, const char *format, int bitrate, double frame_rate, int colours, int subpixelorder, int width, int height );
|
|
|
|
~VideoStream();
|
|
|
|
const char *MimeType() const;
|
2018-04-12 23:29:35 +08:00
|
|
|
bool OpenStream();
|
2016-04-04 22:11:48 +08:00
|
|
|
double EncodeFrame( const uint8_t *buffer, int buffer_size, bool add_timestamp=false, unsigned int timestamp=0 );
|
2004-03-04 23:05:54 +08:00
|
|
|
};
|
|
|
|
|
|
|
|
#endif // HAVE_LIBAVCODEC
|
2008-07-25 00:57:39 +08:00
|
|
|
|
|
|
|
#endif // ZM_MPEG_H
|