Update of /cvsroot/pure-data/externals/pidip/modules In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv23844/modules
Modified Files: Makefile pdp_ffmpeg~.c pdp_live~.c Log Message: PiDiP 0.12.19
Index: Makefile =================================================================== RCS file: /cvsroot/pure-data/externals/pidip/modules/Makefile,v retrieving revision 1.15 retrieving revision 1.16 diff -C2 -d -r1.15 -r1.16 *** Makefile 9 Jul 2005 19:35:40 -0000 1.15 --- Makefile 4 Oct 2005 20:37:14 -0000 1.16 *************** *** 22,26 **** pdp_mapper.o pdp_theonice~.o pdp_icedthe~.o\ pdp_fdiff.o pdp_hue.o \ ! # pdp_xcanvas.o pdp_aa.o
all_modules: $(OBJECTS) --- 22,26 ---- pdp_mapper.o pdp_theonice~.o pdp_icedthe~.o\ pdp_fdiff.o pdp_hue.o \ ! pdp_live~.o pdp_ffmpeg~.o # pdp_xcanvas.o pdp_aa.o
all_modules: $(OBJECTS)
Index: pdp_ffmpeg~.c =================================================================== RCS file: /cvsroot/pure-data/externals/pidip/modules/pdp_ffmpeg~.c,v retrieving revision 1.6 retrieving revision 1.7 diff -C2 -d -r1.6 -r1.7 *** pdp_ffmpeg~.c 2 Jan 2005 06:02:48 -0000 1.6 --- pdp_ffmpeg~.c 4 Oct 2005 20:37:14 -0000 1.7 *************** *** 113,116 **** --- 113,138 ---- x->x_avcontext->streams[i] = st;
+ #if FFMPEG_VERSION_INT >= 0x000409 + if ( ic->streams[i]->codec->codec_type == CODEC_TYPE_UNKNOWN ) + { + post( "pdp_ffmpeg~ : stream #%d # type : unknown", i ); + } + if ( ic->streams[i]->codec->codec_type == CODEC_TYPE_AUDIO ) + { + post( "pdp_ffmpeg~ : stream #%d # type : audio # id : %d # bitrate : %d", + i, ic->streams[i]->codec->codec_id, ic->streams[i]->codec->bit_rate ); + post( "pdp_ffmpeg~ : sample rate : %d # channels : %d", + ic->streams[i]->codec->sample_rate, ic->streams[i]->codec->channels ); + x->x_nbaudiostreams++; + } + if ( ic->streams[i]->codec->codec_type == CODEC_TYPE_VIDEO ) + { + post( "pdp_ffmpeg~ : stream #%d # type : video # id : %d # bitrate : %d", + i, ic->streams[i]->codec->codec_id, ic->streams[i]->codec->bit_rate ); + post( "pdp_ffmpeg~ : framerate : %d # width : %d # height : %d", + av_q2d( ic->streams[i]->r_frame_rate ), ic->streams[i]->codec->width, ic->streams[i]->codec->height ); + x->x_nbvideostreams++; + } + #else if ( ic->streams[i]->codec.codec_type == CODEC_TYPE_UNKNOWN ) { *************** *** 133,136 **** --- 155,159 ---- x->x_nbvideostreams++; } + #endif }
*************** *** 189,193 **** --- 212,220 ---- for(i=0;i<x->x_avcontext->nb_streams;i++) { + #if FFMPEG_VERSION_INT >= 0x000409 + avcodec_close( x->x_avcontext->streams[i]->codec ); + #else avcodec_close( &x->x_avcontext->streams[i]->codec ); + #endif av_free( x->x_avcontext->streams[i] ); } *************** *** 248,252 **** --- 275,283 ---- { AVCodec *codec; + #if FFMPEG_VERSION_INT >= 0x000409 + codec = avcodec_find_encoder(x->x_avcontext->streams[i]->codec->codec_id); + #else codec = avcodec_find_encoder(x->x_avcontext->streams[i]->codec.codec_id); + #endif if (!codec) { *************** *** 256,260 **** --- 287,295 ---- return; } + #if FFMPEG_VERSION_INT >= 0x000409 + if (avcodec_open(x->x_avcontext->streams[i]->codec, codec) < 0) + #else if (avcodec_open(&x->x_avcontext->streams[i]->codec, codec) < 0) + #endif { post("pdp_ffmpeg~ : error while opening codec for stream #%d - maybe incorrect parameters such as bit_rate, rate, width or height\n", i); *************** *** 372,377 **** svideoindex=0; saudioindex=0; ! for (i=0; i<x->x_avcontext->nb_streams; i++) ! { /* convert pixel format and size if needed */ if ( x->x_avcontext->streams[i]->codec.codec_type == CODEC_TYPE_VIDEO ) --- 407,644 ---- svideoindex=0; saudioindex=0; ! #if FFMPEG_VERSION_INT >= 0x000409 ! for (i=0; i<x->x_avcontext->nb_streams; i++) ! { ! /* convert pixel format and size if needed */ ! if ( x->x_avcontext->streams[i]->codec->codec_type == CODEC_TYPE_VIDEO ) ! { ! t_int size; ! ! // check if the framerate has been exceeded ! if ( gettimeofday(&etime, NULL) == -1) ! { ! post("pdp_ffmpeg~ : could not read time" ); ! } ! if ( etime.tv_sec != x->x_cursec ) ! { ! x->x_cursec = etime.tv_sec; ! outlet_float( x->x_outlet_framerate, x->x_secondcount[ svideoindex ] ); ! for (j=0; j<x->x_nbvideostreams; j++) ! { ! x->x_secondcount[ j ] = 0; ! } ! } ! framerate = av_q2d( x->x_avcontext->streams[i]->r_frame_rate ); ! ttime = ( ( x->x_nbframes + 1 ) % framerate ) * ( 1000 / framerate ); ! atime = ( etime.tv_usec / 1000 ); ! // post("pdp_theonice~ : actual : %d, theoretical : %d", atime, ttime ); ! if ( atime < ttime ) ! { ! x->x_nbframes_dropped++; ! continue; ! } ! ! if ( x->x_avcontext->streams[i]->codec->pix_fmt != PIX_FMT_YUV420P ) ! { ! /* create temporary picture */ ! size = avpicture_get_size(x->x_avcontext->streams[i]->codec->pix_fmt, ! x->x_vwidth, x->x_vheight ); ! if (!x->x_buf1) x->x_buf1 = (uint8_t*) malloc(size); ! if (!x->x_buf1) ! { ! post ("pdp_ffmpeg~ : severe error : could not allocate image buffer" ); ! return; ! } ! x->x_formatted_picture = &x->x_picture_format; ! avpicture_fill(x->x_formatted_picture, x->x_buf1, ! x->x_avcontext->streams[i]->codec->pix_fmt, ! x->x_vwidth, x->x_vheight ); ! ! if (img_convert(x->x_formatted_picture, ! x->x_avcontext->streams[i]->codec->pix_fmt, ! &pdppict, PIX_FMT_YUV420P, ! x->x_vwidth, x->x_vheight ) < 0) ! { ! post ("pdp_ffmpeg~ : error : image conversion failed" ); ! } ! } ! else ! { ! x->x_formatted_picture = &pdppict; ! } ! ! // post ( "pdp_ffmpeg~ : resampling [%d,%d] -> [%d,%d]", ! // x->x_vwidth, x->x_vheight, ! // x->x_avcontext->streams[i]->codec->width, ! // x->x_avcontext->streams[i]->codec->height ); ! if ( ( x->x_avcontext->streams[i]->codec->width < x->x_vwidth ) && ! ( x->x_avcontext->streams[i]->codec->height < x->x_vheight ) ) ! { ! owidth = x->x_avcontext->streams[i]->codec->width; ! oheight = x->x_avcontext->streams[i]->codec->height; ! ! if (x->x_img_resample_ctx) img_resample_close(x->x_img_resample_ctx); ! ! #if LIBAVCODEC_BUILD > 4715 ! x->x_img_resample_ctx = img_resample_full_init( ! owidth, oheight, ! x->x_vwidth, x->x_vheight, ! 0, 0, 0, 0, ! 0, 0, 0, 0); ! #else ! x->x_img_resample_ctx = img_resample_full_init( ! owidth, oheight, ! x->x_vwidth, x->x_vheight, 0, 0, 0, 0); ! #endif ! ! size = avpicture_get_size(x->x_avcontext->streams[i]->codec->pix_fmt, ! owidth, oheight ); ! if ( !x->x_buf2 ) ! { ! x->x_buf2 = (uint8_t*) malloc(size); ! } ! if (!x->x_buf2) ! { ! post ("pdp_ffmpeg~ : severe error : could not allocate image buffer" ); ! return; ! } ! x->x_final_picture = &x->x_picture_final; ! avpicture_fill(x->x_final_picture, x->x_buf2, ! x->x_avcontext->streams[i]->codec->pix_fmt, ! owidth, oheight ); ! ! img_resample(x->x_img_resample_ctx, x->x_final_picture, x->x_formatted_picture); ! ! } ! else ! { ! x->x_final_picture = x->x_formatted_picture; ! } ! ! // encode and send the picture ! { ! AVFrame aframe; ! #if LIBAVCODEC_BUILD > 4715 ! AVPacket vpkt; ! #endif ! 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, ! x->x_video_buffer, VIDEO_BUFFER_SIZE, ! &aframe); ! ! #if LIBAVCODEC_BUILD > 4715 ! av_init_packet(&vpkt); ! ! vpkt.pts = aframe.pts; ! if(x->x_avcontext->streams[i]->codec->coded_frame->key_frame) ! vpkt.flags |= PKT_FLAG_KEY; ! vpkt.stream_index= i; ! vpkt.data= (uint8_t *)x->x_video_buffer; ! vpkt.size= fsize; ! ! if ( ( ret = av_write_frame( x->x_avcontext, &vpkt) ) < 0 ) ! #else ! if ( ( ret = av_write_frame( x->x_avcontext, i, x->x_video_buffer, fsize) ) < 0 ) ! #endif ! { ! post ("pdp_ffmpeg~ : error : could not send frame : (ret=%d)", ret ); ! return; ! } ! else ! { ! x->x_nbframes++; ! x->x_secondcount[ svideoindex ]++; ! // post ("pdp_ffmpeg~ : index=%d count=%d", svideoindex, x->x_secondcount[ svideoindex ] ); ! svideoindex++; ! } ! } ! } ! ! /* convert and stream audio data */ ! if ( x->x_avcontext->streams[i]->codec->codec_type == CODEC_TYPE_AUDIO ) ! { ! // we assume audio is synchronized on next video stream ! if ( ( (i+1) < x->x_avcontext->nb_streams ) && ! ( x->x_avcontext->streams[i+1]->codec->codec_type == CODEC_TYPE_VIDEO ) ) ! { ! x->x_audio_per_frame = ! // 2*( (int) sys_getsr() ) / av_q2d( x->x_avcontext->streams[i+1]->r_frame_rate ) ; ! AUDIO_PACKET_SIZE; ! // post ("pdp_ffmpeg~ : transmit %d samples", x->x_audio_per_frame ); ! } ! else ! { ! post ("pdp_ffmpeg~ : can't stream audio : video stream is not found" ); ! continue; ! } ! ! if ( x->x_audioin_position > x->x_audio_per_frame ) ! { ! size = x->x_audioin_position; ! if ( ( x->x_avcontext->streams[i]->codec->sample_rate != (int)sys_getsr() ) || ! ( x->x_avcontext->streams[i]->codec->channels != 2 ) ) ! { ! if (x->x_audio_resample_ctx) audio_resample_close(x->x_audio_resample_ctx); ! x->x_audio_resample_ctx = ! audio_resample_init(x->x_avcontext->streams[i]->codec->channels, 2, ! x->x_avcontext->streams[i]->codec->sample_rate, ! (int)sys_getsr()); ! sizeout = audio_resample(x->x_audio_resample_ctx, ! x->x_audio_enc_buf, ! x->x_audio_buf, ! size / (x->x_avcontext->streams[i]->codec->channels * 2)); ! pencbuf = (short*) &x->x_audio_enc_buf; ! sizeout = sizeout * x->x_avcontext->streams[i]->codec->channels * 2; ! } ! else ! { ! pencbuf = (short*) &x->x_audio_buf; ! sizeout = size; ! } ! ! /* output resampled raw samples */ ! fifo_write(&x->x_audio_fifo[saudioindex], (uint8_t*)pencbuf, sizeout, ! &x->x_audio_fifo[saudioindex].wptr); ! ! framebytes = x->x_avcontext->streams[i]->codec->frame_size * 2 * ! x->x_avcontext->streams[i]->codec->channels; ! ! while (fifo_read(&x->x_audio_fifo[saudioindex], (uint8_t*)pencbuf, framebytes, ! &x->x_audio_fifo[saudioindex].rptr) == 0) ! { ! #if LIBAVCODEC_BUILD > 4715 ! AVPacket apkt; ! #endif ! encsize = avcodec_encode_audio(x->x_avcontext->streams[i]->codec, ! (uint8_t*)&x->x_audio_out, sizeof(x->x_audio_out), ! (short *)pencbuf); ! #if LIBAVCODEC_BUILD > 4715 ! av_init_packet(&apkt); ! ! apkt.pts = etime.tv_sec*1000000 + etime.tv_usec; ! if(x->x_avcontext->streams[i]->codec->coded_frame->key_frame) ! apkt.flags |= PKT_FLAG_KEY; ! apkt.stream_index= i; ! apkt.data= (uint8_t *)x->x_audio_out; ! apkt.size= encsize; ! ! av_write_frame(x->x_avcontext, &apkt); ! #else ! av_write_frame(x->x_avcontext, i, x->x_audio_out, encsize); ! #endif ! } ! saudioindex++; ! } ! } ! } ! #else ! for (i=0; i<x->x_avcontext->nb_streams; i++) ! { /* convert pixel format and size if needed */ if ( x->x_avcontext->streams[i]->codec.codec_type == CODEC_TYPE_VIDEO ) *************** *** 602,605 **** --- 869,873 ---- } } + #endif x->x_audioin_position=0; }
Index: pdp_live~.c =================================================================== RCS file: /cvsroot/pure-data/externals/pidip/modules/pdp_live~.c,v retrieving revision 1.5 retrieving revision 1.6 diff -C2 -d -r1.5 -r1.6 *** pdp_live~.c 2 Jan 2005 06:02:49 -0000 1.5 --- pdp_live~.c 4 Oct 2005 20:37:14 -0000 1.6 *************** *** 277,281 **** --- 277,285 ---- { if ( !x->x_streaming ) break; + #if FFMPEG_VERSION_INT >= 0x000409 + switch(x->x_avcontext->streams[x->x_pkt.stream_index]->codec->codec_type) + #else switch(x->x_avcontext->streams[x->x_pkt.stream_index]->codec.codec_type) + #endif { case CODEC_TYPE_AUDIO: *************** *** 285,289 **** --- 289,297 ---- return 0; } + #if FFMPEG_VERSION_INT >= 0x000409 + chunksize = avcodec_decode_audio(x->x_avcontext->streams[x->x_pkt.stream_index]->codec, + #else chunksize = avcodec_decode_audio(&x->x_avcontext->streams[x->x_pkt.stream_index]->codec, + #endif &x->x_audio_buf[0], &audiosize, pcktptr, length); *************** *** 317,320 **** --- 325,343 ---- // (int)sys_getsr(), 2, x->x_audioin_position );
+ #if FFMPEG_VERSION_INT >= 0x000409 + x->x_audiochannels = x->x_avcontext->streams[x->x_pkt.stream_index]->codec->channels; + x->x_samplerate = x->x_avcontext->streams[x->x_pkt.stream_index]->codec->sample_rate; + if (x->x_audio_resample_ctx) audio_resample_close(x->x_audio_resample_ctx); + x->x_audio_resample_ctx = + audio_resample_init(DEFAULT_CHANNELS, + x->x_avcontext->streams[x->x_pkt.stream_index]->codec->channels, + (int)sys_getsr(), + x->x_avcontext->streams[x->x_pkt.stream_index]->codec->sample_rate); + + sizeout = audio_resample(x->x_audio_resample_ctx, + &x->x_audio_in[x->x_audioin_position], + &x->x_audio_buf[0], + audiosize/(x->x_avcontext->streams[x->x_pkt.stream_index]->codec->channels * sizeof(short))); + #else x->x_audiochannels = x->x_avcontext->streams[x->x_pkt.stream_index]->codec.channels; x->x_samplerate = x->x_avcontext->streams[x->x_pkt.stream_index]->codec.sample_rate; *************** *** 330,333 **** --- 353,357 ---- &x->x_audio_buf[0], audiosize/(x->x_avcontext->streams[x->x_pkt.stream_index]->codec.channels * sizeof(short))); + #endif sizeout = sizeout * DEFAULT_CHANNELS;
*************** *** 355,358 **** --- 379,401 ---- case CODEC_TYPE_VIDEO:
+ #if FFMPEG_VERSION_INT >= 0x000409 + 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 + + x->x_framerate = ( t_int ) av_q2d( x->x_avcontext->streams[x->x_pkt.stream_index]->r_frame_rate ); + if ( x->x_framerate == 0 ) x->x_framerate = DEFAULT_FRAME_RATE; + x->x_videoindex = x->x_pkt.stream_index; + + chunksize = avcodec_decode_video( + x->x_avcontext->streams[x->x_pkt.stream_index]->codec, + &frame, &pictureok, + pcktptr, length); + if ( x->x_avcontext->streams[x->x_pkt.stream_index]->codec->pix_fmt != PIX_FMT_YUV420P ) + { + post( "pdp_live~ : unsupported image format : %d", + x->x_avcontext->streams[x->x_pkt.stream_index]->codec->pix_fmt ); + pictureok = 0; + } + #else 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 *************** *** 372,384 **** pictureok = 0; } ! // post( "pdp_live~ : decoded new frame : type=%d format=%d (w=%d) (h=%d) (linesizes=%d,%d,%d,%d)", ! // frame.pict_type, ! // x->x_avcontext->streams[x->x_pkt.stream_index]->codec.pix_fmt, ! // x->x_avcontext->streams[x->x_pkt.stream_index]->codec.width, ! // x->x_avcontext->streams[x->x_pkt.stream_index]->codec.height, ! // frame.linesize[0], ! // frame.linesize[1], ! // frame.linesize[2], ! // frame.linesize[3] ); x->x_picture_decoded = *(AVPicture*)&frame; x->x_avcontext->streams[x->x_pkt.stream_index]->quality= frame.quality; --- 415,419 ---- pictureok = 0; } ! #endif x->x_picture_decoded = *(AVPicture*)&frame; x->x_avcontext->streams[x->x_pkt.stream_index]->quality= frame.quality; *************** *** 404,409 **** --- 439,449 ---- } x->x_newpicture=1; + #if FFMPEG_VERSION_INT >= 0x000409 + 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; + #else 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; + #endif x->x_vsize = x->x_vwidth*x->x_vheight;
*************** *** 544,548 **** x->x_avparameters.sample_rate = sys_getsr(); 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; --- 584,587 ---- *************** *** 585,588 **** --- 624,652 ---- AVStream *st;
+ #if FFMPEG_VERSION_INT >= 0x000409 + if ( x->x_avcontext->streams[i]->codec->codec_type == CODEC_TYPE_UNKNOWN ) + { + post( "pdp_live~ : stream #%d # type : unknown", i ); + } + if ( x->x_avcontext->streams[i]->codec->codec_type == CODEC_TYPE_AUDIO ) + { + post( "pdp_live~ : stream #%d # type : audio # id : %d # bitrate : %d", + i, x->x_avcontext->streams[i]->codec->codec_id, x->x_avcontext->streams[i]->codec->bit_rate ); + post( "pdp_live~ : sample rate : %d # channels : %d", + x->x_avcontext->streams[i]->codec->sample_rate, x->x_avcontext->streams[i]->codec->channels ); + x->x_nbaudiostreams++; + } + if ( x->x_avcontext->streams[i]->codec->codec_type == CODEC_TYPE_VIDEO ) + { + post( "pdp_live~ : stream #%d # type : video # id : %d # bitrate : %d", + i, x->x_avcontext->streams[i]->codec->codec_id, + x->x_avcontext->streams[i]->codec->bit_rate ); + post( "pdp_live~ : framerate : %d # width : %d # height : %d", + av_q2d( x->x_avcontext->streams[i]->r_frame_rate )/10000, + x->x_avcontext->streams[i]->codec->width, + x->x_avcontext->streams[i]->codec->height ); + x->x_nbvideostreams++; + } + #else if ( x->x_avcontext->streams[i]->codec.codec_type == CODEC_TYPE_UNKNOWN ) { *************** *** 608,611 **** --- 672,676 ---- x->x_nbvideostreams++; } + #endif }
*************** *** 615,619 **** --- 680,688 ---- AVCodec *codec; post("pdp_live~ : opening decoder for stream #%d", i); + #if FFMPEG_VERSION_INT >= 0x000409 + codec = avcodec_find_decoder(x->x_avcontext->streams[i]->codec->codec_id); + #else codec = avcodec_find_decoder(x->x_avcontext->streams[i]->codec.codec_id); + #endif if (!codec) { *************** *** 625,629 **** --- 694,702 ---- pthread_exit(NULL); } + #if FFMPEG_VERSION_INT >= 0x000409 + if (avcodec_open(x->x_avcontext->streams[i]->codec, codec) < 0) + #else if (avcodec_open(&x->x_avcontext->streams[i]->codec, codec) < 0) + #endif { post("pdp_live~ : error while opening codec for stream #%d - maybe incorrect parameters such as bit_rate, rate, width or height\n", i); *************** *** 704,708 **** --- 777,785 ---- for(i=0;i<x->x_avcontext->nb_streams;i++) { + #if FFMPEG_VERSION_INT >= 0x000409 + if (avcodec_close(x->x_avcontext->streams[i]->codec) < 0) + #else if (avcodec_close(&x->x_avcontext->streams[i]->codec) < 0) + #endif { post("pdp_live~ : error while closing codec for stream #%d", i);