Commit 6921d874 authored by Sylvain Berfini's avatar Sylvain Berfini 🎩

Added jpeg_writer filter in video preview graph

parent 64c7fbaa
......@@ -22,6 +22,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#include <mediastreamer2/msfilter.h>
#define MS_JPEG_WRITER_TAKE_SNAPSHOT MS_FILTER_METHOD(MS_JPEG_WRITER_ID,0,const char)
#define MS_JPEG_WRITER_TAKE_SNAPSHOT MS_FILTER_METHOD(MS_JPEG_WRITER_ID, 0, const char)
#define MS_JPEG_WRITER_SNAPSHOT_TAKEN MS_FILTER_EVENT(MS_JPEG_WRITER_ID, 0, const char)
#endif
......@@ -32,6 +32,7 @@ typedef struct {
char *tmpFilename;
AVCodec *codec;
AVFrame* pict;
MSFilter *f;
}JpegWriter;
static void close_file(JpegWriter *obj, bool_t doRenaming);
......@@ -55,6 +56,8 @@ static void close_file(JpegWriter *obj, bool_t doRenaming) {
if(doRenaming) {
if(rename(obj->tmpFilename, obj->filename) != 0) {
ms_error("Could not rename %s into %s", obj->tmpFilename, obj->filename);
} else {
ms_filter_notify(obj->f, MS_JPEG_WRITER_SNAPSHOT_TAKEN, (void *)obj->filename);
}
}
ms_free(obj->filename);
......@@ -66,6 +69,7 @@ static void close_file(JpegWriter *obj, bool_t doRenaming) {
static void jpg_init(MSFilter *f){
JpegWriter *s=ms_new0(JpegWriter,1);
s->f = f;
s->codec=avcodec_find_encoder(CODEC_ID_MJPEG);
if (s->codec==NULL){
ms_error("Could not find CODEC_ID_MJPEG !");
......@@ -76,6 +80,7 @@ static void jpg_init(MSFilter *f){
static void jpg_uninit(MSFilter *f){
JpegWriter *s=(JpegWriter*)f->data;
s->f = NULL;
if (s->file!=NULL){
close_file(s, FALSE);
}
......
......@@ -1544,17 +1544,18 @@ MSVideoSize video_preview_get_current_size(VideoPreview *stream){
return ret;
}
void video_preview_start(VideoPreview *stream, MSWebCam *device){
void video_preview_start(VideoPreview *stream, MSWebCam *device) {
MSPixFmt format;
float fps;
int mirroring=1;
int corner=-1;
MSVideoSize disp_size=stream->sent_vsize;
MSVideoSize vsize=disp_size;
const char *displaytype=stream->display_name;
int mirroring = 1;
int corner = -1;
MSVideoSize disp_size = stream->sent_vsize;
MSVideoSize vsize = disp_size;
const char *displaytype = stream->display_name;
MSConnectionHelper ch;
if (stream->fps!=0) fps=stream->fps;
else fps=(float)29.97;
if (stream->fps != 0) fps = stream->fps;
else fps = (float)29.97;
stream->source = ms_web_cam_create_reader(device);
......@@ -1567,52 +1568,85 @@ void video_preview_start(VideoPreview *stream, MSWebCam *device){
}
/* configure the filters */
ms_filter_call_method(stream->source,MS_FILTER_SET_VIDEO_SIZE,&vsize);
if (ms_filter_get_id(stream->source)!=MS_STATIC_IMAGE_ID)
ms_filter_call_method(stream->source,MS_FILTER_SET_FPS,&fps);
ms_filter_call_method(stream->source,MS_FILTER_GET_PIX_FMT,&format);
ms_filter_call_method(stream->source,MS_FILTER_GET_VIDEO_SIZE,&vsize);
if (format==MS_MJPEG){
stream->pixconv=ms_factory_create_filter(stream->ms.factory, MS_MJPEG_DEC_ID);
ms_filter_call_method(stream->source, MS_FILTER_SET_VIDEO_SIZE, &vsize);
if (ms_filter_get_id(stream->source) != MS_STATIC_IMAGE_ID) {
ms_filter_call_method(stream->source, MS_FILTER_SET_FPS, &fps);
}
ms_filter_call_method(stream->source, MS_FILTER_GET_PIX_FMT, &format);
ms_filter_call_method(stream->source, MS_FILTER_GET_VIDEO_SIZE, &vsize);
if (format == MS_MJPEG) {
stream->pixconv = ms_factory_create_filter(stream->ms.factory, MS_MJPEG_DEC_ID);
if (stream->pixconv == NULL){
ms_error("Could not create mjpeg decoder, check your build options.");
}
}else{
stream->pixconv=ms_factory_create_filter(stream->ms.factory, MS_PIX_CONV_ID);
ms_filter_call_method(stream->pixconv,MS_FILTER_SET_PIX_FMT,&format);
ms_filter_call_method(stream->pixconv,MS_FILTER_SET_VIDEO_SIZE,&vsize);
} else {
stream->pixconv = ms_factory_create_filter(stream->ms.factory, MS_PIX_CONV_ID);
ms_filter_call_method(stream->pixconv, MS_FILTER_SET_PIX_FMT, &format);
ms_filter_call_method(stream->pixconv, MS_FILTER_SET_VIDEO_SIZE, &vsize);
}
format=MS_YUV420P;
stream->output2=ms_factory_create_filter_from_name(stream->ms.factory, displaytype);
ms_filter_call_method(stream->output2,MS_FILTER_SET_PIX_FMT,&format);
ms_filter_call_method(stream->output2,MS_FILTER_SET_VIDEO_SIZE,&disp_size);
ms_filter_call_method(stream->output2,MS_VIDEO_DISPLAY_ENABLE_MIRRORING,&mirroring);
ms_filter_call_method(stream->output2,MS_VIDEO_DISPLAY_SET_LOCAL_VIEW_MODE,&corner);
/* and then connect all */
format = MS_YUV420P;
ms_filter_link(stream->source,0, stream->pixconv,0);
ms_filter_link(stream->pixconv, 0, stream->output2, 0);
if (stream->preview_window_id!=0){
video_stream_set_native_preview_window_id(stream, stream->preview_window_id);
if (displaytype) {
stream->output2=ms_factory_create_filter_from_name(stream->ms.factory, displaytype);
ms_filter_call_method(stream->output2, MS_FILTER_SET_PIX_FMT, &format);
ms_filter_call_method(stream->output2, MS_FILTER_SET_VIDEO_SIZE, &disp_size);
ms_filter_call_method(stream->output2, MS_VIDEO_DISPLAY_ENABLE_MIRRORING, &mirroring);
ms_filter_call_method(stream->output2, MS_VIDEO_DISPLAY_SET_LOCAL_VIEW_MODE, &corner);
/* and then connect all */
}
stream->local_jpegwriter = ms_factory_create_filter(stream->ms.factory, MS_JPEG_WRITER_ID);
if (stream->local_jpegwriter) {
stream->tee = ms_factory_create_filter(stream->ms.factory, MS_TEE_ID);
}
ms_connection_helper_start(&ch);
ms_connection_helper_link(&ch, stream->source, -1, 0);
if (stream->pixconv) {
ms_connection_helper_link(&ch, stream->pixconv, 0, 0);
}
if (stream->tee) {
ms_connection_helper_link(&ch, stream->tee, 0, 0);
}
if (stream->output2) {
if (stream->preview_window_id != 0) {
video_stream_set_native_preview_window_id(stream, stream->preview_window_id);
}
ms_filter_link(stream->tee, 1, stream->output2, 0);
}
if (stream->local_jpegwriter) {
ms_filter_link(stream->tee, 2, stream->local_jpegwriter, 0);
}
/* create the ticker */
stream->ms.sessions.ticker = ms_ticker_new();
ms_ticker_set_name(stream->ms.sessions.ticker,"Video MSTicker");
ms_ticker_set_name(stream->ms.sessions.ticker, "Video MSTicker");
ms_ticker_attach (stream->ms.sessions.ticker, stream->source);
stream->ms.state=MSStreamStarted;
stream->ms.state = MSStreamStarted;
}
static MSFilter* _video_preview_stop( VideoPreview* stream, bool_t keep_source ){
static MSFilter* _video_preview_stop( VideoPreview* stream, bool_t keep_source) {
MSFilter* source = NULL;
MSConnectionHelper ch;
ms_ticker_detach(stream->ms.sessions.ticker, stream->source);
ms_filter_unlink(stream->source,0,stream->pixconv,0);
ms_filter_unlink(stream->pixconv,0,stream->output2,0);
ms_connection_helper_start(&ch);
ms_connection_helper_unlink(&ch, stream->source, -1, 0);
if (stream->pixconv) {
ms_connection_helper_unlink(&ch, stream->pixconv, 0, 0);
}
if (stream->tee) {
ms_connection_helper_unlink(&ch, stream->tee, 0, 0);
}
if (stream->output2) {
ms_filter_unlink(stream->tee, 1, stream->output2, 0);
}
if (stream->local_jpegwriter) {
ms_filter_unlink(stream->tee, 2, stream->local_jpegwriter, 0);
}
if( keep_source ){
if (keep_source) {
source = stream->source;
ms_message("video_preview_stop: keeping source %p", source);
stream->source = NULL; // prevent destroy of the source
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment