From e166e8943388389bb4fc2927aac8758387c42846 Mon Sep 17 00:00:00 2001 From: "N.N." Date: Tue, 30 Mar 2004 01:56:16 +0000 Subject: PiDiP 0.12.13 svn path=/trunk/externals/pidip/; revision=1508 --- modules/Makefile | 7 +-- modules/Makefile.in | 7 +-- modules/pdp_cmap.c | 9 ++-- modules/pdp_compose.c | 9 ++-- modules/pdp_ctrack.c | 10 ++-- modules/pdp_ffmpeg~.c | 37 +++++++++------ modules/pdp_imgloader.c | 4 +- modules/pdp_live~.c | 121 ++++++++++++++++++++++++++++++++++++++---------- modules/pdp_shape.c | 20 ++++++-- modules/pdp_simura.c | 4 +- modules/pdp_spigot.c | 4 +- modules/pdp_xcanvas.c | 3 +- modules/pdp_yqt.c | 4 +- modules/pdp_yvu2rgb.c | 4 +- 14 files changed, 172 insertions(+), 71 deletions(-) (limited to 'modules') diff --git a/modules/Makefile b/modules/Makefile index 14b6c92..5d93176 100644 --- a/modules/Makefile +++ b/modules/Makefile @@ -11,10 +11,11 @@ OBJECTS = pdp_intrusion.o pdp_yqt.o pdp_simura.o pdp_underwatch.o \ pdp_cycle.o pdp_transform.o pdp_shagadelic.o \ pdp_dice.o pdp_puzzle.o pdp_text.o pdp_form.o \ pdp_compose.o pdp_cmap.o pdp_ascii.o \ - pdp_ffmpeg~.o pdp_live~.o pdp_segsnd~.o pdp_noquark.o \ - pdp_juxta.o pdp_capture.o pdp_smuck.o pdp_lumafilt.o \ + pdp_segsnd~.o pdp_noquark.o pdp_juxta.o \ + pdp_capture.o pdp_smuck.o pdp_lumafilt.o \ pdp_transition.o pdp_imgloader.o pdp_imgsaver.o pdp_cache.o \ pdp_canvas.o pdp_pen.o pdp_shape.o pdp_fqt.o pdp_fcqt.o \ - pdp_ocanvas.o # pdp_xcanvas.o pdp_aa.o + pdp_ocanvas.o pdp_spotlight.o pdp_live~.o pdp_ffmpeg~.o + # pdp_xcanvas.o pdp_aa.o all_modules: $(OBJECTS) diff --git a/modules/Makefile.in b/modules/Makefile.in index 14b6c92..0b221e6 100644 --- a/modules/Makefile.in +++ b/modules/Makefile.in @@ -11,10 +11,11 @@ OBJECTS = pdp_intrusion.o pdp_yqt.o pdp_simura.o pdp_underwatch.o \ pdp_cycle.o pdp_transform.o pdp_shagadelic.o \ pdp_dice.o pdp_puzzle.o pdp_text.o pdp_form.o \ pdp_compose.o pdp_cmap.o pdp_ascii.o \ - pdp_ffmpeg~.o pdp_live~.o pdp_segsnd~.o pdp_noquark.o \ - pdp_juxta.o pdp_capture.o pdp_smuck.o pdp_lumafilt.o \ + pdp_segsnd~.o pdp_noquark.o pdp_juxta.o \ + pdp_capture.o pdp_smuck.o pdp_lumafilt.o \ pdp_transition.o pdp_imgloader.o pdp_imgsaver.o pdp_cache.o \ pdp_canvas.o pdp_pen.o pdp_shape.o pdp_fqt.o pdp_fcqt.o \ - pdp_ocanvas.o # pdp_xcanvas.o pdp_aa.o + pdp_ocanvas.o pdp_spotlight.o @PDP_STREAMING_OBJECTS@ + # pdp_xcanvas.o pdp_aa.o all_modules: $(OBJECTS) diff --git a/modules/pdp_cmap.c b/modules/pdp_cmap.c index ae2f516..547208d 100644 --- a/modules/pdp_cmap.c +++ b/modules/pdp_cmap.c @@ -22,6 +22,7 @@ */ #include "pdp.h" +#include "g_canvas.h" #include "yuv.h" #include #include @@ -118,7 +119,7 @@ static void pdp_cmap_r(t_pdp_cmap *x, t_floatarg fr ) x->x_colors[x->x_current].y = (yuv_RGBtoY( (x->x_colorR << 16) + (x->x_colorG << 8) + x->x_colorB ))<<7; x->x_colors[x->x_current].u = (yuv_RGBtoU( (x->x_colorR << 16) + (x->x_colorG << 8) + x->x_colorB )-128)<<8; x->x_colors[x->x_current].v = (yuv_RGBtoV( (x->x_colorR << 16) + (x->x_colorG << 8) + x->x_colorB )-128)<<8; - pdp_cmap_draw_color( x, x->x_colorR, x->x_colorG, x->x_colorB ); + if (glist_isvisible(x->x_canvas)) pdp_cmap_draw_color( x, x->x_colorR, x->x_colorG, x->x_colorB ); } } @@ -130,7 +131,7 @@ static void pdp_cmap_g(t_pdp_cmap *x, t_floatarg fg ) x->x_colors[x->x_current].y = (yuv_RGBtoY( (x->x_colorR << 16) + (x->x_colorG << 8) + x->x_colorB ))<<7; x->x_colors[x->x_current].u = (yuv_RGBtoU( (x->x_colorR << 16) + (x->x_colorG << 8) + x->x_colorB )-128)<<8; x->x_colors[x->x_current].v = (yuv_RGBtoV( (x->x_colorR << 16) + (x->x_colorG << 8) + x->x_colorB )-128)<<8; - pdp_cmap_draw_color( x, x->x_colorR, x->x_colorG, x->x_colorB ); + if (glist_isvisible(x->x_canvas)) pdp_cmap_draw_color( x, x->x_colorR, x->x_colorG, x->x_colorB ); } } @@ -142,7 +143,7 @@ static void pdp_cmap_b(t_pdp_cmap *x, t_floatarg fb ) x->x_colors[x->x_current].y = (yuv_RGBtoY( (x->x_colorR << 16) + (x->x_colorG << 8) + x->x_colorB ))<<7; x->x_colors[x->x_current].u = (yuv_RGBtoU( (x->x_colorR << 16) + (x->x_colorG << 8) + x->x_colorB )-128)<<8; x->x_colors[x->x_current].v = (yuv_RGBtoV( (x->x_colorR << 16) + (x->x_colorG << 8) + x->x_colorB )-128)<<8; - pdp_cmap_draw_color( x, x->x_colorR, x->x_colorG, x->x_colorB ); + if (glist_isvisible(x->x_canvas)) pdp_cmap_draw_color( x, x->x_colorR, x->x_colorG, x->x_colorB ); } } @@ -280,7 +281,7 @@ static void pdp_cmap_pick(t_pdp_cmap *x) x->x_colorR = yuv_YUVtoR( y, u, v ); x->x_colorG = yuv_YUVtoG( y, u, v ); x->x_colorB = yuv_YUVtoB( y, u, v ); - pdp_cmap_draw_color( x, x->x_colorR, x->x_colorG, x->x_colorB ); + if (glist_isvisible(x->x_canvas)) pdp_cmap_draw_color( x, x->x_colorR, x->x_colorG, x->x_colorB ); x->x_colors[x->x_current].y = 255; x->x_colors[x->x_current].u = 255; x->x_colors[x->x_current].v = 255; diff --git a/modules/pdp_compose.c b/modules/pdp_compose.c index e3fda24..aad03a9 100644 --- a/modules/pdp_compose.c +++ b/modules/pdp_compose.c @@ -23,6 +23,7 @@ */ #include "pdp.h" +#include "g_canvas.h" #include "yuv.h" #include #include @@ -117,7 +118,7 @@ static void pdp_compose_r(t_pdp_compose *x, t_floatarg fr ) x->x_colorY = (yuv_RGBtoY( (x->x_colorR << 16) + (x->x_colorG << 8) + x->x_colorB ))<<7; x->x_colorU = (yuv_RGBtoU( (x->x_colorR << 16) + (x->x_colorG << 8) + x->x_colorB )-128)<<8; x->x_colorV = (yuv_RGBtoV( (x->x_colorR << 16) + (x->x_colorG << 8) + x->x_colorB )-128)<<8; - pdp_compose_draw_color( x ); + if (glist_isvisible(x->x_canvas)) pdp_compose_draw_color( x ); } } @@ -129,7 +130,7 @@ static void pdp_compose_g(t_pdp_compose *x, t_floatarg fg ) x->x_colorY = (yuv_RGBtoY( (x->x_colorR << 16) + (x->x_colorG << 8) + x->x_colorB ))<<7; x->x_colorU = (yuv_RGBtoU( (x->x_colorR << 16) + (x->x_colorG << 8) + x->x_colorB )-128)<<8; x->x_colorV = (yuv_RGBtoV( (x->x_colorR << 16) + (x->x_colorG << 8) + x->x_colorB )-128)<<8; - pdp_compose_draw_color( x ); + if (glist_isvisible(x->x_canvas)) pdp_compose_draw_color( x ); } } @@ -141,7 +142,7 @@ static void pdp_compose_b(t_pdp_compose *x, t_floatarg fb ) x->x_colorY = (yuv_RGBtoY( (x->x_colorR << 16) + (x->x_colorG << 8) + x->x_colorB ))<<7; x->x_colorU = (yuv_RGBtoU( (x->x_colorR << 16) + (x->x_colorG << 8) + x->x_colorB )-128)<<8; x->x_colorV = (yuv_RGBtoV( (x->x_colorR << 16) + (x->x_colorG << 8) + x->x_colorB )-128)<<8; - pdp_compose_draw_color( x ); + if (glist_isvisible(x->x_canvas)) pdp_compose_draw_color( x ); } } @@ -201,7 +202,7 @@ static void pdp_compose_pick(t_pdp_compose *x) x->x_colorR = yuv_YUVtoR( y, u, v ); x->x_colorG = yuv_YUVtoG( y, u, v ); x->x_colorB = yuv_YUVtoB( y, u, v ); - pdp_compose_draw_color( x ); + if (glist_isvisible(x->x_canvas)) pdp_compose_draw_color( x ); } } diff --git a/modules/pdp_ctrack.c b/modules/pdp_ctrack.c index e9e631b..ed35c9b 100644 --- a/modules/pdp_ctrack.c +++ b/modules/pdp_ctrack.c @@ -22,6 +22,7 @@ */ #include "pdp.h" +#include "g_canvas.h" #include "yuv.h" #include #include @@ -124,7 +125,7 @@ static void pdp_ctrack_r(t_pdp_ctrack *x, t_floatarg fr ) x->x_colorY = (yuv_RGBtoY( (x->x_colorR << 16) + (x->x_colorG << 8) + x->x_colorB ))<<7; x->x_colorU = (yuv_RGBtoU( (x->x_colorR << 16) + (x->x_colorG << 8) + x->x_colorB )-128)<<8; x->x_colorV = (yuv_RGBtoV( (x->x_colorR << 16) + (x->x_colorG << 8) + x->x_colorB )-128)<<8; - pdp_ctrack_draw_color( x ); + if (glist_isvisible(x->x_canvas)) pdp_ctrack_draw_color( x ); outlet_float( x->x_R, x->x_colorR ); } } @@ -137,7 +138,7 @@ static void pdp_ctrack_g(t_pdp_ctrack *x, t_floatarg fg ) x->x_colorY = (yuv_RGBtoY( (x->x_colorR << 16) + (x->x_colorG << 8) + x->x_colorB ))<<7; x->x_colorU = (yuv_RGBtoU( (x->x_colorR << 16) + (x->x_colorG << 8) + x->x_colorB )-128)<<8; x->x_colorV = (yuv_RGBtoV( (x->x_colorR << 16) + (x->x_colorG << 8) + x->x_colorB )-128)<<8; - pdp_ctrack_draw_color( x ); + if (glist_isvisible(x->x_canvas)) pdp_ctrack_draw_color( x ); outlet_float( x->x_G, x->x_colorG ); } } @@ -150,7 +151,7 @@ static void pdp_ctrack_b(t_pdp_ctrack *x, t_floatarg fb ) x->x_colorY = (yuv_RGBtoY( (x->x_colorR << 16) + (x->x_colorG << 8) + x->x_colorB ))<<7; x->x_colorU = (yuv_RGBtoU( (x->x_colorR << 16) + (x->x_colorG << 8) + x->x_colorB )-128)<<8; x->x_colorV = (yuv_RGBtoV( (x->x_colorR << 16) + (x->x_colorG << 8) + x->x_colorB )-128)<<8; - pdp_ctrack_draw_color( x ); + if (glist_isvisible(x->x_canvas)) pdp_ctrack_draw_color( x ); outlet_float( x->x_B, x->x_colorB ); } } @@ -218,6 +219,7 @@ static void pdp_ctrack_pick(t_pdp_ctrack *x) if ( x->x_frame && ( x->x_cursX > 0 ) && ( x->x_cursX < x->x_vwidth ) && ( x->x_cursY > 0 ) && ( x->x_cursY < x->x_vheight ) ) { + // post( "pdp_ctrack : picking up color : x=%d y=%d", x->x_cursX, x->x_cursY ); x->x_colorY = x->x_frame[ x->x_cursY*x->x_vwidth+x->x_cursX ]; x->x_colorV = x->x_frame[ x->x_vsize + (x->x_cursY>>1)*(x->x_vwidth>>1)+(x->x_cursX>>1) ]; x->x_colorU = x->x_frame[ x->x_vsize + (x->x_vsize>>2) + (x->x_cursY>>1)*(x->x_vwidth>>1)+(x->x_cursX>>1) ]; @@ -230,7 +232,7 @@ static void pdp_ctrack_pick(t_pdp_ctrack *x) outlet_float( x->x_G, x->x_colorG ); x->x_colorB = yuv_YUVtoB( y, u, v ); outlet_float( x->x_B, x->x_colorB ); - pdp_ctrack_draw_color( x ); + if (glist_isvisible(x->x_canvas)) pdp_ctrack_draw_color( x ); } } diff --git a/modules/pdp_ffmpeg~.c b/modules/pdp_ffmpeg~.c index ef215ad..5669e96 100644 --- a/modules/pdp_ffmpeg~.c +++ b/modules/pdp_ffmpeg~.c @@ -1,6 +1,6 @@ /* - * Pure Data Packet module. - * Copyright (c) by Tom Schouten + * PiDiP module. + * Copyright (c) by Yves Degoyon (ydegoyon@free.fr) * * 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 @@ -52,6 +52,7 @@ typedef struct pdp_ffmpeg_struct t_outlet *x_outlet_streaming; // indicates the action of streaming t_outlet *x_outlet_nbframes; // number of frames emitted + t_outlet *x_outlet_framerate; // real framerate t_outlet *x_outlet_nbframes_dropped; // number of frames dropped char *x_feedname; @@ -310,7 +311,7 @@ static void pdp_ffmpeg_process_yv12(t_pdp_ffmpeg *x) short int *data = (short int *)pdp_packet_data(x->x_packet0); t_pdp *newheader = 0; short int *newdata = 0; - t_int newpacket = -1, i; + t_int newpacket = -1, i, j; short int *pY, *pU, *pV; uint8_t *pnY, *pnU, *pnV; t_int px, py; @@ -348,14 +349,11 @@ static void pdp_ffmpeg_process_yv12(t_pdp_ffmpeg *x) for(px=0; pxx_vwidth; px++) { *pnY = (uint8_t) (*(pY++)>>7); - if ( *pnY > 255 ) *pnY=255; pnY++; if ( (px%2==0) && (py%2==0) ) { *pnV = (uint8_t) (((*(pV++))>>8)+128); - if ( *pnV > 255 ) *pnV=255; *pnU = (uint8_t) (((*(pU++))>>8)+128); - if ( *pnU > 255 ) *pnU=255; pnU++;pnV++; } } @@ -387,12 +385,20 @@ static void pdp_ffmpeg_process_yv12(t_pdp_ffmpeg *x) if ( etime.tv_sec != x->x_cursec ) { x->x_cursec = etime.tv_sec; - x->x_secondcount[ svideoindex ] = 0; + outlet_float( x->x_outlet_framerate, x->x_secondcount[ svideoindex ] ); + for (j=0; jx_nbvideostreams; j++) + { + x->x_secondcount[ j ] = 0; + } } - if ( x->x_secondcount[ svideoindex ] >= x->x_avcontext->streams[i]->codec.frame_rate/10000 ) + if ( x->x_secondcount[ svideoindex ] >= (x->x_avcontext->streams[i]->codec.frame_rate/10000) ) { - x->x_nbframes_dropped++; - continue; + // post("pdp_ffmpeg : index=%d actual : %d, nominal : %d", + // svideoindex, + // x->x_secondcount[ svideoindex ], + // (x->x_avcontext->streams[i]->codec.frame_rate/10000) ); + x->x_nbframes_dropped++; + continue; } if ( x->x_avcontext->streams[i]->codec.pix_fmt != PIX_FMT_YUV420P ) @@ -463,14 +469,14 @@ static void pdp_ffmpeg_process_yv12(t_pdp_ffmpeg *x) x->x_final_picture = x->x_formatted_picture; } - // encode and send the picture + // encode and send the picture { AVFrame aframe; t_int fsize, ret; memset(&aframe, 0, sizeof(AVFrame)); *(AVPicture*)&aframe= *x->x_final_picture; - + aframe.pts = etime.tv_sec*1000000 + etime.tv_usec; aframe.quality = x->x_avcontext->streams[i]->quality; fsize = avcodec_encode_video(&x->x_avcontext->streams[i]->codec, @@ -484,7 +490,9 @@ static void pdp_ffmpeg_process_yv12(t_pdp_ffmpeg *x) else { x->x_nbframes++; - x->x_secondcount[ svideoindex++ ]++; + x->x_secondcount[ svideoindex ]++; + // post ("pdp_ffmpeg~ : index=%d count=%d", svideoindex, x->x_secondcount[ svideoindex ] ); + svideoindex++; } } } @@ -583,7 +591,7 @@ static t_int *pdp_ffmpeg_perform(t_int *w) x->x_audioin_position=(x->x_audioin_position+1)%(2*MAX_AUDIO_PACKET_SIZE); if ( x->x_audioin_position == 2*MAX_AUDIO_PACKET_SIZE-1 ) { - post( "pdp_ffmpeg~ : reaching end of audio buffer" ); + // post( "pdp_ffmpeg~ : reaching end of audio buffer" ); } fsample=*(in2++); if (fsample > 1.0) { fsample = 1.0; } @@ -686,6 +694,7 @@ void *pdp_ffmpeg_new(void) x->x_outlet_streaming = outlet_new(&x->x_obj, &s_float); x->x_outlet_nbframes = outlet_new(&x->x_obj, &s_float); x->x_outlet_nbframes_dropped = outlet_new(&x->x_obj, &s_float); + x->x_outlet_framerate = outlet_new(&x->x_obj, &s_float); x->x_packet0 = -1; x->x_queue_id = -1; diff --git a/modules/pdp_imgloader.c b/modules/pdp_imgloader.c index fbc0714..752e4bc 100644 --- a/modules/pdp_imgloader.c +++ b/modules/pdp_imgloader.c @@ -98,8 +98,8 @@ static void pdp_imgloader_load(t_pdp_imgloader *x, t_symbol *filename, t_floatar x->x_iwidth = imlib_image_get_width(); x->x_iheight = imlib_image_get_height(); post( "pdp_imgloader : loaded : %s (%dx%d)", filename->s_name, x->x_iwidth, x->x_iheight ); - x->x_xoffset = (int) fx; - x->x_yoffset = (int) fy; + if ( fx!= 0.) x->x_xoffset = (int) fx; + if ( fy!= 0.) x->x_yoffset = (int) fy; } static void pdp_imgloader_xoffset(t_pdp_imgloader *x, t_floatarg fx ) diff --git a/modules/pdp_live~.c b/modules/pdp_live~.c index 6b8823f..cae6a65 100644 --- a/modules/pdp_live~.c +++ b/modules/pdp_live~.c @@ -1,6 +1,6 @@ /* - * Pure Data Packet module. - * Copyright (c) by Tom Schouten + * PiDiP module. + * Copyright (c) by Yves Degoyon (ydegoyon@free.fr) * * 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 @@ -38,14 +38,22 @@ #define VIDEO_BUFFER_SIZE (1024*1024) #define MAX_AUDIO_PACKET_SIZE (128 * 1024) -#define MIN_AUDIO_SIZE (64 * 1024) +#define MIN_AUDIO_SIZE (512) #define AUDIO_PACKET_SIZE (2*1152) #define DEFAULT_CHANNELS 1 -#define DEFAULT_FRAME_RATE 25 #define DEFAULT_WIDTH 320 #define DEFAULT_HEIGHT 240 +#define DEFAULT_FRAME_RATE 25 +#define END_OF_STREAM 20 +#define MIN_PRIORITY -20 #define DEFAULT_PRIORITY 0 +#define MAX_PRIORITY 20 + +/* a trick to cope with ffmpeg versions */ +#ifndef AVFMT_NOHEADER +#define AVFMT_NOHEADER AVFMTCTX_NOHEADER +#endif static char *pdp_live_version = "pdp_live~: version 0.1, a video stream decoder ( ydegoyon@free.fr)."; @@ -68,6 +76,8 @@ typedef struct pdp_live_struct t_outlet *x_outlet_right; // right audio output t_outlet *x_outlet_streaming; // indicates the action of streaming t_outlet *x_outlet_nbframes; // number of frames emitted + t_outlet *x_outlet_framerate; // real framerate + t_outlet *x_outlet_endofstream;// for signaling the end of the stream pthread_t x_connectchild; // thread used for connecting to a stream pthread_t x_decodechild; // stream decoding thread @@ -76,22 +86,28 @@ typedef struct pdp_live_struct char *x_url; t_int x_streaming; // streaming flag + t_int x_nopackets; // no packet to decode + t_int x_endofstream; // end of the stream reached t_int x_nbframes; // number of frames emitted t_int x_framerate; // framerate t_int x_samplerate; // audio sample rate t_int x_audiochannels; // audio channels t_int x_audioon; // enough audio data to start playing + t_int x_blocksize; // audio block size struct timeval x_starttime; // streaming starting time t_int x_cursec; // current second t_int x_secondcount; // number of frames received in the current second t_int x_nbvideostreams; // number of video streams t_int x_nbaudiostreams; // number of audio streams + t_int x_videoindex; // index of the first video stream /* AV data structures */ AVFormatContext *x_avcontext; AVFormatParameters x_avparameters; // unused but the call is necessary to allocate structures AVPacket x_pkt; // packet received on the stream AVPicture x_picture_decoded; + long long int x_pts; // presentation time stamp + long long int x_previouspts; // previous presentation time stamp t_int x_newpicture; /* audio structures */ @@ -105,7 +121,10 @@ typedef struct pdp_live_struct static void pdp_live_priority(t_pdp_live *x, t_floatarg fpriority ) { - x->x_priority = (int)fpriority; + if ( ( x->x_priority >= MIN_PRIORITY ) && ( x->x_priority <= MAX_PRIORITY ) ) + { + x->x_priority = (int)fpriority; + } } static void pdp_live_threadify(t_pdp_live *x, t_floatarg fusethread ) @@ -131,24 +150,32 @@ static t_int pdp_live_decode_packet(t_pdp_live *x) AVFrame frame; uint8_t *pcktptr; struct timeval etime; + struct timespec mwait; if ( !x->x_streaming ) { return -1; } + // post( "pdp_live~ : trying to read packet" ); // read new packet on the stream if (av_read_packet(x->x_avcontext, &x->x_pkt) < 0) { - // post( "pdp_live~ : decoding thread : nothing to decode" ); + x->x_nopackets++; + // post( "pdp_live~ : decoding thread : nothing to decode : no packets :%d", x->x_nopackets ); + if ( x->x_nopackets > END_OF_STREAM ) + { + x->x_endofstream = 1; + } return -1; } // post( "pdp_live~ : read packet ( size=%d )", x->x_pkt.size ); + x->x_nopackets = 0; if (x->x_pkt.stream_index >= x->x_avcontext->nb_streams) { post("pdp_live~ : stream received out of range !! "); - return 0; + return -1; } length = x->x_pkt.size; @@ -211,8 +238,9 @@ static t_int pdp_live_decode_packet(t_pdp_live *x) else { post( "pdp_live~ : audio overflow : packet ignored..."); + x->x_audioin_position = 0; } - if ( ( x->x_audioin_position > MIN_AUDIO_SIZE ) && (!x->x_audioon) ) + if ( ( x->x_audioin_position > x->x_blocksize ) && (!x->x_audioon) ) { x->x_audioon = 1; // post( "pdp_live~ : audio on" ); @@ -224,19 +252,19 @@ static t_int pdp_live_decode_packet(t_pdp_live *x) imagesize = (x->x_avcontext->streams[x->x_pkt.stream_index]->codec.width * x->x_avcontext->streams[x->x_pkt.stream_index]->codec.height * 3) / 2; // yuv planar - // do not believe the declared framerate - // x->x_framerate = x->x_avcontext->streams[x->x_pkt.stream_index]->codec.frame_rate / 10000; + x->x_framerate = x->x_avcontext->streams[x->x_pkt.stream_index]->codec.frame_rate / 10000; + x->x_videoindex = x->x_pkt.stream_index; // calculate actual frame rate - if ( gettimeofday(&etime, NULL) == -1) - { - post("pdp_live~ : could not read time" ); - } - if ( ( etime.tv_sec - x->x_starttime.tv_sec ) > 0 ) - { - x->x_framerate = x->x_nbframes / ( etime.tv_sec - x->x_starttime.tv_sec ); - } - if ( x->x_framerate == 0 ) x->x_framerate = 1; + // if ( gettimeofday(&etime, NULL) == -1) + // { + // post("pdp_live~ : could not read time" ); + // } + // if ( ( etime.tv_sec - x->x_starttime.tv_sec ) > 0 ) + // { + // x->x_framerate = x->x_nbframes / ( etime.tv_sec - x->x_starttime.tv_sec ); + // } + // if ( x->x_framerate == 0 ) x->x_framerate = 1; // post ("pdp_live~ : frame rate is %d", x->x_framerate ); chunksize = avcodec_decode_video( @@ -276,9 +304,31 @@ static t_int pdp_live_decode_packet(t_pdp_live *x) else { x->x_newpicture=1; + x->x_previouspts = x->x_pts; + x->x_pts = frame.pts; + // post( "pdp_live : frame pts : %ld", x->x_pts ); x->x_vwidth = x->x_avcontext->streams[x->x_pkt.stream_index]->codec.width; x->x_vheight = x->x_avcontext->streams[x->x_pkt.stream_index]->codec.height; x->x_vsize = x->x_vwidth*x->x_vheight; + + if ( x->x_previouspts != -1 ) + { + mwait.tv_sec = 0; + mwait.tv_nsec = (x->x_pts - x->x_previouspts)*1000; + + if ( ( x->x_pts == 0 ) ) + { + // post("pdp_live~ : no presentation time stamp, using framerate :%d", + // x->x_framerate ); + mwait.tv_sec = 0; + mwait.tv_nsec = 1000000000/((x->x_framerate+5)); // the +5 is experimental + // it comes from the time used in decoding + } + + nanosleep( &mwait, NULL ); // wait between the two successive frames + // i know, cheap flow control + } + } break; } @@ -335,6 +385,7 @@ static void *pdp_decode_stream_from_url(void *tdata) { nanosleep( &twait, NULL ); // nothing to read, just wait } + } post( "pdp_live~ : decoding thread %d exiting....", x->x_decodechild ); @@ -353,6 +404,7 @@ static void *pdp_live_connect_to_url(void *tdata) x->x_avparameters.channels = DEFAULT_CHANNELS; x->x_avparameters.frame_rate = DEFAULT_FRAME_RATE; x->x_avparameters.width = DEFAULT_WIDTH; + if ( x->x_framerate = 0 ) x->x_framerate = DEFAULT_FRAME_RATE; x->x_avparameters.height = DEFAULT_HEIGHT; x->x_avparameters.image_format = PIX_FMT_YUV420P; @@ -452,6 +504,8 @@ static void *pdp_live_connect_to_url(void *tdata) post("pdp_live~ : could not set start time" ); } x->x_streaming = 1; + x->x_nopackets = 0; + x->x_endofstream = 0; x->x_nbframes = 0; x->x_connectchild = 0; @@ -490,7 +544,7 @@ static void pdp_live_disconnect(t_pdp_live *x) struct timespec twait; twait.tv_sec = 0; - twait.tv_nsec = 100000000; // 100 ms + twait.tv_nsec = 10000000; // 10 ms if (!x->x_streaming) { @@ -520,6 +574,8 @@ static void pdp_live_disconnect(t_pdp_live *x) outlet_float( x->x_outlet_streaming, x->x_streaming ); x->x_nbframes = 0; outlet_float( x->x_outlet_nbframes, x->x_nbframes ); + x->x_framerate = 0; + outlet_float( x->x_outlet_framerate, x->x_framerate ); if (x->x_audio_resample_ctx) { @@ -583,11 +639,13 @@ static t_int *pdp_live_perform(t_int *w) t_int sn; // decode a packet if not in thread mode - if ( !x->x_usethread ) + if ( !x->x_usethread && x->x_streaming ) { pdp_live_decode_packet( x ); } + x->x_blocksize = n; + // just read the buffer if ( x->x_audioon ) { @@ -609,8 +667,8 @@ static t_int *pdp_live_perform(t_int *w) out1++; out2++; } - x->x_audioin_position-=sn; memcpy( &x->x_audio_in[0], &x->x_audio_in[sn], 4*MAX_AUDIO_PACKET_SIZE-sn ); + x->x_audioin_position-=sn; // post( "pdp_live~ : audio in position : %d", x->x_audioin_position ); if ( x->x_audioin_position <= sn ) { @@ -636,6 +694,7 @@ static t_int *pdp_live_perform(t_int *w) if ( etime.tv_sec != x->x_cursec ) { x->x_cursec = etime.tv_sec; + if (x->x_streaming) outlet_float( x->x_outlet_framerate, x->x_framerate ); x->x_secondcount = 0; } if ( x->x_secondcount >= x->x_framerate ) @@ -680,13 +739,14 @@ static t_int *pdp_live_perform(t_int *w) pdp_packet_pass_if_valid(x->x_pdp_out, &x->x_packet0); // update streaming status - outlet_float( x->x_outlet_streaming, x->x_streaming ); x->x_nbframes++; x->x_secondcount++; outlet_float( x->x_outlet_nbframes, x->x_nbframes ); x->x_newpicture = 0; } + outlet_float( x->x_outlet_streaming, x->x_streaming ); + outlet_float( x->x_outlet_endofstream, x->x_endofstream ); return (w+5); } @@ -730,22 +790,32 @@ void *pdp_live_new(void) x->x_outlet_streaming = outlet_new(&x->x_obj, &s_float); x->x_outlet_nbframes = outlet_new(&x->x_obj, &s_float); + x->x_outlet_framerate = outlet_new(&x->x_obj, &s_float); + x->x_outlet_endofstream = outlet_new(&x->x_obj, &s_float); x->x_packet0 = -1; x->x_connectchild = 0; x->x_decodechild = 0; x->x_usethread = 1; x->x_priority = DEFAULT_PRIORITY; - x->x_nbframes = 0; x->x_framerate = DEFAULT_FRAME_RATE; + x->x_nbframes = 0; + x->x_framerate = 0; x->x_samplerate = 0; x->x_audiochannels = 0; x->x_cursec = 0; x->x_secondcount = 0; x->x_audio_resample_ctx = NULL; x->x_nbvideostreams = 0; + x->x_videoindex = 0; x->x_audioin_position = 0; x->x_newpicture = 0; + x->x_endofstream = 0; + x->x_nopackets = 0; + x->x_blocksize = MIN_AUDIO_SIZE; + + x->x_pts = -1; + x->x_previouspts = -1; x->x_avcontext = av_mallocz(sizeof(AVFormatContext)); if ( !x->x_avcontext ) @@ -776,11 +846,12 @@ void pdp_live_tilde_setup(void) pdp_live_class = class_new(gensym("pdp_live~"), (t_newmethod)pdp_live_new, (t_method)pdp_live_free, sizeof(t_pdp_live), 0, A_NULL); - class_addmethod(pdp_live_class, (t_method)pdp_live_dsp, gensym("dsp"), 0); + class_addmethod(pdp_live_class, (t_method)pdp_live_dsp, gensym("dsp"), A_NULL); class_addmethod(pdp_live_class, (t_method)pdp_live_connect, gensym("connect"), A_SYMBOL, A_NULL); class_addmethod(pdp_live_class, (t_method)pdp_live_disconnect, gensym("disconnect"), A_NULL); class_addmethod(pdp_live_class, (t_method)pdp_live_priority, gensym("priority"), A_FLOAT, A_NULL); class_addmethod(pdp_live_class, (t_method)pdp_live_audio, gensym("audio"), A_FLOAT, A_NULL); + class_addmethod(pdp_live_class, (t_method)pdp_live_threadify, gensym("thread"), A_FLOAT, A_NULL); class_sethelpsymbol( pdp_live_class, gensym("pdp_live~.pd") ); } diff --git a/modules/pdp_shape.c b/modules/pdp_shape.c index d437144..27239c4 100644 --- a/modules/pdp_shape.c +++ b/modules/pdp_shape.c @@ -56,6 +56,7 @@ typedef struct pdp_shape_struct t_int x_tolerance; // tolerance t_int x_paint; // paint option + t_int x_shape; // drawing shape option t_int x_luminosity; // use luminosity or not short int *x_bdata; @@ -113,6 +114,14 @@ static void pdp_shape_paint(t_pdp_shape *x, t_floatarg fpaint ) } } +static void pdp_shape_shape(t_pdp_shape *x, t_floatarg fshape ) +{ + if ( ( (t_int)fshape == 0 ) || ( (t_int)fshape == 1 ) ) + { + x->x_shape = (t_int)fshape; + } +} + static void pdp_shape_do_detect(t_pdp_shape *x, t_floatarg X, t_floatarg Y); static void pdp_shape_frame_detect(t_pdp_shape *x, t_floatarg X, t_floatarg Y); @@ -191,9 +200,12 @@ static void pdp_shape_do_detect(t_pdp_shape *x, t_floatarg X, t_floatarg Y) { // paint it white // post( "pdp_shape_do_detect : paint : %d %d", nX, nY ); - *(pbbY+nY*x->x_vwidth+nX) = (0xff<<7); - *(pbbU+(nY>>1)*(x->x_vwidth>>1)+(nX>>1)) = (0xff<<8); - *(pbbV+(nY>>1)*(x->x_vwidth>>1)+(nX>>1)) = (0xff<<8); + if ( x->x_shape ) + { + *(pbbY+nY*x->x_vwidth+nX) = (0xff<<7); + *(pbbU+(nY>>1)*(x->x_vwidth>>1)+(nX>>1)) = (0xff<<8); + *(pbbV+(nY>>1)*(x->x_vwidth>>1)+(nX>>1)) = (0xff<<8); + } if ( ( nX < x->x_vx1 ) || ( x->x_vx1 == -1 ) ) { @@ -542,6 +554,7 @@ void *pdp_shape_new(void) x->x_tolerance = 20; x->x_paint = 0; + x->x_shape = 1; x->x_luminosity = 1; x->x_cursX = -1; @@ -574,6 +587,7 @@ void pdp_shape_setup(void) class_addmethod(pdp_shape_class, (t_method)pdp_shape_rgb, gensym("rgb"), A_DEFFLOAT, A_DEFFLOAT, A_DEFFLOAT, A_NULL); class_addmethod(pdp_shape_class, (t_method)pdp_shape_tolerance, gensym("tolerance"), A_FLOAT, A_NULL); class_addmethod(pdp_shape_class, (t_method)pdp_shape_paint, gensym("paint"), A_FLOAT, A_NULL); + class_addmethod(pdp_shape_class, (t_method)pdp_shape_shape, gensym("shape"), A_FLOAT, A_NULL); class_addmethod(pdp_shape_class, (t_method)pdp_shape_luminosity, gensym("luminosity"), A_FLOAT, A_NULL); } diff --git a/modules/pdp_simura.c b/modules/pdp_simura.c index 87a471c..3bae7a8 100644 --- a/modules/pdp_simura.c +++ b/modules/pdp_simura.c @@ -1,6 +1,6 @@ /* - * Pure Data Packet module. - * Copyright (c) by Tom Schouten + * PiDiP module. + * Copyright (c) by Yves Degoyon (ydegoyon@free.fr) * * 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 diff --git a/modules/pdp_spigot.c b/modules/pdp_spigot.c index c25859c..4fd5d6a 100644 --- a/modules/pdp_spigot.c +++ b/modules/pdp_spigot.c @@ -1,6 +1,6 @@ /* - * Pure Data Packet module. - * Copyright (c) by Tom Schouten + * PiDiP module. + * Copyright (c) by Yves Degoyon (ydegoyon@free.fr) * * 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 diff --git a/modules/pdp_xcanvas.c b/modules/pdp_xcanvas.c index 071f530..90f2700 100644 --- a/modules/pdp_xcanvas.c +++ b/modules/pdp_xcanvas.c @@ -18,7 +18,8 @@ * */ -/* This object is an object allowing juxtaposition of frames from two inlets +/* This object is a video canvas which is also handling the graphical operations + * ( no need to plug it in pdp_xv ) * Written by Yves Degoyon */ diff --git a/modules/pdp_yqt.c b/modules/pdp_yqt.c index 2a37414..d0ada83 100644 --- a/modules/pdp_yqt.c +++ b/modules/pdp_yqt.c @@ -1,6 +1,6 @@ /* - * Pure Data Packet module. - * Copyright (c) by Tom Schouten + * PiDiP module. + * Copyright (c) by Yves Degoyon (ydegoyon@free.fr) * * 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 diff --git a/modules/pdp_yvu2rgb.c b/modules/pdp_yvu2rgb.c index 2a9156c..a536268 100644 --- a/modules/pdp_yvu2rgb.c +++ b/modules/pdp_yvu2rgb.c @@ -1,6 +1,6 @@ /* - * Pure Data Packet module. - * Copyright (c) by Tom Schouten + * PiDiP module. + * Copyright (c) by Yves Degoyon (ydegoyon@free.fr) * * 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 -- cgit v1.2.1