From: Ronald S. B. <rb...@pd...> - 2004-03-04 13:28:14
|
CVS Root: /home/cvs/gstreamer Module: gst-ffmpeg Changes by: rbultje Date: Thu Mar 04 2004 05:22:05 PST Log message: * configure.ac: Brackets cause autoconf errors. So remove them. * ext/ffmpeg/gstffmpegdemux.c: (gst_ffmpegdemux_add): Actually use the event/convert/query functions. D'oh. Modified files: . : ChangeLog configure.ac ext/ffmpeg : gstffmpegdemux.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-ffmpeg/ChangeLog.diff?r1=1.8&r2=1.9 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-ffmpeg/configure.ac.diff?r1=1.7&r2=1.8 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-ffmpeg/ext/ffmpeg/gstffmpegdemux.c.diff?r1=1.23&r2=1.24 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /home/cvs/gstreamer/gst-ffmpeg/ChangeLog,v retrieving revision 1.8 retrieving revision 1.9 diff -u -d -r1.8 -r1.9 --- a/ChangeLog 3 Mar 2004 01:54:18 -0000 1.8 +++ b/ChangeLog 4 Mar 2004 13:21:53 -0000 1.9 @@ -1,3 +1,10 @@ +2004-03-04 Ronald Bultje <rb...@ro...> + + * configure.ac: + Brackets cause autoconf errors. So remove them. + * ext/ffmpeg/gstffmpegdemux.c: (gst_ffmpegdemux_add): + Actually use the event/convert/query functions. D'oh. 2004-03-02 Ronald Bultje <rb...@ro...> * configure.ac: Index: configure.ac RCS file: /home/cvs/gstreamer/gst-ffmpeg/configure.ac,v retrieving revision 1.7 diff -u -d -r1.7 -r1.8 --- a/configure.ac 3 Mar 2004 01:54:18 -0000 1.7 +++ b/configure.ac 4 Mar 2004 13:21:53 -0000 1.8 @@ -84,7 +84,7 @@ if test "x$GST_PLUGINS_VERSION_NANO" = x1; then AC_MSG_NOTICE(slurping FFmpeg CVS source) dnl until someone fixes this... I guess this should be in ./autogen.sh - AS_SLURP_FFMPEG(gst-libs/ext/ffmpeg, 2004-02-29 20:00 GMT,[ + AS_SLURP_FFMPEG(gst-libs/ext/ffmpeg, 2004-02-29 20:00 GMT, if ! test -f gst-libs/ext/ffmpeg/ffmpeg/configure.ac; then AC_MSG_NOTICE(setting up ffmpeg build system and applying patches) CURDIR=`pwd` @@ -97,7 +97,7 @@ NOCONFIGURE=1 ./autogen.sh cd $CURDIR fi - HAVE_FFMPEG=yes ], HAVE_FFMPEG=no) + HAVE_FFMPEG=yes, HAVE_FFMPEG=no) else AC_MSG_NOTICE(FFmpeg CVS code should be included already) HAVE_FFMPEG=yes Index: gstffmpegdemux.c RCS file: /home/cvs/gstreamer/gst-ffmpeg/ext/ffmpeg/gstffmpegdemux.c,v retrieving revision 1.23 retrieving revision 1.24 diff -u -d -r1.23 -r1.24 --- a/gstffmpegdemux.c 1 Mar 2004 04:59:17 -0000 1.23 +++ b/gstffmpegdemux.c 4 Mar 2004 13:21:53 -0000 1.24 @@ -493,7 +493,12 @@ g_free (padname); gst_pad_use_explicit_caps (pad); - /* FIXME: srcevent(), convert() and query() functions for pad */ + gst_pad_set_formats_function (pad, gst_ffmpegdemux_src_format_list); + gst_pad_set_event_mask_function (pad, gst_ffmpegdemux_src_event_mask); + gst_pad_set_event_function (pad, gst_ffmpegdemux_src_event); + gst_pad_set_query_type_function (pad, gst_ffmpegdemux_src_query_list); + gst_pad_set_query_function (pad, gst_ffmpegdemux_src_query); + gst_pad_set_convert_function (pad, gst_ffmpegdemux_src_convert); /* store pad internally */ demux->srcpads[stream->index] = pad; |
From: Ronald S. B. <rb...@pd...> - 2004-03-05 02:47:13
|
CVS Root: /home/cvs/gstreamer Module: gst-ffmpeg Changes by: rbultje Date: Thu Mar 04 2004 18:40:46 PST Log message: * ext/ffmpeg/gstffmpegcodecmap.c: (gst_ffmpeg_formatid_to_caps): Fix quicktime type recognition in ffmpeg. We returned a bogus caps, which caused ffdemux_quicktime to be chosen over qtdemux. This fixes that. Modified files: . : ChangeLog ext/ffmpeg : gstffmpegcodecmap.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-ffmpeg/ChangeLog.diff?r1=1.9&r2=1.10 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-ffmpeg/ext/ffmpeg/gstffmpegcodecmap.c.diff?r1=1.42&r2=1.43 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /home/cvs/gstreamer/gst-ffmpeg/ChangeLog,v retrieving revision 1.9 retrieving revision 1.10 diff -u -d -r1.9 -r1.10 --- a/ChangeLog 4 Mar 2004 13:21:53 -0000 1.9 +++ b/ChangeLog 5 Mar 2004 02:40:34 -0000 1.10 @@ -1,5 +1,12 @@ 2004-03-04 Ronald Bultje <rb...@ro...> + * ext/ffmpeg/gstffmpegcodecmap.c: (gst_ffmpeg_formatid_to_caps): + Fix quicktime type recognition in ffmpeg. We returned a bogus + caps, which caused ffdemux_quicktime to be chosen over qtdemux. + This fixes that. + +2004-03-04 Ronald Bultje <rb...@ro...> * configure.ac: Brackets cause autoconf errors. So remove them. * ext/ffmpeg/gstffmpegdemux.c: (gst_ffmpegdemux_add): Index: gstffmpegcodecmap.c RCS file: /home/cvs/gstreamer/gst-ffmpeg/ext/ffmpeg/gstffmpegcodecmap.c,v retrieving revision 1.42 retrieving revision 1.43 diff -u -d -r1.42 -r1.43 --- a/gstffmpegcodecmap.c 1 Mar 2004 04:59:17 -0000 1.42 +++ b/gstffmpegcodecmap.c 5 Mar 2004 02:40:34 -0000 1.43 @@ -908,7 +908,7 @@ } else if (!strcmp (format_name, "au")) { caps = gst_caps_new_simple ("audio/x-au", NULL); - } else if (!strcmp (format_name, "mov")) { + } else if (!strcmp (format_name, "mov_mp4_m4a_3gp")) { caps = gst_caps_new_simple ("video/quicktime", } else if (!strcmp (format_name, "dv")) { @@ -918,6 +918,9 @@ } else if (!strcmp (format_name, "4xm")) { caps = gst_caps_new_simple ("video/x-4xm", + } else if (!strcmp (format_name, "matroska")) { + caps = gst_caps_new_simple ("video/x-matroska", + NULL); } else { gchar *name; |
From: Ronald S. B. <rb...@pd...> - 2004-03-15 00:01:18
|
CVS Root: /home/cvs/gstreamer Module: gst-ffmpeg Changes by: rbultje Date: Sun Mar 14 2004 16:01:16 PST Log message: * ext/ffmpeg/gstffmpegcodecmap.c: (gst_ffmpeg_codecid_to_caps): * ext/ffmpeg/gstffmpegcodecmap.h: * ext/ffmpeg/gstffmpegdec.c: (gst_ffmpegdec_chain), (gst_ffmpegdec_register): * ext/ffmpeg/gstffmpegdemux.c: (gst_ffmpegdemux_add), (gst_ffmpegdemux_register): * ext/ffmpeg/gstffmpegenc.c: (gst_ffmpegenc_connect), (gst_ffmpegenc_register): * ext/ffmpeg/gstffmpegmux.c: (gst_ffmpegmux_register): Add encode property to codec mapper, so we can get better-fitting caps. Also use this everywhere. ;). Lastly, add some new codecIDs to our list of recognized ones. Modified files: . : ChangeLog ext/ffmpeg : gstffmpegcodecmap.c gstffmpegcodecmap.h gstffmpegdec.c gstffmpegdemux.c gstffmpegenc.c gstffmpegmux.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-ffmpeg/ChangeLog.diff?r1=1.21&r2=1.22 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-ffmpeg/ext/ffmpeg/gstffmpegcodecmap.c.diff?r1=1.44&r2=1.45 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-ffmpeg/ext/ffmpeg/gstffmpegcodecmap.h.diff?r1=1.6&r2=1.7 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-ffmpeg/ext/ffmpeg/gstffmpegdec.c.diff?r1=1.46&r2=1.47 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-ffmpeg/ext/ffmpeg/gstffmpegdemux.c.diff?r1=1.24&r2=1.25 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-ffmpeg/ext/ffmpeg/gstffmpegenc.c.diff?r1=1.41&r2=1.42 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-ffmpeg/ext/ffmpeg/gstffmpegmux.c.diff?r1=1.22&r2=1.23 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /home/cvs/gstreamer/gst-ffmpeg/ChangeLog,v retrieving revision 1.21 retrieving revision 1.22 diff -u -d -r1.21 -r1.22 --- a/ChangeLog 12 Mar 2004 18:53:26 -0000 1.21 +++ b/ChangeLog 15 Mar 2004 00:01:03 -0000 1.22 @@ -1,3 +1,18 @@ +2004-03-14 Ronald Bultje <rb...@ro...> + + * ext/ffmpeg/gstffmpegcodecmap.c: (gst_ffmpeg_codecid_to_caps): + * ext/ffmpeg/gstffmpegcodecmap.h: + * ext/ffmpeg/gstffmpegdec.c: (gst_ffmpegdec_chain), + (gst_ffmpegdec_register): + * ext/ffmpeg/gstffmpegdemux.c: (gst_ffmpegdemux_add), + (gst_ffmpegdemux_register): + * ext/ffmpeg/gstffmpegenc.c: (gst_ffmpegenc_connect), + (gst_ffmpegenc_register): + * ext/ffmpeg/gstffmpegmux.c: (gst_ffmpegmux_register): + Add encode property to codec mapper, so we can get better-fitting + caps. Also use this everywhere. ;). Lastly, add some new codecIDs + to our list of recognized ones. 2004-03-12 Thomas Vander Stichele <thomas at apestaart dot org> * gst-libs/ext/ffmpeg/.pc/applied-patches: Index: gstffmpegcodecmap.c RCS file: /home/cvs/gstreamer/gst-ffmpeg/ext/ffmpeg/gstffmpegcodecmap.c,v retrieving revision 1.44 retrieving revision 1.45 diff -u -d -r1.44 -r1.45 --- a/gstffmpegcodecmap.c 7 Mar 2004 22:02:15 -0000 1.44 +++ b/gstffmpegcodecmap.c 15 Mar 2004 00:01:03 -0000 1.45 @@ -36,6 +36,9 @@ * properties depending on whether we've got a context. * * See below for why we use this. + * + * We should actually do this stuff at the end, like in riff-media.c, + * but I'm too lazy today. Maybe later. */ #define GST_FF_VID_CAPS_NEW(mimetype, props...) \ @@ -71,174 +74,248 @@ * for video/audio size will be included in the GstCaps * CodecID is primarily meant for compressed data GstCaps! + * encode is a special parameter. gstffmpegdec will say + * FALSE, gstffmpegenc will say TRUE. The output caps + * depends on this, in such a way that it will be very + * specific, defined, fixed and correct caps for encoders, + * yet very wide, "forgiving" caps for decoders. Example + * for mp3: decode: audio/mpeg,mpegversion=1,layer=[1-3] + * but encode: audio/mpeg,mpegversion=1,layer=3,bitrate=x, + * rate=x,channels=x. GstCaps * gst_ffmpeg_codecid_to_caps (enum CodecID codec_id, - AVCodecContext *context) + AVCodecContext *context, + gboolean encode) { GstCaps *caps = NULL; + gboolean buildcaps = FALSE; switch (codec_id) { case CODEC_ID_MPEG1VIDEO: - /* this caps doesn't need width/height/framerate */ - caps = gst_caps_new_simple ("video/mpeg", - "mpegversion", G_TYPE_INT, 1, - "systemstream", G_TYPE_BOOLEAN, FALSE, - NULL); + /* For decoding, CODEC_ID_MPEG2VIDEO is preferred... So omit here */ + if (encode) { + /* FIXME: bitrate */ + caps = GST_FF_VID_CAPS_NEW ("video/mpeg", + "mpegversion", G_TYPE_INT, 1, + "systemstream", G_TYPE_BOOLEAN, FALSE, + NULL); + } break; - + case CODEC_ID_MPEG2VIDEO: + "mpegversion", G_TYPE_INT, 2, + } else { + /* decode both MPEG-1 and MPEG-2; width/height/fps are all in + * the MPEG video stream headers, so may be omitted from caps. */ + caps = gst_caps_new_simple ("video/mpeg", + "mpegversion", GST_TYPE_INT_RANGE, 1, 2, + "systemstream", G_TYPE_BOOLEAN, FALSE, + break; + case CODEC_ID_MPEG2VIDEO_XVMC: + /* this is a special ID - don't need it in GStreamer, I think */ + /* I don't know the exact differences between those... Anyone? */ + case CODEC_ID_H263: case CODEC_ID_H263P: case CODEC_ID_H263I: - case CODEC_ID_H263: caps = GST_FF_VID_CAPS_NEW ("video/x-h263"); case CODEC_ID_RV10: - caps = GST_FF_VID_CAPS_NEW ("video/x-pn-realvideo", + case CODEC_ID_RV20: + do { + gint version = (codec_id == CODEC_ID_RV10) ? 1 : 2; + /* FIXME: context->sub_id must be filled in during decoding */ + caps = GST_FF_VID_CAPS_NEW ("video/x-pn-realvideo", "systemstream", G_TYPE_BOOLEAN, FALSE, + "rmversion", G_TYPE_INT, version, NULL); + } while (0); case CODEC_ID_MP2: - caps = GST_FF_AUD_CAPS_NEW ("audio/mpeg", + /* we use CODEC_ID_MP3 for decoding */ + caps = GST_FF_AUD_CAPS_NEW ("audio/mpeg", "mpegversion", G_TYPE_INT, 1, - "layer", G_TYPE_INT, 2, + "layer", G_TYPE_INT, 2, - case CODEC_ID_MP3LAME: + case CODEC_ID_MP3: - "layer", G_TYPE_INT, 3, + "layer", G_TYPE_INT, 3, + /* Decodes MPEG-1 layer 1/2/3. Samplerate, channels et al are + * in the MPEG audio header, so may be omitted from caps. */ + caps = gst_caps_new_simple ("audio/mpeg", + "mpegversion", G_TYPE_INT, 1, + "layer", GST_TYPE_INT_RANGE, 1, 3, - /* FIXME: This could become problematic when we fully switched to seperation - of ogg and vorbis, because ffmpeg does ass ume ogg == ogg/vorbis - Maybe we want to disable this? */ case CODEC_ID_VORBIS: - caps = GST_FF_AUD_CAPS_NEW ("application/ogg"); + /* This one is disabled for several reasons: + * - GStreamer already has perfect Ogg and Vorbis support + * - The ffmpeg implementation depends on libvorbis/libogg, + * which are not included in the ffmpeg that GStreamer ships. + * - The ffmpeg implementation depends on shared objects between + * the ogg demuxer and vorbis decoder, which GStreamer doesn't. + */ case CODEC_ID_AC3: - caps = GST_FF_AUD_CAPS_NEW ("audio/x-ac3"); + /* Decoding is disabled, because: + * - it depends on liba52, which we don't ship in ffmpeg. + * - we already have a liba52 plugin ourselves. + caps = GST_FF_AUD_CAPS_NEW ("audio/x-ac3"); + /* MJPEG is normal JPEG, Motion-JPEG and Quicktime MJPEG-A. MJPEGB + * is Quicktime's MJPEG-B. LJPEG is lossless JPEG. I don't know what + * sp5x is, but it's apparently something JPEG... We don't separate + * between those in GStreamer. Should we (at least between MJPEG, + * MJPEG-B and sp5x decoding...)? */ case CODEC_ID_MJPEG: case CODEC_ID_MJPEGB: - /*case CODEC_ID_LJPEG:*/ + case CODEC_ID_LJPEG: + case CODEC_ID_SP5X: caps = GST_FF_VID_CAPS_NEW ("video/x-jpeg"); case CODEC_ID_MPEG4: - caps = GST_FF_VID_CAPS_NEW ("video/mpeg", - "mpegversion", G_TYPE_INT, 4, + /* I'm not exactly sure what ffmpeg outputs... ffmpeg itself uses + * the AVI fourcc 'DIVX', but 'mp4v' for Quicktime... */ + "mpegversion", G_TYPE_INT, 4, - gst_caps_append(caps, - GST_FF_VID_CAPS_NEW ("video/x-divx", - "divxversion", GST_TYPE_INT_RANGE, 4, 5, - NULL)); - GST_FF_VID_CAPS_NEW ("video/x-xvid")); - GST_FF_VID_CAPS_NEW ("video/x-3ivx")); + /* The trick here is to separate xvid, divx, mpeg4, 3ivx et al */ + gst_caps_append (caps, GST_FF_VID_CAPS_NEW ("video/x-divx", + "divxversion", GST_TYPE_INT_RANGE, 4, 5, + NULL)); + gst_caps_append (caps, GST_FF_VID_CAPS_NEW ("video/x-xvid")); + gst_caps_append (caps, GST_FF_VID_CAPS_NEW ("video/x-3ivx")); - /* weird quasi-codecs for the demuxers only */ case CODEC_ID_RAWVIDEO: - /* we use a shortcut to the raw-video pad function */ - return gst_ffmpeg_codectype_to_caps (CODEC_TYPE_VIDEO, context); - - case CODEC_ID_MSMPEG4V1: - caps = GST_FF_VID_CAPS_NEW ("video/x-msmpeg", - "msmpegversion", G_TYPE_INT, 41, - NULL); + caps = gst_ffmpeg_codectype_to_caps (CODEC_TYPE_VIDEO, context); + case CODEC_ID_MSMPEG4V1: case CODEC_ID_MSMPEG4V2: - "msmpegversion", G_TYPE_INT, 42, - break; case CODEC_ID_MSMPEG4V3: - "msmpegversion", G_TYPE_INT, 43, + gint version = 41 + codec_id - CODEC_ID_MSMPEG4V1; + /* encode-FIXME: bitrate */ + caps = GST_FF_VID_CAPS_NEW ("video/x-msmpeg", + "msmpegversion", G_TYPE_INT, version, - GST_FF_VID_CAPS_NEW ("video/x-divx", - "divxversion", G_TYPE_INT, 3, - NULL)); + if (!encode && codec_id == CODEC_ID_MSMPEG4V3) { + gst_caps_append (caps, GST_FF_VID_CAPS_NEW ("video/x-divx", + "divxversion", G_TYPE_INT, 3, + NULL)); + } case CODEC_ID_WMV1: - caps = GST_FF_VID_CAPS_NEW ("video/x-wmv", - "wmvversion", G_TYPE_INT, 1, + case CODEC_ID_WMV2: + gint version = (codec_id == CODEC_ID_WMV1) ? 1 : 2; + caps = GST_FF_VID_CAPS_NEW ("video/x-wmv", + "wmvversion", G_TYPE_INT, version, - case CODEC_ID_WMV2: - "wmvversion", G_TYPE_INT, 2, + case CODEC_ID_FLV1: + buildcaps = TRUE; case CODEC_ID_SVQ1: caps = GST_FF_VID_CAPS_NEW ("video/x-svq", - "svqversion", G_TYPE_INT, 1, + "svqversion", G_TYPE_INT, 1, + NULL); case CODEC_ID_SVQ3: - "svqversion", G_TYPE_INT, 3, - "halfpel_flag", GST_TYPE_INT_RANGE, 0, 1, - "thirdpel_flag", GST_TYPE_INT_RANGE, 0, 1, - "low_delay", GST_TYPE_INT_RANGE, 0, 1, - "unknown_svq3_flag", GST_TYPE_INT_RANGE, 0, 1, + "svqversion", G_TYPE_INT, 3, + "halfpel_flag", GST_TYPE_INT_RANGE, 0, 1, + "thirdpel_flag", GST_TYPE_INT_RANGE, 0, 1, + "low_delay", GST_TYPE_INT_RANGE, 0, 1, + "unknown_svq3_flag", GST_TYPE_INT_RANGE, 0, 1, case CODEC_ID_DVAUDIO: - caps = GST_FF_AUD_CAPS_NEW ("audio/x-dv"); - break; + caps = GST_FF_AUD_CAPS_NEW ("audio/x-dv"); case CODEC_ID_DVVIDEO: caps = GST_FF_VID_CAPS_NEW ("video/dv"); case CODEC_ID_WMAV1: - caps = GST_FF_AUD_CAPS_NEW ("audio/x-wma", - "wmaversion", G_TYPE_INT, 1, - "flags1", GST_TYPE_INT_RANGE, G_MININT, G_MAXINT, - "flags2", GST_TYPE_INT_RANGE, G_MININT, G_MAXINT, - "block_align", GST_TYPE_INT_RANGE, 0, G_MAXINT, - "bitrate", GST_TYPE_INT_RANGE, 0, G_MAXINT, case CODEC_ID_WMAV2: - "wmaversion", G_TYPE_INT, 2, + gint version = (codec_id == CODEC_ID_WMAV1) ? 1 : 2; + caps = GST_FF_AUD_CAPS_NEW ("audio/x-wma", + "wmaversion", G_TYPE_INT, version, + "flags1", GST_TYPE_INT_RANGE, G_MININT, G_MAXINT, + "flags2", GST_TYPE_INT_RANGE, G_MININT, G_MAXINT, + "block_align", GST_TYPE_INT_RANGE, 0, G_MAXINT, + "bitrate", GST_TYPE_INT_RANGE, 0, G_MAXINT, case CODEC_ID_MACE3: - caps = GST_FF_AUD_CAPS_NEW ("audio/x-mace", - "maceversion", G_TYPE_INT, 3, case CODEC_ID_MACE6: - "maceversion", G_TYPE_INT, 6, + gint version = (codec_id == CODEC_ID_MACE3) ? 3 : 6; + caps = GST_FF_AUD_CAPS_NEW ("audio/x-mace", + "maceversion", G_TYPE_INT, version, case CODEC_ID_HUFFYUV: @@ -246,7 +323,7 @@ case CODEC_ID_CYUV: - /* .. */ case CODEC_ID_H264: @@ -255,42 +332,71 @@ case CODEC_ID_INDEO3: caps = GST_FF_VID_CAPS_NEW ("video/x-indeo", - "indeoversion", G_TYPE_INT, 3, + "indeoversion", G_TYPE_INT, 3, case CODEC_ID_VP3: caps = GST_FF_VID_CAPS_NEW ("video/x-vp3"); - case CODEC_ID_AAC: - "systemstream", G_TYPE_BOOLEAN, FALSE, - "mpegversion", G_TYPE_INT, 2, + case CODEC_ID_THEORA: + caps = GST_FF_VID_CAPS_NEW ("video/x-theora"); + case CODEC_ID_AAC: case CODEC_ID_MPEG4AAC: - "mpegversion", G_TYPE_INT, 4, + /* ffmpeg uses libfaac/libfaad for those. We do not ship these as + * part of ffmpeg, so defining those is useless. Besides, we have + * our own faad/faac plugins. */ case CODEC_ID_ASV1: + case CODEC_ID_ASV2: case CODEC_ID_FFV1: caps = GST_FF_VID_CAPS_NEW ("video/x-ffv", - "ffvversion", G_TYPE_INT, 1, + "ffvversion", G_TYPE_INT, 1, case CODEC_ID_4XM: caps = GST_FF_VID_CAPS_NEW ("video/x-4xm"); + case CODEC_ID_VCR1: + case CODEC_ID_CLJR: + case CODEC_ID_MDEC: + case CODEC_ID_ROQ: + case CODEC_ID_INTERPLAY_VIDEO: + case CODEC_ID_XAN_WC3: + case CODEC_ID_XAN_WC4: + case CODEC_ID_RPZA: + case CODEC_ID_CINEPAK: + caps = GST_FF_VID_CAPS_NEW ("video/x-cinepak"); + case CODEC_ID_WS_VQA: + case CODEC_ID_MSRLE: + case CODEC_ID_MSVIDEO1: + case CODEC_ID_IDCIN: + case CODEC_ID_8BPS: + case CODEC_ID_SMC: + case CODEC_ID_FLIC: + case CODEC_ID_TRUEMOTION1: + case CODEC_ID_VMDVIDEO: + case CODEC_ID_VMDAUDIO: + case CODEC_ID_MSZH: + case CODEC_ID_ZLIB: + case CODEC_ID_QTRLE: /* weird quasi-codecs for the demuxers only */ case CODEC_ID_PCM_S16LE: case CODEC_ID_PCM_S16BE: @@ -356,58 +462,159 @@ case CODEC_ID_ADPCM_IMA_QT: - caps = GST_FF_AUD_CAPS_NEW ("audio/x-adpcm", - "layout", G_TYPE_STRING, "quicktime", case CODEC_ID_ADPCM_IMA_WAV: - "layout", G_TYPE_STRING, "wav", + case CODEC_ID_ADPCM_IMA_DK3: + case CODEC_ID_ADPCM_IMA_DK4: + case CODEC_ID_ADPCM_IMA_WS: + case CODEC_ID_ADPCM_IMA_SMJPEG: case CODEC_ID_ADPCM_MS: - "layout", G_TYPE_STRING, "microsoft", case CODEC_ID_ADPCM_4XM: - "layout", G_TYPE_STRING, "4xm", + case CODEC_ID_ADPCM_XA: + case CODEC_ID_ADPCM_ADX: + case CODEC_ID_ADPCM_EA: + case CODEC_ID_ADPCM_G726: + gchar *layout = NULL; + switch (codec_id) { + case CODEC_ID_ADPCM_IMA_QT: + layout = "quicktime"; + break; + case CODEC_ID_ADPCM_IMA_WAV: + layout = "wav"; + case CODEC_ID_ADPCM_IMA_DK3: + layout = "dk3"; + case CODEC_ID_ADPCM_IMA_DK4: + layout = "dk4"; + case CODEC_ID_ADPCM_IMA_WS: + layout = "westwood"; + case CODEC_ID_ADPCM_IMA_SMJPEG: + layout = "smjpeg"; + case CODEC_ID_ADPCM_MS: + layout = "microsoft"; + case CODEC_ID_ADPCM_4XM: + layout = "4xm"; + case CODEC_ID_ADPCM_XA: + layout = "xa"; + case CODEC_ID_ADPCM_ADX: + layout = "adx"; + case CODEC_ID_ADPCM_EA: + layout = "ea"; + case CODEC_ID_ADPCM_G726: + layout = "g726"; + default: + g_assert (0); /* don't worry, we never get here */ + /* FIXME: someone please check whether we need additional properties + * in this caps definition. */ + caps = GST_FF_AUD_CAPS_NEW ("audio/x-adpcm", + "layout", G_TYPE_STRING, layout, NULL); case CODEC_ID_AMR_NB: + case CODEC_ID_AMR_WB: + /* what's this? ffmpeg uses external libs here that we don't include + * so there's no point in defining those. Still, I want to know what + * it actually is... */ case CODEC_ID_RA_144: - caps = GST_FF_AUD_CAPS_NEW ("audio/x-pn-realaudio", - "bitrate", G_TYPE_INT, 14400, case CODEC_ID_RA_288: - "bitrate", G_TYPE_INT, 28800, + gint version = (codec_id == CODEC_ID_RA_144) ? 1 : 2; + /* FIXME: properties? */ + caps = GST_FF_AUD_CAPS_NEW ("audio/x-pn-realaudio", + "raversion", G_TYPE_INT, version, - case CODEC_ID_CINEPAK: - caps = GST_FF_VID_CAPS_NEW ("video/x-cinepak", NULL); + case CODEC_ID_ROQ_DPCM: + case CODEC_ID_INTERPLAY_DPCM: + case CODEC_ID_XAN_DPCM: + case CODEC_ID_ROQ_DPCM: + layout = "roq"; + case CODEC_ID_INTERPLAY_DPCM: + layout = "interplay"; + case CODEC_ID_XAN_DPCM: + layout = "xan"; + caps = GST_FF_AUD_CAPS_NEW ("audio/x-dpcm", + + case CODEC_ID_FLAC: + /* Note that ffmpeg has no encoder yet, but just for safety. In the + * encoder case, we want to add things like samplerate, channels... */ + if (!encode) { + caps = gst_caps_new_simple ("audio/x-flac", NULL); default: + g_warning ("Unknown codec ID %d, please add here", codec_id); } + if (buildcaps) { + AVCodec *codec; + if ((codec = avcodec_find_decoder (codec_id)) || + (codec = avcodec_find_encoder (codec_id))) { + gchar *mime = NULL; + switch (codec->type) { + case CODEC_TYPE_VIDEO: + mime = g_strdup_printf ("video/x-gst_ff-%s", codec->name); + caps = GST_FF_VID_CAPS_NEW (mime); + g_free (mime); + break; + case CODEC_TYPE_AUDIO: + mime = g_strdup_printf ("audio/x-gst_ff-%s", codec->name); + caps = GST_FF_AUD_CAPS_NEW (mime); + default: + } + } if (caps != NULL) { char *str = gst_caps_to_string (caps); GST_DEBUG ("caps for codec_id=%d: %s", codec_id, str); - g_free(str); + g_free (str); } else { GST_WARNING ("No caps found for codec_id=%d", codec_id); @@ -941,7 +1148,9 @@ * are omitted, that can be queried by the user itself, * we're not eating the GstCaps or anything * A pointer to an allocated context is also needed for - * optional extra info (not used yet, though) + * optional extra info + * FIXME: lots of ffmpeg decoders need more properties... enum CodecID @@ -1139,8 +1348,14 @@ case 1: id = CODEC_ID_MPEG1VIDEO; break; + case 2: + id = CODEC_ID_MPEG2VIDEO; case 4: id = CODEC_ID_MPEG4; + if (context) { + context->codec_tag = GST_MAKE_FOURCC ('m','p','4','v'); + } default: /* ... */ @@ -1312,8 +1527,12 @@ audio = TRUE; } - } else if (!strcmp (mimetype, "video/x-theora") || - !strcmp (mimetype, "video/x-vp3")) { + } else if (!strcmp (mimetype, "video/x-theora")) { + id = CODEC_ID_THEORA; + video = TRUE; + } else if (!strcmp (mimetype, "video/x-vp3")) { id = CODEC_ID_VP3; video = TRUE; @@ -1352,6 +1571,10 @@ break; + if (context) { + context->codec_tag = GST_MAKE_FOURCC ('D','I','V','X'); if (id != CODEC_ID_NONE) { video = TRUE; @@ -1405,6 +1628,22 @@ id = CODEC_ID_ADPCM_IMA_WAV; } else if (!strcmp (layout, "4xm")) { id = CODEC_ID_ADPCM_4XM; + } else if (!strcmp (layout, "smjpeg")) { + id = CODEC_ID_ADPCM_IMA_SMJPEG; + } else if (!strcmp (layout, "dk3")) { + id = CODEC_ID_ADPCM_IMA_DK3; + } else if (!strcmp (layout, "dk4")) { + id = CODEC_ID_ADPCM_IMA_DK4; + } else if (!strcmp (layout, "westwood")) { + id = CODEC_ID_ADPCM_IMA_WS; + } else if (!strcmp (layout, "xa")) { + id = CODEC_ID_ADPCM_XA; + } else if (!strcmp (layout, "adx")) { + id = CODEC_ID_ADPCM_ADX; + } else if (!strcmp (layout, "ea")) { + id = CODEC_ID_ADPCM_EA; + } else if (!strcmp (layout, "g726")) { + id = CODEC_ID_ADPCM_G726; @@ -1416,9 +1655,96 @@ id = CODEC_ID_4XM; - } + } else if (!strcmp (mimetype, "audio/x-dpcm")) { + const gchar *layout; - /* TODO: realvideo/audio (well, we can't write them anyway) */ + layout = gst_structure_get_string (structure, "layout"); + if (!strcmp (layout, "roq")) { + id = CODEC_ID_ROQ_DPCM; + } else if (!strcmp (layout, "interplay")) { + id = CODEC_ID_INTERPLAY_DPCM; + } else if (!strcmp (layout, "xan")) { + id = CODEC_ID_XAN_DPCM; + if (id != CODEC_ID_NONE) { + audio = TRUE; + } else if (!strcmp (mimetype, "audio/x-flax")) { + id = CODEC_ID_FLAC; + audio = TRUE; + } else if (!strcmp (mimetype, "video/x-cinepak")) { + id = CODEC_ID_CINEPAK; + } else if (!strcmp (mimetype, "video/x-pn-realvideo")) { + gint rmversion; + gst_structure_get_int (structure, "rmversion", &rmversion); + switch (rmversion) { + case 1: + id = CODEC_ID_RV10; + break; + case 2: + id = CODEC_ID_RV20; + default: + /* .. */ + video = TRUE; + } else if (!strcmp (mimetype, "audio/x-pn-realaudio")) { + gint raversion; + + gst_structure_get_int (structure, "raversion", &raversion); + switch (raversion) { + id = CODEC_ID_RA_144; + id = CODEC_ID_RA_288; + } else if (!strncmp (mimetype, "audio/x-gst_ff-", 15) || + !strncmp (mimetype, "video/x-gst_ff-", 15)) { + gchar ext[16]; + if (strlen (mimetype) <= 30 && + sscanf (mimetype, "%*s/x-gst_ff-%s", &ext) == 1) { + if ((codec = avcodec_find_decoder_by_name (ext)) || + (codec = avcodec_find_encoder_by_name (ext))) { + id = codec->id; + if (mimetype[0] == 'v') + video = TRUE; + else if (mimetype[0] == 'a') + audio = TRUE; if (context != NULL) { if (video == TRUE) { Index: gstffmpegcodecmap.h RCS file: /home/cvs/gstreamer/gst-ffmpeg/ext/ffmpeg/gstffmpegcodecmap.h,v retrieving revision 1.6 retrieving revision 1.7 diff -u -d -r1.6 -r1.7 --- a/gstffmpegcodecmap.h 22 Dec 2003 01:46:58 -0000 1.6 +++ b/gstffmpegcodecmap.h 15 Mar 2004 00:01:03 -0000 1.7 @@ -33,7 +33,8 @@ gst_ffmpeg_codecid_to_caps (enum CodecID codec_id, - AVCodecContext *context); + AVCodecContext *context, + gboolean encode); /* _codectype_to_caps () gets the GstCaps that belongs to * a certain CodecType for a pad with uncompressed data. Index: gstffmpegdec.c RCS file: /home/cvs/gstreamer/gst-ffmpeg/ext/ffmpeg/gstffmpegdec.c,v retrieving revision 1.46 retrieving revision 1.47 diff -u -d -r1.46 -r1.47 --- a/gstffmpegdec.c 9 Mar 2004 07:56:40 -0000 1.46 +++ b/gstffmpegdec.c 15 Mar 2004 00:01:03 -0000 1.47 @@ -392,6 +392,7 @@ (int16_t *) GST_BUFFER_DATA (outbuf), &have_data, data, size); if (have_data) { GST_BUFFER_SIZE (outbuf) = have_data; GST_BUFFER_DURATION (outbuf) = (have_data * GST_SECOND) / @@ -498,7 +499,7 @@ /* first make sure we've got a supported type */ - sinkcaps = gst_ffmpeg_codecid_to_caps (in_plugin->id, NULL); + sinkcaps = gst_ffmpeg_codecid_to_caps (in_plugin->id, NULL, FALSE); srccaps = gst_ffmpeg_codectype_to_caps (in_plugin->type, NULL); if (!sinkcaps || !srccaps) goto next; Index: gstffmpegdemux.c RCS file: /home/cvs/gstreamer/gst-ffmpeg/ext/ffmpeg/gstffmpegdemux.c,v retrieving revision 1.24 retrieving revision 1.25 diff -u -d -r1.24 -r1.25 --- a/gstffmpegdemux.c 4 Mar 2004 13:21:53 -0000 1.24 +++ b/gstffmpegdemux.c 15 Mar 2004 00:01:03 -0000 1.25 @@ -504,7 +504,7 @@ demux->srcpads[stream->index] = pad; /* get caps that belongs to this stream */ - caps = gst_ffmpeg_codecid_to_caps (stream->codec.codec_id, &stream->codec); + caps = gst_ffmpeg_codecid_to_caps (stream->codec.codec_id, &stream->codec, TRUE); gst_pad_set_explicit_caps (pad, caps); gst_element_add_pad (GST_ELEMENT (demux), pad); @@ -701,7 +701,7 @@ videosrccaps = gst_caps_new_empty (); for (in_codec = first_avcodec; in_codec != NULL; in_codec = in_codec->next) { - GstCaps *temp = gst_ffmpeg_codecid_to_caps (in_codec->id, NULL); + GstCaps *temp = gst_ffmpeg_codecid_to_caps (in_codec->id, NULL, TRUE); if (!temp) { continue; } Index: gstffmpegenc.c RCS file: /home/cvs/gstreamer/gst-ffmpeg/ext/ffmpeg/gstffmpegenc.c,v retrieving revision 1.41 retrieving revision 1.42 diff -u -d -r1.41 -r1.42 --- a/gstffmpegenc.c 11 Feb 2004 08:38:26 -0000 1.41 +++ b/gstffmpegenc.c 15 Mar 2004 00:01:03 -0000 1.42 @@ -343,7 +343,7 @@ /* try to set this caps on the other side */ other_caps = gst_ffmpeg_codecid_to_caps (oclass->in_plugin->id, - ffmpegenc->context); + ffmpegenc->context, TRUE); if (!other_caps) { avcodec_close (ffmpegenc->context); GST_DEBUG ("Unsupported codec - no caps found"); @@ -638,7 +638,7 @@ - srccaps = gst_ffmpeg_codecid_to_caps (in_plugin->id, NULL); + srccaps = gst_ffmpeg_codecid_to_caps (in_plugin->id, NULL, TRUE); sinkcaps = gst_ffmpeg_codectype_to_caps (in_plugin->type, NULL); Index: gstffmpegmux.c RCS file: /home/cvs/gstreamer/gst-ffmpeg/ext/ffmpeg/gstffmpegmux.c,v retrieving revision 1.23 diff -u -d -r1.22 -r1.23 --- a/gstffmpegmux.c 1 Mar 2004 04:59:17 -0000 1.22 +++ b/gstffmpegmux.c 15 Mar 2004 00:01:03 -0000 1.23 @@ -488,7 +488,7 @@ videosinkcaps = gst_caps_new_empty (); |
From: Ronald S. B. <rb...@pd...> - 2004-03-25 05:14:23
|
CVS Root: /home/cvs/gstreamer Module: gst-ffmpeg Changes by: rbultje Date: Wed Mar 24 2004 21:14:22 PST Log message: * ext/ffmpeg/gstffmpegdec.c: (gst_ffmpegdec_base_init): * ext/ffmpeg/gstffmpegenc.c: (gst_ffmpegenc_base_init): Fix category. * ext/ffmpeg/gstffmpegdemux.c: (gst_ffmpegdemux_class_init), (gst_ffmpegdemux_init), (gst_ffmpegdemux_close): Slightly rewrite the init function, old one was ugly. Also remove dispose function since it's obsolete, the change_state function cleans up already. Also fixes segfault in test-app gstreamer/tests/instantiate/create Modified files: . : ChangeLog ext/ffmpeg : gstffmpegdec.c gstffmpegdemux.c gstffmpegenc.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-ffmpeg/ChangeLog.diff?r1=1.35&r2=1.36 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-ffmpeg/ext/ffmpeg/gstffmpegdec.c.diff?r1=1.48&r2=1.49 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-ffmpeg/ext/ffmpeg/gstffmpegdemux.c.diff?r1=1.25&r2=1.26 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-ffmpeg/ext/ffmpeg/gstffmpegenc.c.diff?r1=1.42&r2=1.43 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /home/cvs/gstreamer/gst-ffmpeg/ChangeLog,v retrieving revision 1.35 retrieving revision 1.36 diff -u -d -r1.35 -r1.36 --- a/ChangeLog 24 Mar 2004 21:36:49 -0000 1.35 +++ b/ChangeLog 25 Mar 2004 05:14:09 -0000 1.36 @@ -1,3 +1,15 @@ +2004-03-25 Ronald Bultje <rb...@ro...> + + * ext/ffmpeg/gstffmpegdec.c: (gst_ffmpegdec_base_init): + * ext/ffmpeg/gstffmpegenc.c: (gst_ffmpegenc_base_init): + Fix category. + * ext/ffmpeg/gstffmpegdemux.c: (gst_ffmpegdemux_class_init), + (gst_ffmpegdemux_init), (gst_ffmpegdemux_close): + Slightly rewrite the init function, old one was ugly. Also remove + dispose function since it's obsolete, the change_state function + cleans up already. Also fixes segfault in test-app + gstreamer/tests/instantiate/create 2004-03-24 Benjamin Otte <ot...@gn...> * configure.ac: Index: gstffmpegdec.c RCS file: /home/cvs/gstreamer/gst-ffmpeg/ext/ffmpeg/gstffmpegdec.c,v retrieving revision 1.48 retrieving revision 1.49 diff -u -d -r1.48 -r1.49 --- a/gstffmpegdec.c 24 Mar 2004 21:36:50 -0000 1.48 +++ b/gstffmpegdec.c 25 Mar 2004 05:14:10 -0000 1.49 @@ -132,7 +132,7 @@ /* construct the element details struct */ details.longname = g_strdup_printf("FFMPEG %s decoder", params->in_plugin->name); - details.klass = g_strdup_printf("Codec/Decoder/%s", + details.klass = g_strdup_printf("Codec/%s/Decoder", (params->in_plugin->type == CODEC_TYPE_VIDEO) ? "Video" : "Audio"); details.description = g_strdup_printf("FFMPEG %s decoder", Index: gstffmpegdemux.c RCS file: /home/cvs/gstreamer/gst-ffmpeg/ext/ffmpeg/gstffmpegdemux.c,v retrieving revision 1.25 retrieving revision 1.26 diff -u -d -r1.25 -r1.26 --- a/gstffmpegdemux.c 15 Mar 2004 00:01:03 -0000 1.25 +++ b/gstffmpegdemux.c 25 Mar 2004 05:14:10 -0000 1.26 @@ -94,7 +94,6 @@ static void gst_ffmpegdemux_class_init (GstFFMpegDemuxClass *klass); static void gst_ffmpegdemux_base_init (GstFFMpegDemuxClass *klass); static void gst_ffmpegdemux_init (GstFFMpegDemux *demux); -static void gst_ffmpegdemux_dispose (GObject *object); static void gst_ffmpegdemux_loop (GstElement *element); @@ -202,13 +201,13 @@ parent_class = g_type_class_ref(GST_TYPE_ELEMENT); gstelement_class->change_state = gst_ffmpegdemux_change_state; - gobject_class->dispose = gst_ffmpegdemux_dispose; } static void gst_ffmpegdemux_init (GstFFMpegDemux *demux) { GstFFMpegDemuxClass *oclass = (GstFFMpegDemuxClass *) (G_OBJECT_GET_CLASS (demux)); + gint n; demux->sinkpad = gst_pad_new_from_template (oclass->sinktempl, "sink"); @@ -217,10 +216,13 @@ gst_ffmpegdemux_loop); demux->opened = FALSE; + demux->context = NULL; - memset (demux->srcpads, 0, sizeof (demux->srcpads)); - memset (demux->handled, FALSE, sizeof (demux->handled)); - memset (demux->last_ts, 0, sizeof (demux->last_ts)); + for (n = 0; n < MAX_STREAMS; n++) { + demux->srcpads[n] = NULL; + demux->handled[n] = FALSE; + demux->last_ts[n] = 0; + } demux->videopads = 0; demux->audiopads = 0; @@ -247,18 +249,11 @@ /* close demuxer context from ffmpeg */ av_close_input_file (demux->context); -static void -gst_ffmpegdemux_dispose (GObject *object) -{ - GstFFMpegDemux *demux = (GstFFMpegDemux *) demux; - - gst_ffmpegdemux_close (demux); -} static AVStream * gst_ffmpegdemux_stream_from_pad (GstPad *pad) Index: gstffmpegenc.c RCS file: /home/cvs/gstreamer/gst-ffmpeg/ext/ffmpeg/gstffmpegenc.c,v retrieving revision 1.42 retrieving revision 1.43 diff -u -d -r1.42 -r1.43 --- a/gstffmpegenc.c 15 Mar 2004 00:01:03 -0000 1.42 +++ b/gstffmpegenc.c 25 Mar 2004 05:14:10 -0000 1.43 @@ -166,7 +166,7 @@ details.longname = g_strdup_printf("FFMPEG %s encoder", - details.klass = g_strdup_printf("Codec/Encoder/%s", + details.klass = g_strdup_printf("Codec/%s/Encoder", details.description = g_strdup_printf("FFMPEG %s encoder", |
From: Ronald S. B. <rb...@pd...> - 2004-04-11 21:40:15
|
CVS Root: /home/cvs/gstreamer Module: gst-ffmpeg Changes by: rbultje Date: Sun Apr 11 2004 14:40:13 PDT Log message: * ext/ffmpeg/gstffmpegcodecmap.c: (gst_ffmpeg_codecid_to_caps): Add MS Video v1 (video/x-msvideocodec, CODEC_ID_MSVIDEO1). Modified files: . : ChangeLog ext/ffmpeg : gstffmpegcodecmap.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-ffmpeg/ChangeLog.diff?r1=1.41&r2=1.42 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-ffmpeg/ext/ffmpeg/gstffmpegcodecmap.c.diff?r1=1.47&r2=1.48 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /home/cvs/gstreamer/gst-ffmpeg/ChangeLog,v retrieving revision 1.41 retrieving revision 1.42 diff -u -d -r1.41 -r1.42 --- a/ChangeLog 9 Apr 2004 06:20:30 -0000 1.41 +++ b/ChangeLog 11 Apr 2004 21:40:01 -0000 1.42 @@ -1,3 +1,8 @@ +2004-04-11 Ronald Bultje <rb...@ro...> + + * ext/ffmpeg/gstffmpegcodecmap.c: (gst_ffmpeg_codecid_to_caps): + Add MS Video v1 (video/x-msvideocodec, CODEC_ID_MSVIDEO1). 2004-04-08 David Schleef <ds...@sc...> * ext/ffmpeg/gstffmpegcodecmap.c: (gst_ffmpeg_codecid_to_caps): Index: gstffmpegcodecmap.c RCS file: /home/cvs/gstreamer/gst-ffmpeg/ext/ffmpeg/gstffmpegcodecmap.c,v retrieving revision 1.47 retrieving revision 1.48 diff -u -d -r1.47 -r1.48 --- a/gstffmpegcodecmap.c 9 Apr 2004 06:20:31 -0000 1.47 +++ b/gstffmpegcodecmap.c 11 Apr 2004 21:40:01 -0000 1.48 @@ -362,9 +362,13 @@ caps = GST_FF_VID_CAPS_NEW ("video/x-cinepak", NULL); break; + case CODEC_ID_MSVIDEO1: + caps = GST_FF_VID_CAPS_NEW ("video/x-msvideocodec", + "msvideoversion", G_TYPE_INT, 1, NULL); + break; case CODEC_ID_WS_VQA: case CODEC_ID_MSRLE: - case CODEC_ID_MSVIDEO1: case CODEC_ID_IDCIN: case CODEC_ID_8BPS: case CODEC_ID_SMC: |
From: Ronald S. B. <rb...@pd...> - 2004-04-16 01:28:50
|
CVS Root: /home/cvs/gstreamer Module: gst-ffmpeg Changes by: rbultje Date: Thu Apr 15 2004 18:28:48 PDT Log message: * ext/ffmpeg/gstffmpegcodecmap.c: (gst_ffmpeg_get_palette), (gst_ffmpeg_set_palette), (gst_ffmpeg_codecid_to_caps), (gst_ffmpeg_pixfmt_to_caps), (gst_ffmpeg_caps_to_smpfmt), (gst_ffmpeg_caps_to_pixfmt), (gst_ffmpeg_caps_with_codectype), (gst_ffmpeg_caps_with_codecid), (gst_ffmpeg_caps_to_codecid): * ext/ffmpeg/gstffmpegcodecmap.h: Change some function names to reflect that they don't really _return_ something, but rather _use_ something to fill a AVCodecContext. s/to/with/. Restructure the extradata handling, it's now not picking up the type from the caps but rather using the type as provided in the function. This is a lot cleaner. Implement MS RLE palette pickup. * ext/ffmpeg/gstffmpegcolorspace.c: (gst_ffmpegcsp_pad_link): * ext/ffmpeg/gstffmpegenc.c: (gst_ffmpegenc_connect): Sync with the above function name changes. * ext/ffmpeg/gstffmpegdec.c: (gst_ffmpegdec_close), (gst_ffmpegdec_open), (gst_ffmpegdec_connect), (gst_ffmpegdec_chain), (gst_ffmpegdec_change_state): Add some hacks to convert palette-based raw image formats to RGBA32. Ugly, but I don't know how else to handle palette-based RGB, since img_convert() (and thus ffcolorspace) doesn't accept a palette as argument. Modified files: . : ChangeLog ext/ffmpeg : gstffmpegcodecmap.c gstffmpegcodecmap.h gstffmpegcolorspace.c gstffmpegdec.c gstffmpegenc.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-ffmpeg/ChangeLog.diff?r1=1.43&r2=1.44 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-ffmpeg/ext/ffmpeg/gstffmpegcodecmap.c.diff?r1=1.48&r2=1.49 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-ffmpeg/ext/ffmpeg/gstffmpegcodecmap.h.diff?r1=1.7&r2=1.8 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-ffmpeg/ext/ffmpeg/gstffmpegcolorspace.c.diff?r1=1.15&r2=1.16 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-ffmpeg/ext/ffmpeg/gstffmpegdec.c.diff?r1=1.51&r2=1.52 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-ffmpeg/ext/ffmpeg/gstffmpegenc.c.diff?r1=1.44&r2=1.45 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /home/cvs/gstreamer/gst-ffmpeg/ChangeLog,v retrieving revision 1.43 retrieving revision 1.44 diff -u -d -r1.43 -r1.44 --- a/ChangeLog 14 Apr 2004 15:27:20 -0000 1.43 +++ b/ChangeLog 16 Apr 2004 01:28:35 -0000 1.44 @@ -1,3 +1,28 @@ +2004-04-15 Ronald Bultje <rb...@ro...> + + * ext/ffmpeg/gstffmpegcodecmap.c: (gst_ffmpeg_get_palette), + (gst_ffmpeg_set_palette), (gst_ffmpeg_codecid_to_caps), + (gst_ffmpeg_pixfmt_to_caps), (gst_ffmpeg_caps_to_smpfmt), + (gst_ffmpeg_caps_to_pixfmt), (gst_ffmpeg_caps_with_codectype), + (gst_ffmpeg_caps_with_codecid), (gst_ffmpeg_caps_to_codecid): + * ext/ffmpeg/gstffmpegcodecmap.h: + Change some function names to reflect that they don't really + _return_ something, but rather _use_ something to fill a + AVCodecContext. s/to/with/. Restructure the extradata handling, + it's now not picking up the type from the caps but rather + using the type as provided in the function. This is a lot + cleaner. Implement MS RLE palette pickup. + * ext/ffmpeg/gstffmpegcolorspace.c: (gst_ffmpegcsp_pad_link): + * ext/ffmpeg/gstffmpegenc.c: (gst_ffmpegenc_connect): + Sync with the above function name changes. + * ext/ffmpeg/gstffmpegdec.c: (gst_ffmpegdec_close), + (gst_ffmpegdec_open), (gst_ffmpegdec_connect), + (gst_ffmpegdec_chain), (gst_ffmpegdec_change_state): + Add some hacks to convert palette-based raw image formats to + RGBA32. Ugly, but I don't know how else to handle palette-based + RGB, since img_convert() (and thus ffcolorspace) doesn't accept + a palette as argument. 2004-04-14 Thomas Vander Stichele <thomas at apestaart dot org> * everything: updated upstream source to 2004-04-11 23:00 GMT Index: gstffmpegcodecmap.c RCS file: /home/cvs/gstreamer/gst-ffmpeg/ext/ffmpeg/gstffmpegcodecmap.c,v retrieving revision 1.48 retrieving revision 1.49 diff -u -d -r1.48 -r1.49 --- a/gstffmpegcodecmap.c 11 Apr 2004 21:40:01 -0000 1.48 +++ b/gstffmpegcodecmap.c 16 Apr 2004 01:28:36 -0000 1.49 @@ -1,7 +1,7 @@ /* GStreamer * Copyright (C) <1999> Erik Walthinsen <om...@cs...> * This file: - * Copyright (c) 2002-2003 Ronald Bultje <rb...@ro...> + * Copyright (c) 2002-2004 Ronald Bultje <rb...@ro...> * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public @@ -32,6 +32,45 @@ #include "gstffmpegcodecmap.h" [...1063 lines suppressed...] } - } if (context != NULL) { if (video == TRUE) { - gst_ffmpeg_caps_to_pixfmt (caps, context); context->codec_type = CODEC_TYPE_VIDEO; } else if (audio == TRUE) { - gst_ffmpeg_caps_to_smpfmt (caps, context); context->codec_type = CODEC_TYPE_AUDIO; + } else { + context->codec_type = CODEC_TYPE_UNKNOWN; context->codec_id = id; + gst_ffmpeg_caps_with_codecid (id, context->codec_type, caps, context); if (id != CODEC_ID_NONE) { Index: gstffmpegcodecmap.h RCS file: /home/cvs/gstreamer/gst-ffmpeg/ext/ffmpeg/gstffmpegcodecmap.h,v retrieving revision 1.7 retrieving revision 1.8 diff -u -d -r1.7 -r1.8 --- a/gstffmpegcodecmap.h 15 Mar 2004 00:01:03 -0000 1.7 +++ b/gstffmpegcodecmap.h 16 Apr 2004 01:28:36 -0000 1.8 @@ -27,7 +27,8 @@ #endif #include <gst/gst.h> -/* _codecid_to_caps () gets the GstCaps that belongs to +/* + * _codecid_to_caps () gets the GstCaps that belongs to * a certain CodecID for a pad with compressed data. */ @@ -36,7 +37,8 @@ AVCodecContext *context, gboolean encode); -/* _codectype_to_caps () gets the GstCaps that belongs to + * _codectype_to_caps () gets the GstCaps that belongs to * a certain CodecType for a pad with uncompressed data. @@ -44,25 +46,39 @@ gst_ffmpeg_codectype_to_caps (enum CodecType codec_type, AVCodecContext *context); -/* caps_to_codecid () transforms a GstCaps that belongs to + * caps_to_codecid () transforms a GstCaps that belongs to * a pad for compressed data to (optionally) a filled-in - * context and a codecID + * context and a codecID. enum CodecID -gst_ffmpeg_caps_to_codecid (const GstCaps *caps, +gst_ffmpeg_caps_to_codecid (const GstCaps *caps, AVCodecContext *context); -/* caps_to_codectype () transforms a GstCaps that belongs to - * a pad for uncompressed data to a filled-in context + * caps_with_codecid () transforms a GstCaps for a known codec + * ID into a filled-in context. void -gst_ffmpeg_caps_to_codectype (enum CodecType type, - const GstCaps *caps, - AVCodecContext *context); +gst_ffmpeg_caps_with_codecid (enum CodecID codec_id, + enum CodecType codec_type, + const GstCaps *caps, + AVCodecContext *context); -/* _formatid_to_caps () is meant for muxers/demuxers, it + * caps_with_codectype () transforms a GstCaps that belongs to + * a pad for uncompressed data to a filled-in context. + */ +void +gst_ffmpeg_caps_with_codectype (enum CodecType type, + const GstCaps *caps, + AVCodecContext *context); + * _formatid_to_caps () is meant for muxers/demuxers, it * transforms a name (ffmpeg way of ID'ing these, why don't * they have unique numerical IDs?) to the corresponding * caps belonging to that mux-format Index: gstffmpegcolorspace.c RCS file: /home/cvs/gstreamer/gst-ffmpeg/ext/ffmpeg/gstffmpegcolorspace.c,v retrieving revision 1.15 retrieving revision 1.16 diff -u -d -r1.15 -r1.16 --- a/gstffmpegcolorspace.c 29 Mar 2004 16:39:18 -0000 1.15 +++ b/gstffmpegcolorspace.c 16 Apr 2004 01:28:36 -0000 1.16 @@ -195,7 +195,7 @@ ctx->width = width; ctx->height = height; ctx->pix_fmt = PIX_FMT_NB; - gst_ffmpeg_caps_to_codectype (CODEC_TYPE_VIDEO, caps, ctx); + gst_ffmpeg_caps_with_codectype (CODEC_TYPE_VIDEO, caps, ctx); if (ctx->pix_fmt == PIX_FMT_NB) { av_free (ctx); Index: gstffmpegdec.c RCS file: /home/cvs/gstreamer/gst-ffmpeg/ext/ffmpeg/gstffmpegdec.c,v retrieving revision 1.51 retrieving revision 1.52 diff -u -d -r1.51 -r1.52 --- a/gstffmpegdec.c 6 Apr 2004 18:25:55 -0000 1.51 +++ b/gstffmpegdec.c 16 Apr 2004 01:28:36 -0000 1.52 @@ -211,6 +211,43 @@ av_free (ffmpegdec->picture); } +static void +gst_ffmpegdec_close (GstFFMpegDec *ffmpegdec) +{ + if (!ffmpegdec->opened) + return; + avcodec_close (ffmpegdec->context); + ffmpegdec->opened = FALSE; + if (ffmpegdec->context->palctrl) { + av_free (ffmpegdec->context->palctrl); + ffmpegdec->context->palctrl = NULL; + } + if (ffmpegdec->context->extradata) { + av_free (ffmpegdec->context->extradata); + ffmpegdec->context->extradata = NULL; +} +static gboolean +gst_ffmpegdec_open (GstFFMpegDec *ffmpegdec) + GstFFMpegDecClass *oclass = + (GstFFMpegDecClass *) (G_OBJECT_GET_CLASS (ffmpegdec)); + ffmpegdec->opened = TRUE; + if (avcodec_open (ffmpegdec->context, oclass->in_plugin) < 0) { + gst_ffmpegdec_close (ffmpegdec); + GST_DEBUG ("ffdec_%s: Failed to open FFMPEG codec", + oclass->in_plugin->name); + return FALSE; + return TRUE; static GstPadLinkReturn gst_ffmpegdec_connect (GstPad * pad, const GstCaps * caps) { @@ -219,10 +256,7 @@ (GstFFMpegDecClass *) (G_OBJECT_GET_CLASS (ffmpegdec)); /* close old session */ - if (ffmpegdec->opened) { - avcodec_close (ffmpegdec->context); - ffmpegdec->opened = FALSE; - } + gst_ffmpegdec_close (ffmpegdec); /* set defaults */ avcodec_get_context_defaults (ffmpegdec->context); @@ -234,8 +268,8 @@ /* get size and so */ - gst_ffmpeg_caps_to_codectype (oclass->in_plugin->type, - caps, ffmpegdec->context); + gst_ffmpeg_caps_with_codecid (oclass->in_plugin->id, + oclass->in_plugin->type, caps, ffmpegdec->context); /* we dont send complete frames - FIXME: we need a 'framed' property * in caps */ @@ -250,17 +284,8 @@ /* open codec - we don't select an output pix_fmt yet, * simply because we don't know! We only get it * during playback... */ - if (avcodec_open (ffmpegdec->context, oclass->in_plugin) < 0) { - GST_DEBUG ("ffdec_%s: Failed to open FFMPEG codec", - oclass->in_plugin->name); - return GST_PAD_LINK_REFUSED; - /* done! */ - ffmpegdec->opened = TRUE; - return GST_PAD_LINK_OK; + return gst_ffmpegdec_open (ffmpegdec) ? + GST_PAD_LINK_OK : GST_PAD_LINK_REFUSED; #if 0 @@ -364,18 +389,40 @@ * errors inside. This drives me crazy, so we let it allocate * it's own buffers and copy to our own buffer afterwards... */ AVPicture pic; - gint size = avpicture_get_size (ffmpegdec->context->pix_fmt, + enum PixelFormat to_fmt = + (ffmpegdec->context->pix_fmt == PIX_FMT_PAL8) ? + PIX_FMT_RGBA32 : ffmpegdec->context->pix_fmt; + gint size = avpicture_get_size (to_fmt, ffmpegdec->context->width, ffmpegdec->context->height); outbuf = gst_buffer_new_and_alloc (size); - avpicture_fill (&pic, GST_BUFFER_DATA (outbuf), - ffmpegdec->context->pix_fmt, - ffmpegdec->context->width, ffmpegdec->context->height); - img_convert (&pic, ffmpegdec->context->pix_fmt, - (AVPicture *) ffmpegdec->picture, + avpicture_fill (&pic, GST_BUFFER_DATA (outbuf), to_fmt, ffmpegdec->context->width, ffmpegdec->context->height); + if (to_fmt == ffmpegdec->context->pix_fmt) { + img_convert (&pic, ffmpegdec->context->pix_fmt, + (AVPicture *) ffmpegdec->picture, + ffmpegdec->context->pix_fmt, + ffmpegdec->context->width, ffmpegdec->context->height); + } else { + /* manual conversion from palette to RGBA32 */ + gint x, y, pix, ws = ffmpegdec->picture->linesize[0], + wd = ffmpegdec->context->width; + guint8 *dest = GST_BUFFER_DATA (outbuf); + guint32 conv; + AVPaletteControl *pal = ffmpegdec->context->palctrl; + for (y = 0; y < ffmpegdec->context->height; y++) { + for (x = 0; x < ffmpegdec->context->width; x++) { + pix = ffmpegdec->picture->data[0][y * ws + x]; + conv = pal->palette[pix]; + dest[(y * wd + x) * 4] = ((guint8 *) &conv)[0]; + dest[(y * wd + x) * 4 + 1] = ((guint8 *) &conv)[1]; + dest[(y * wd + x) * 4 + 2] = ((guint8 *) &conv)[2]; + dest[(y * wd + x) * 4 + 3] = ((guint8 *) &conv)[3]; + } + } + } /* this isn't necessarily true, but it's better than nothing */ GST_BUFFER_DURATION (outbuf) = GST_BUFFER_DURATION (inbuf); @@ -409,9 +456,13 @@ if (have_data) { if (!GST_PAD_CAPS (ffmpegdec->srcpad)) { GstCaps *caps; + enum PixelFormat orig_fmt = ffmpegdec->context->pix_fmt; + ffmpegdec->context->pix_fmt = (orig_fmt == PIX_FMT_PAL8) ? + PIX_FMT_RGBA32 : orig_fmt; caps = gst_ffmpeg_codectype_to_caps (oclass->in_plugin->type, ffmpegdec->context); + ffmpegdec->context->pix_fmt = orig_fmt; if (caps == NULL || !gst_pad_set_explicit_caps (ffmpegdec->srcpad, caps)) { GST_ELEMENT_ERROR (ffmpegdec, CORE, NEGOTIATION, (NULL), @@ -441,10 +492,7 @@ switch (transition) { case GST_STATE_PAUSED_TO_READY: - if (ffmpegdec->opened) { - avcodec_close (ffmpegdec->context); - ffmpegdec->opened = FALSE; - } + gst_ffmpegdec_close (ffmpegdec); break; Index: gstffmpegenc.c RCS file: /home/cvs/gstreamer/gst-ffmpeg/ext/ffmpeg/gstffmpegenc.c,v retrieving revision 1.45 diff -u -d -r1.44 -r1.45 --- a/gstffmpegenc.c 29 Mar 2004 16:39:18 -0000 1.44 +++ b/gstffmpegenc.c 16 Apr 2004 01:28:36 -0000 1.45 @@ -316,7 +316,7 @@ ffmpegenc->context->flags |= CODEC_FLAG_EMU_EDGE; /* fetch pix_fmt and so on */ + gst_ffmpeg_caps_with_codectype (oclass->in_plugin->type, caps, ffmpegenc->context); pix_fmt = ffmpegenc->context->pix_fmt; |
From: Ronald S. B. <rb...@pd...> - 2004-04-16 02:06:36
|
CVS Root: /home/cvs/gstreamer Module: gst-ffmpeg Changes by: rbultje Date: Thu Apr 15 2004 19:06:35 PDT Log message: * ext/ffmpeg/gstffmpegcolorspace.c: (gst_ffmpegcsp_chain): NULL -> (NULL) inside GST_ELEMENT_ERROR(). Modified files: . : ChangeLog ext/ffmpeg : gstffmpegcolorspace.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-ffmpeg/ChangeLog.diff?r1=1.44&r2=1.45 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-ffmpeg/ext/ffmpeg/gstffmpegcolorspace.c.diff?r1=1.16&r2=1.17 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /home/cvs/gstreamer/gst-ffmpeg/ChangeLog,v retrieving revision 1.44 retrieving revision 1.45 diff -u -d -r1.44 -r1.45 --- a/ChangeLog 16 Apr 2004 01:28:35 -0000 1.44 +++ b/ChangeLog 16 Apr 2004 02:06:23 -0000 1.45 @@ -1,5 +1,10 @@ 2004-04-15 Ronald Bultje <rb...@ro...> + * ext/ffmpeg/gstffmpegcolorspace.c: (gst_ffmpegcsp_chain): + NULL -> (NULL) inside GST_ELEMENT_ERROR(). + +2004-04-15 Ronald Bultje <rb...@ro...> * ext/ffmpeg/gstffmpegcodecmap.c: (gst_ffmpeg_get_palette), (gst_ffmpeg_set_palette), (gst_ffmpeg_codecid_to_caps), (gst_ffmpeg_pixfmt_to_caps), (gst_ffmpeg_caps_to_smpfmt), Index: gstffmpegcolorspace.c RCS file: /home/cvs/gstreamer/gst-ffmpeg/ext/ffmpeg/gstffmpegcolorspace.c,v retrieving revision 1.16 retrieving revision 1.17 diff -u -d -r1.16 -r1.17 --- a/gstffmpegcolorspace.c 16 Apr 2004 01:28:36 -0000 1.16 +++ b/gstffmpegcolorspace.c 16 Apr 2004 02:06:23 -0000 1.17 @@ -331,7 +331,7 @@ g_return_if_fail (GST_IS_FFMPEGCSP (space)); if (space->from_pixfmt == PIX_FMT_NB || space->to_pixfmt == PIX_FMT_NB) { - GST_ELEMENT_ERROR (space, CORE, NOT_IMPLEMENTED, NULL, + GST_ELEMENT_ERROR (space, CORE, NOT_IMPLEMENTED, (NULL), ("attempting to convert colorspaces between unknown formats")); gst_buffer_unref (inbuf); return; |
From: Ronald S. B. <rb...@pd...> - 2004-04-23 00:49:26
|
CVS Root: /home/cvs/gstreamer Module: gst-ffmpeg Changes by: rbultje Date: Thu Apr 22 2004 17:49:22 PDT Log message: * ext/ffmpeg/gstffmpegcodecmap.c: (gst_ffmpeg_codecid_to_caps), (gst_ffmpeg_caps_with_codecid), (gst_ffmpeg_caps_to_codecid): WAV/IMA-ADPCM -> DVI ADPCM. Modified files: . : ChangeLog ext/ffmpeg : gstffmpegcodecmap.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-ffmpeg/ChangeLog.diff?r1=1.47&r2=1.48 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-ffmpeg/ext/ffmpeg/gstffmpegcodecmap.c.diff?r1=1.49&r2=1.50 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /home/cvs/gstreamer/gst-ffmpeg/ChangeLog,v retrieving revision 1.47 retrieving revision 1.48 diff -u -d -r1.47 -r1.48 --- a/ChangeLog 22 Apr 2004 03:43:58 -0000 1.47 +++ b/ChangeLog 23 Apr 2004 00:49:10 -0000 1.48 @@ -1,3 +1,9 @@ +2004-04-22 Ronald Bultje <rb...@ro...> + + * ext/ffmpeg/gstffmpegcodecmap.c: (gst_ffmpeg_codecid_to_caps), + (gst_ffmpeg_caps_with_codecid), (gst_ffmpeg_caps_to_codecid): + WAV/IMA-ADPCM -> DVI ADPCM. 2004-04-22 Benjamin Otte <ot...@gn...> * ext/ffmpeg/gstffmpegcolorspace.c: Index: gstffmpegcodecmap.c RCS file: /home/cvs/gstreamer/gst-ffmpeg/ext/ffmpeg/gstffmpegcodecmap.c,v retrieving revision 1.49 retrieving revision 1.50 diff -u -d -r1.49 -r1.50 --- a/gstffmpegcodecmap.c 16 Apr 2004 01:28:36 -0000 1.49 +++ b/gstffmpegcodecmap.c 23 Apr 2004 00:49:10 -0000 1.50 @@ -240,10 +240,24 @@ if (encode) { /* I'm not exactly sure what ffmpeg outputs... ffmpeg itself uses * the AVI fourcc 'DIVX', but 'mp4v' for Quicktime... */ - /* FIXME: bitrate */ - caps = GST_FF_VID_CAPS_NEW ("video/mpeg", - "systemstream", G_TYPE_BOOLEAN, FALSE, - "mpegversion", G_TYPE_INT, 4, NULL); + guint32 fourcc = 0; + if (context) + fourcc = context->codec_tag; + switch (fourcc) { + case GST_MAKE_FOURCC ('D', 'I', 'V', 'X'): + caps = GST_FF_VID_CAPS_NEW ("video/x-divx", + "divxversion", G_TYPE_INT, 5, NULL); + break; + case GST_MAKE_FOURCC ('m', 'p', '4', 'v'): + default: + /* FIXME: bitrate */ + caps = GST_FF_VID_CAPS_NEW ("video/mpeg", + "systemstream", G_TYPE_BOOLEAN, FALSE, + "mpegversion", G_TYPE_INT, 4, NULL); + } } else { /* The trick here is to separate xvid, divx, mpeg4, 3ivx et al */ caps = GST_FF_VID_CAPS_NEW ("video/mpeg", @@ -523,7 +537,7 @@ layout = "quicktime"; break; case CODEC_ID_ADPCM_IMA_WAV: - layout = "wav"; + layout = "dvi"; case CODEC_ID_ADPCM_IMA_DK3: layout = "dk3"; @@ -1057,9 +1071,19 @@ else if (!strcmp (mime, "video/x-3ivx")) context->codec_tag = GST_MAKE_FOURCC ('3', 'I', 'V', '1'); else if (!strcmp (mime, "video/mpeg")) { + const GValue *value; + const GstBuffer *buf; context->codec_tag = GST_MAKE_FOURCC ('m', 'p', '4', 'v'); - /* FIXME: esds atom parsing */ + /* esds atom parsing */ + if ((value = gst_structure_get_value (str, "codec_data"))) { + buf = g_value_get_boxed (value); + context->extradata = av_mallocz (GST_BUFFER_SIZE (buf)); + memcpy (context->extradata, GST_BUFFER_DATA (buf), + GST_BUFFER_SIZE (buf)); + context->extradata_size = GST_BUFFER_SIZE (buf); + } } } while (0); break; @@ -1142,6 +1166,9 @@ gst_ffmpeg_get_palette (caps, context); + default: + break; } /* common properties (width, height, fps) */ @@ -1482,7 +1509,7 @@ id = CODEC_ID_ADPCM_IMA_QT; } else if (!strcmp (layout, "microsoft")) { id = CODEC_ID_ADPCM_MS; - } else if (!strcmp (layout, "wav")) { + } else if (!strcmp (layout, "dvi")) { id = CODEC_ID_ADPCM_IMA_WAV; } else if (!strcmp (layout, "4xm")) { id = CODEC_ID_ADPCM_4XM; |
From: Ronald S. B. <rb...@pd...> - 2004-05-14 14:11:14
|
CVS Root: /home/cvs/gstreamer Module: gst-ffmpeg Changes by: rbultje Date: Fri May 14 2004 07:11:12 PDT Log message: * ext/ffmpeg/gstffmpegdemux.c: (gst_ffmpegdemux_src_event), (gst_ffmpegdemux_src_query), (gst_ffmpegdemux_src_convert), (gst_ffmpegdemux_open), (gst_ffmpegdemux_loop): * ext/ffmpeg/gstffmpegprotocol.c: (gst_ffmpegdata_open), (gst_ffmpegdata_read), (gst_ffmpegdata_write), (gst_ffmpegdata_seek): Fix up demuxer. Works now for all my files that I tried, even quicktime. I basically hack around the super-oversimplistic file I/O handling in ffmpeg in several ways together, and I also hack around the fairly annoying EOS-will-pause-the-source-element in GStreamer itself. This code is not pretty. Modified files: . : ChangeLog ext/ffmpeg : gstffmpegdemux.c gstffmpegprotocol.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-ffmpeg/ChangeLog.diff?r1=1.54&r2=1.55 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-ffmpeg/ext/ffmpeg/gstffmpegdemux.c.diff?r1=1.30&r2=1.31 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-ffmpeg/ext/ffmpeg/gstffmpegprotocol.c.diff?r1=1.12&r2=1.13 ====Begin Diffs==== Index: gstffmpegdemux.c =================================================================== RCS file: /home/cvs/gstreamer/gst-ffmpeg/ext/ffmpeg/gstffmpegdemux.c,v retrieving revision 1.30 retrieving revision 1.31 diff -u -d -r1.30 -r1.31 --- a/gstffmpegdemux.c 19 Apr 2004 02:08:23 -0000 1.30 +++ b/gstffmpegdemux.c 14 May 2004 14:11:00 -0000 1.31 @@ -288,7 +288,7 @@ gint64 offset; if (!stream) - return; + return FALSE; switch (GST_EVENT_TYPE (event)) { case GST_EVENT_SEEK: @@ -358,7 +358,6 @@ GstFFMpegDemux *demux = (GstFFMpegDemux *) gst_pad_get_parent (pad); AVStream *stream = gst_ffmpegdemux_stream_from_pad (pad); gboolean res = TRUE; - gint n; if (!stream || (*fmt == GST_FORMAT_DEFAULT && stream->codec.codec_type != CODEC_TYPE_VIDEO)) @@ -407,7 +406,7 @@ GstFormat src_fmt, gint64 src_value, GstFormat * dest_fmt, gint64 * dest_value) { - GstFFMpegDemux *demux = (GstFFMpegDemux *) gst_pad_get_parent (pad); + /*GstFFMpegDemux *demux = (GstFFMpegDemux *) gst_pad_get_parent (pad);*/ @@ -513,6 +512,8 @@ location = g_strdup_printf ("gstreamer://%p", demux->sinkpad); res = av_open_input_file (&demux->context, location, oclass->in_plugin, 0, NULL); + if (res >= 0) + res = av_find_stream_info (demux->context); g_free (location); if (res < 0) { GST_ELEMENT_ERROR (demux, LIBRARY, FAILED, (NULL), @@ -574,13 +575,34 @@ /* read a package */ res = av_read_packet (demux->context, &pkt); +#if 0 + /* This doesn't work - FIXME */ if (url_feof (&demux->context->pb)) { - gst_pad_event_default (demux->sinkpad, gst_event_new (GST_EVENT_EOS)); gst_ffmpegdemux_close (demux); + gst_pad_event_default (demux->sinkpad, gst_event_new (GST_EVENT_EOS)); } else { GST_ELEMENT_ERROR (demux, LIBRARY, FAILED, (NULL), (gst_ffmpegdemux_averror (res))); } +#endif + + /* so, we do it the hacky way. */ + GstData *data = NULL; + do { + data = gst_pad_pull (demux->sinkpad); + if (!GST_IS_EVENT (data) || + GST_EVENT_TYPE (GST_EVENT (data)) != GST_EVENT_EOS) { + gst_data_unref (data); + data = NULL; + continue; + } + } while (!data); + gst_ffmpegdemux_close (demux); + gst_pad_event_default (demux->sinkpad, GST_EVENT (data)); return; } Index: gstffmpegprotocol.c RCS file: /home/cvs/gstreamer/gst-ffmpeg/ext/ffmpeg/gstffmpegprotocol.c,v retrieving revision 1.12 retrieving revision 1.13 diff -u -d -r1.12 -r1.13 --- a/gstffmpegprotocol.c 29 Mar 2004 16:39:18 -0000 1.12 +++ b/gstffmpegprotocol.c 14 May 2004 14:11:00 -0000 1.13 @@ -81,6 +81,9 @@ info->pad = pad; h->priv_data = (void *) info; + h->is_streamed = FALSE; + h->flags = 0; + h->max_packet_size = 0; return 0; } @@ -104,15 +107,18 @@ do { /* prevent EOS */ - if (gst_bytestream_tell (bs) + size > gst_bytestream_length (bs)) - request = gst_bytestream_length (bs) - gst_bytestream_tell (bs); - else + if (gst_bytestream_tell (bs) + size > gst_bytestream_length (bs)) { + request = (int) (gst_bytestream_length (bs) - gst_bytestream_tell (bs)); + info->eos = TRUE; + } else { request = size; + } - if (request) + if (request > 0) { total = gst_bytestream_peek_bytes (bs, &data, request); total = 0; if (total < request) { GstEvent *event; @@ -131,6 +137,7 @@ gst_event_unref (event); break; case GST_EVENT_EOS: + g_warning ("Unexpected/unwanted eos in data function"); info->eos = TRUE; @@ -142,7 +149,7 @@ } while (!info->eos && total != request); memcpy (buf, data, total); - gst_bytestream_flush (bs, total); + gst_bytestream_flush_fast (bs, total); return total; @@ -164,7 +171,7 @@ gst_pad_push (info->pad, GST_DATA (outbuf)); - return 0; + return size; static offset_t @@ -172,9 +179,19 @@ GstSeekType seek_type = 0; GstProtocolInfo *info; + guint64 newpos; info = (GstProtocolInfo *) h->priv_data; + /* hack in ffmpeg to get filesize... */ + if (whence == SEEK_END && pos == -1) + return gst_bytestream_length (info->bs) - 1; + /* another hack to get the current position... */ + else if (whence == SEEK_CUR && pos == 0) + return gst_bytestream_tell (info->bs); + else + g_assert (pos >= 0); switch (whence) { case SEEK_SET: seek_type = GST_SEEK_METHOD_SET; @@ -191,12 +208,57 @@ switch (info->flags) { - case URL_RDONLY: + case URL_RDONLY: { + GstEvent *event; + guint8 *data; + guint32 remaining; + /* handle discont */ gst_bytestream_seek (info->bs, pos, seek_type); + /* prevent eos */ + if (gst_bytestream_tell (info->bs) == + gst_bytestream_length (info->bs)) { + info->eos = TRUE; + break; + info->eos = FALSE; + while (gst_bytestream_peek_bytes (info->bs, &data, 1) == 0) { + gst_bytestream_get_status (info->bs, &remaining, &event); + if (!event) { + g_warning ("no data, no event - panic!"); + return -1; + } + switch (GST_EVENT_TYPE (event)) { + case GST_EVENT_EOS: + g_warning ("unexpected/unwanted EOS event after seek"); + info->eos = TRUE; + gst_event_unref (event); + break; + case GST_EVENT_DISCONTINUOUS: + gst_bytestream_flush_fast (info->bs, remaining); + gst_event_unref (event); /* we expect this */ + default: + gst_pad_event_default (info->pad, event); + newpos = gst_bytestream_tell (info->bs); break; case URL_WRONLY: gst_pad_push (info->pad, GST_DATA (gst_event_new_seek (seek_type, pos))); + /* this is screwy because there might be queues or scheduler-queued + * buffers... Argh! */ + if (whence == SEEK_SET) { + newpos = pos; + } else { + g_warning ("Writer reposition: implement me\n"); + newpos = 0; default: @@ -204,7 +266,7 @@ + return newpos; static int Index: ChangeLog RCS file: /home/cvs/gstreamer/gst-ffmpeg/ChangeLog,v retrieving revision 1.54 retrieving revision 1.55 diff -u -d -r1.54 -r1.55 --- a/ChangeLog 11 May 2004 16:07:14 -0000 1.54 +++ b/ChangeLog 14 May 2004 14:11:00 -0000 1.55 @@ -1,3 +1,18 @@ +2004-05-14 Ronald Bultje <rb...@ro...> + * ext/ffmpeg/gstffmpegdemux.c: (gst_ffmpegdemux_src_event), + (gst_ffmpegdemux_src_query), (gst_ffmpegdemux_src_convert), + (gst_ffmpegdemux_open), (gst_ffmpegdemux_loop): + * ext/ffmpeg/gstffmpegprotocol.c: (gst_ffmpegdata_open), + (gst_ffmpegdata_read), (gst_ffmpegdata_write), + (gst_ffmpegdata_seek): + Fix up demuxer. Works now for all my files that I tried, even + quicktime. I basically hack around the super-oversimplistic file + I/O handling in ffmpeg in several ways together, and I also hack + around the fairly annoying EOS-will-pause-the-source-element in + GStreamer itself. + This code is not pretty. 2004-05-11 Jeremy Simon <je...@li...> * ext/ffmpeg/gstffmpegcodecmap.c: (gst_ffmpeg_codecid_to_caps), |
From: Ronald S. B. <rb...@pd...> - 2004-06-07 02:29:54
|
CVS Root: /home/cvs/gstreamer Module: gst-ffmpeg Changes by: rbultje Date: Mon Jun 07 2004 12:29:53 EST Log message: * ext/ffmpeg/gstffmpeg.c: (plugin_init): Remove redundant calls which are called internally already. * ext/ffmpeg/gstffmpegcodecmap.c: (gst_ffmpeg_caps_with_codecid): Indenting... * ext/ffmpeg/gstffmpegdemux.c: (gst_ffmpegdemux_loop), (gst_ffmpegdemux_register): Remove typefind functions and rank for demuxers for any demuxer that we already have in GStreamer. Modified files: . : ChangeLog ext/ffmpeg : gstffmpeg.c gstffmpegcodecmap.c gstffmpegdemux.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-ffmpeg/ChangeLog.diff?r1=1.58&r2=1.59 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-ffmpeg/ext/ffmpeg/gstffmpeg.c.diff?r1=1.18&r2=1.19 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-ffmpeg/ext/ffmpeg/gstffmpegcodecmap.c.diff?r1=1.54&r2=1.55 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-ffmpeg/ext/ffmpeg/gstffmpegdemux.c.diff?r1=1.31&r2=1.32 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /home/cvs/gstreamer/gst-ffmpeg/ChangeLog,v retrieving revision 1.58 retrieving revision 1.59 diff -u -d -r1.58 -r1.59 --- a/ChangeLog 18 May 2004 01:15:36 -0000 1.58 +++ b/ChangeLog 7 Jun 2004 02:29:41 -0000 1.59 @@ -1,3 +1,14 @@ +2004-06-06 Ronald Bultje <rb...@ro...> + + * ext/ffmpeg/gstffmpeg.c: (plugin_init): + Remove redundant calls which are called internally already. + * ext/ffmpeg/gstffmpegcodecmap.c: (gst_ffmpeg_caps_with_codecid): + Indenting... + * ext/ffmpeg/gstffmpegdemux.c: (gst_ffmpegdemux_loop), + (gst_ffmpegdemux_register): + Remove typefind functions and rank for demuxers for any demuxer + that we already have in GStreamer. 2004-05-18 Benjamin Otte <in...@pu...> * ext/ffmpeg/gstffmpegcodecmap.c: (gst_ffmpeg_caps_with_codecid): Index: gstffmpeg.c RCS file: /home/cvs/gstreamer/gst-ffmpeg/ext/ffmpeg/gstffmpeg.c,v retrieving revision 1.18 retrieving revision 1.19 diff -u -d -r1.18 -r1.19 --- a/gstffmpeg.c 29 Mar 2004 16:39:18 -0000 1.18 +++ b/gstffmpeg.c 7 Jun 2004 02:29:41 -0000 1.19 @@ -47,8 +47,6 @@ if (!gst_library_load ("gstbytestream")) return FALSE; - avcodec_init (); - avcodec_register_all (); av_register_all (); gst_ffmpegenc_register (plugin); Index: gstffmpegcodecmap.c RCS file: /home/cvs/gstreamer/gst-ffmpeg/ext/ffmpeg/gstffmpegcodecmap.c,v retrieving revision 1.54 retrieving revision 1.55 diff -u -d -r1.54 -r1.55 --- a/gstffmpegcodecmap.c 18 May 2004 01:15:36 -0000 1.54 +++ b/gstffmpegcodecmap.c 7 Jun 2004 02:29:41 -0000 1.55 @@ -1151,8 +1151,7 @@ if ((value = gst_structure_get_value (str, "codec_data"))) { buf = g_value_get_boxed (value); - if (GST_BUFFER_SIZE (buf) != 0) - { + if (GST_BUFFER_SIZE (buf) != 0) { context->extradata = av_mallocz (GST_BUFFER_SIZE (buf)); memcpy (context->extradata, GST_BUFFER_DATA (buf), GST_BUFFER_SIZE (buf)); Index: gstffmpegdemux.c RCS file: /home/cvs/gstreamer/gst-ffmpeg/ext/ffmpeg/gstffmpegdemux.c,v retrieving revision 1.31 retrieving revision 1.32 diff -u -d -r1.31 -r1.32 --- a/gstffmpegdemux.c 14 May 2004 14:11:00 -0000 1.31 +++ b/gstffmpegdemux.c 7 Jun 2004 02:29:41 -0000 1.32 @@ -596,7 +596,6 @@ GST_EVENT_TYPE (GST_EVENT (data)) != GST_EVENT_EOS) { gst_data_unref (data); data = NULL; - continue; } } while (!data); @@ -683,6 +682,7 @@ gchar *type_name, *typefind_name; gchar *p, *name = NULL; GstCaps *sinkcaps, *audiosrccaps, *videosrccaps; + gint rank = GST_RANK_MARGINAL; /* no emulators */ if (!strncmp (in_plugin->long_name, "raw ", 4) || @@ -693,6 +693,18 @@ !strcmp (in_plugin->name, "mjpeg")) goto next; + if (!strcmp (in_plugin->name, "mov,mp4,m4a,3gp") || + !strcmp (in_plugin->name, "avi") || + !strcmp (in_plugin->name, "asf") || + !strcmp (in_plugin->name, "mpegvideo") || + !strcmp (in_plugin->name, "mp3") || + !strcmp (in_plugin->name, "matroska") || + !strcmp (in_plugin->name, "mpeg") || + !strcmp (in_plugin->name, "wav") || + !strcmp (in_plugin->name, "au") || + !strcmp (in_plugin->name, "rm")) + rank = GST_RANK_NONE; p = name = g_strdup (in_plugin->name); while (*p) { if (*p == '.' || *p == ',') @@ -763,9 +775,10 @@ else extensions = NULL; - if (!gst_element_register (plugin, type_name, GST_RANK_MARGINAL, type) || - !gst_type_find_register (plugin, typefind_name, GST_RANK_MARGINAL, - gst_ffmpegdemux_type_find, extensions, sinkcaps, params)) { + if (!gst_element_register (plugin, type_name, rank, type) || + (rank != GST_RANK_NONE && + !gst_type_find_register (plugin, typefind_name, rank, + gst_ffmpegdemux_type_find, extensions, sinkcaps, params))) { g_warning ("Register of type ffdemux_%s failed", name); g_free (type_name); g_free (typefind_name); |
From: Ronald S. B. <rb...@pd...> - 2004-06-14 01:21:15
|
CVS Root: /home/cvs/gstreamer Module: gst-ffmpeg Changes by: rbultje Date: Sun Jun 13 2004 18:21:13 PDT Log message: * ext/ffmpeg/gstffmpegcodecmap.c: (gst_ffmpeg_codecid_to_caps), (gst_ffmpeg_caps_to_codecid): * ext/ffmpeg/gstffmpegprotocol.c: (gst_ffmpegdata_read): Do some more random property setting. Fix for if there's less than ffmpeg-default-buffersize (32kB) data in a file _and_ there's an event pending. Partially fixes #142320. Modified files: . : ChangeLog ext/ffmpeg : gstffmpegcodecmap.c gstffmpegprotocol.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-ffmpeg/ChangeLog.diff?r1=1.59&r2=1.60 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-ffmpeg/ext/ffmpeg/gstffmpegcodecmap.c.diff?r1=1.55&r2=1.56 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-ffmpeg/ext/ffmpeg/gstffmpegprotocol.c.diff?r1=1.13&r2=1.14 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /home/cvs/gstreamer/gst-ffmpeg/ChangeLog,v retrieving revision 1.59 retrieving revision 1.60 diff -u -d -r1.59 -r1.60 --- ChangeLog 7 Jun 2004 02:29:41 -0000 1.59 +++ ChangeLog 14 Jun 2004 01:21:01 -0000 1.60 @@ -1,3 +1,12 @@ +2004-06-13 Ronald Bultje <rb...@ro...> + + * ext/ffmpeg/gstffmpegcodecmap.c: (gst_ffmpeg_codecid_to_caps), + (gst_ffmpeg_caps_to_codecid): + * ext/ffmpeg/gstffmpegprotocol.c: (gst_ffmpegdata_read): + Do some more random property setting. Fix for if there's less than + ffmpeg-default-buffersize (32kB) data in a file _and_ there's an + event pending. Partially fixes #142320. 2004-06-06 Ronald Bultje <rb...@ro...> * ext/ffmpeg/gstffmpeg.c: (plugin_init): Index: gstffmpegcodecmap.c RCS file: /home/cvs/gstreamer/gst-ffmpeg/ext/ffmpeg/gstffmpegcodecmap.c,v retrieving revision 1.55 retrieving revision 1.56 diff -u -d -r1.55 -r1.56 --- gstffmpegcodecmap.c 7 Jun 2004 02:29:41 -0000 1.55 +++ gstffmpegcodecmap.c 14 Jun 2004 01:21:01 -0000 1.56 @@ -681,11 +681,24 @@ case CODEC_TYPE_AUDIO: mime = g_strdup_printf ("audio/x-gst_ff-%s", codec->name); caps = GST_FF_AUD_CAPS_NEW (mime, NULL); + if (context) + gst_caps_set (caps, "block_align", context->block_align, + "bitrate", context->bit_rate, NULL); g_free (mime); break; default: } + /* set private data */ + if (context && context->extradata_size > 0) { + GstBuffer *data = gst_buffer_new_and_alloc (context->extradata_size); + memcpy (GST_BUFFER_DATA (data), context->extradata, + context->extradata_size); + gst_caps_set_simple (caps, + "gst_ff_extradata", GST_TYPE_BUFFER, data, NULL); + } } } @@ -1614,11 +1627,26 @@ sscanf (mimetype, "%*s/x-gst_ff-%s", ext) == 1) { if ((codec = avcodec_find_decoder_by_name (ext)) || (codec = avcodec_find_encoder_by_name (ext))) { + const GValue *data_v; + const GstBuffer *data; id = codec->id; if (mimetype[0] == 'v') video = TRUE; else if (mimetype[0] == 'a') audio = TRUE; + /* extradata */ + if ((data_v = gst_structure_get_value (structure, + "gst_ff_extradata")) && context) { + data = g_value_get_boxed (data_v); + if (context->extradata) + av_free (context->extradata); + context->extradata = av_malloc (GST_BUFFER_SIZE (data)); + memcpy (context->extradata, GST_BUFFER_DATA (data), + GST_BUFFER_SIZE (data)); + context->extradata_size = GST_BUFFER_SIZE (data); + } Index: gstffmpegprotocol.c RCS file: /home/cvs/gstreamer/gst-ffmpeg/ext/ffmpeg/gstffmpegprotocol.c,v retrieving revision 1.13 retrieving revision 1.14 diff -u -d -r1.13 -r1.14 --- gstffmpegprotocol.c 14 May 2004 14:11:00 -0000 1.13 +++ gstffmpegprotocol.c 14 Jun 2004 01:21:01 -0000 1.14 @@ -95,6 +95,7 @@ guint32 total, request; guint8 *data; GstProtocolInfo *info; + gboolean have_event; info = (GstProtocolInfo *) h->priv_data; @@ -106,6 +107,8 @@ return 0; do { + have_event = FALSE; /* prevent EOS */ if (gst_bytestream_tell (bs) + size > gst_bytestream_length (bs)) { request = (int) (gst_bytestream_length (bs) - gst_bytestream_tell (bs)); @@ -130,7 +133,7 @@ g_warning ("gstffmpegprotocol: no bytestream event"); return total; - + have_event = TRUE; switch (GST_EVENT_TYPE (event)) { case GST_EVENT_DISCONTINUOUS: gst_bytestream_flush_fast (bs, remaining); @@ -139,6 +142,7 @@ case GST_EVENT_EOS: g_warning ("Unexpected/unwanted eos in data function"); info->eos = TRUE; + have_event = FALSE; gst_event_unref (event); @@ -146,7 +150,7 @@ - } while (!info->eos && total != request); + } while ((!info->eos && total != request) || have_event); memcpy (buf, data, total); gst_bytestream_flush_fast (bs, total); |
From: <rb...@fr...> - 2004-09-20 13:10:19
|
CVS Root: /home/cvs/gstreamer Module: gst-ffmpeg Changes by: rbultje Date: Mon Sep 20 2004 05:29:16 PDT Log message: * ext/ffmpeg/gstffmpegcodecmap.c: (gst_ffmpeg_codecid_to_caps), (gst_ffmpeg_caps_with_codecid): WMV extradata (make #152798 work). J-frames are only available in the bitstream if the J-frame bit has been set in the extradata. If not (or if extradata is not provided), the movie won't play. * ext/ffmpeg/gstffmpegdec.c: (gst_ffmpegdec_close), (gst_ffmpegdec_connect), (gst_ffmpegdec_chain): Only close ffmpeg if privdata was allocated (else it segfaults). Autodetect encoding bugs and workaround it. Don't copy data if decoding failed. * ext/ffmpeg/gstffmpegdemux.c: (gst_ffmpegdemux_loop): Use read_frame() instead of read_packet() which is obsolete. Modified files: . : ChangeLog ext/ffmpeg : gstffmpegcodecmap.c gstffmpegdec.c gstffmpegdemux.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-ffmpeg/ChangeLog.diff?r1=1.69&r2=1.70 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-ffmpeg/ext/ffmpeg/gstffmpegcodecmap.c.diff?r1=1.57&r2=1.58 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-ffmpeg/ext/ffmpeg/gstffmpegdec.c.diff?r1=1.59&r2=1.60 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-ffmpeg/ext/ffmpeg/gstffmpegdemux.c.diff?r1=1.32&r2=1.33 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /home/cvs/gstreamer/gst-ffmpeg/ChangeLog,v retrieving revision 1.69 retrieving revision 1.70 diff -u -d -r1.69 -r1.70 --- ChangeLog 16 Sep 2004 21:14:46 -0000 1.69 +++ ChangeLog 20 Sep 2004 12:29:03 -0000 1.70 @@ -1,3 +1,18 @@ +2004-09-20 Ronald S. Bultje <rb...@ro...> + + * ext/ffmpeg/gstffmpegcodecmap.c: (gst_ffmpeg_codecid_to_caps), + (gst_ffmpeg_caps_with_codecid): + WMV extradata (make #152798 work). J-frames are only available + in the bitstream if the J-frame bit has been set in the extradata. + If not (or if extradata is not provided), the movie won't play. + * ext/ffmpeg/gstffmpegdec.c: (gst_ffmpegdec_close), + (gst_ffmpegdec_connect), (gst_ffmpegdec_chain): + Only close ffmpeg if privdata was allocated (else it segfaults). + Autodetect encoding bugs and workaround it. Don't copy data if + decoding failed. + * ext/ffmpeg/gstffmpegdemux.c: (gst_ffmpegdemux_loop): + Use read_frame() instead of read_packet() which is obsolete. 2004-09-16 Iain <iai...@gm...> * ext/ffmpeg/gstffmpegmux.c (gst_ffmpegmux_register): Free name fix Index: gstffmpegcodecmap.c RCS file: /home/cvs/gstreamer/gst-ffmpeg/ext/ffmpeg/gstffmpegcodecmap.c,v retrieving revision 1.57 retrieving revision 1.58 diff -u -d -r1.57 -r1.58 --- gstffmpegcodecmap.c 14 Jun 2004 01:26:15 -0000 1.57 +++ gstffmpegcodecmap.c 20 Sep 2004 12:29:03 -0000 1.58 @@ -295,7 +295,7 @@ do { gint version = (codec_id == CODEC_ID_WMV1) ? 1 : 2; - if (context) + if (context && context->extradata_size) { GstBuffer *buffer; @@ -343,7 +343,7 @@ gint version = (codec_id == CODEC_ID_WMAV1) ? 1 : 2; @@ -355,9 +355,7 @@ "codec_data", GST_TYPE_BUFFER, buffer, "block_align", G_TYPE_INT, context->block_align, "bitrate", G_TYPE_INT, context->bit_rate, NULL); - } - else - { + } else { caps = GST_FF_AUD_CAPS_NEW ("audio/x-wma", "wmaversion", G_TYPE_INT, version, "block_align", GST_TYPE_INT_RANGE, 0, G_MAXINT, @@ -1167,6 +1165,8 @@ case CODEC_ID_WMAV1: case CODEC_ID_WMAV2: + case CODEC_ID_WMV1: + case CODEC_ID_WMV2: const GValue *value; const GstBuffer *buf; Index: gstffmpegdec.c RCS file: /home/cvs/gstreamer/gst-ffmpeg/ext/ffmpeg/gstffmpegdec.c,v retrieving revision 1.59 retrieving revision 1.60 diff -u -d -r1.59 -r1.60 --- gstffmpegdec.c 21 Jul 2004 09:20:55 -0000 1.59 +++ gstffmpegdec.c 20 Sep 2004 12:29:03 -0000 1.60 @@ -219,7 +219,8 @@ if (!ffmpegdec->opened) return; - avcodec_close (ffmpegdec->context); + if (ffmpegdec->context->priv_data) + avcodec_close (ffmpegdec->context); ffmpegdec->opened = FALSE; if (ffmpegdec->context->palctrl) { @@ -294,6 +295,9 @@ /* do *not* draw edges */ ffmpegdec->context->flags |= CODEC_FLAG_EMU_EDGE; + /* workaround encoder bugs */ + ffmpegdec->context->workaround_bugs |= FF_BUG_AUTODETECT; /* open codec - we don't select an output pix_fmt yet, * simply because we don't know! We only get it * during playback... */ @@ -395,9 +399,11 @@ data = GST_BUFFER_DATA (inbuf); size = GST_BUFFER_SIZE (inbuf); } len = avcodec_decode_video (ffmpegdec->context, ffmpegdec->picture, &have_data, data, size); - if (have_data) { + if (len >= 0 && have_data) { /* libavcodec constantly crashes on stupid buffer allocation * errors inside. This drives me crazy, so we let it allocate * it's own buffers and copy to our own buffer afterwards... */ Index: gstffmpegdemux.c RCS file: /home/cvs/gstreamer/gst-ffmpeg/ext/ffmpeg/gstffmpegdemux.c,v retrieving revision 1.32 retrieving revision 1.33 diff -u -d -r1.32 -r1.33 --- gstffmpegdemux.c 7 Jun 2004 02:29:41 -0000 1.32 +++ gstffmpegdemux.c 20 Sep 2004 12:29:03 -0000 1.33 @@ -573,7 +573,7 @@ } /* read a package */ - res = av_read_packet (demux->context, &pkt); + res = av_read_frame (demux->context, &pkt); if (res < 0) { #if 0 /* This doesn't work - FIXME */ |
From: <rb...@fr...> - 2004-09-22 07:54:02
|
CVS Root: /home/cvs/gstreamer Module: gst-ffmpeg Changes by: rbultje Date: Wed Sep 22 2004 00:54:01 PDT Log message: * ext/ffmpeg/gstffmpegdec.c: (gst_ffmpegdec_register): msmpeg4v3 should be priority as well, else it will choose divxdec first (which we don't want). Modified files: . : ChangeLog ext/ffmpeg : gstffmpegdec.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-ffmpeg/ChangeLog.diff?r1=1.70&r2=1.71 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-ffmpeg/ext/ffmpeg/gstffmpegdec.c.diff?r1=1.60&r2=1.61 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /home/cvs/gstreamer/gst-ffmpeg/ChangeLog,v retrieving revision 1.70 retrieving revision 1.71 diff -u -d -r1.70 -r1.71 --- ChangeLog 20 Sep 2004 12:29:03 -0000 1.70 +++ ChangeLog 22 Sep 2004 07:53:48 -0000 1.71 @@ -1,3 +1,9 @@ +2004-09-22 Ronald S. Bultje <rb...@ro...> + + * ext/ffmpeg/gstffmpegdec.c: (gst_ffmpegdec_register): + msmpeg4v3 should be priority as well, else it will choose divxdec + first (which we don't want). 2004-09-20 Ronald S. Bultje <rb...@ro...> * ext/ffmpeg/gstffmpegcodecmap.c: (gst_ffmpeg_codecid_to_caps), Index: gstffmpegdec.c RCS file: /home/cvs/gstreamer/gst-ffmpeg/ext/ffmpeg/gstffmpegdec.c,v retrieving revision 1.60 retrieving revision 1.61 diff -u -d -r1.60 -r1.61 --- gstffmpegdec.c 20 Sep 2004 12:29:03 -0000 1.60 +++ gstffmpegdec.c 22 Sep 2004 07:53:48 -0000 1.61 @@ -557,6 +557,7 @@ }; GType type; AVCodec *in_plugin; + gint rank; in_plugin = first_avcodec; @@ -604,13 +605,22 @@ g_hash_table_insert (global_plugins, GINT_TO_POINTER (0), (gpointer) params); - /* create the gtype now - * (Ronald) MPEG-4 gets a higher priority because it has been well- - * tested and by far outperforms divxdec/xviddec - so we prefer it. */ + /* create the gtype now */ type = g_type_register_static (GST_TYPE_ELEMENT, type_name, &typeinfo, 0); - if (!gst_element_register (plugin, type_name, - (in_plugin->id == CODEC_ID_MPEG4) ? - GST_RANK_PRIMARY : GST_RANK_MARGINAL, type)) { + /* (Ronald) MPEG-4 gets a higher priority because it has been well- + * tested and by far outperforms divxdec/xviddec - so we prefer it. + * msmpeg4v3 same, as it outperforms divxdec for divx3 playback. */ + switch (in_plugin->id) { + case CODEC_ID_MPEG4: + case CODEC_ID_MSMPEG4V3: + rank = GST_RANK_PRIMARY; + break; + default: + rank = GST_RANK_MARGINAL; + } + if (!gst_element_register (plugin, type_name, rank, type)) { g_free (type_name); return FALSE; } |
From: <rb...@fr...> - 2004-09-23 14:55:10
|
CVS Root: /home/cvs/gstreamer Module: gst-ffmpeg Changes by: rbultje Date: Thu Sep 23 2004 07:55:09 PDT Log message: * ext/ffmpeg/gstffmpegdec.c: (gst_ffmpegdec_chain): Update timestamp for every new buffer that we output. Improves audio playback for several files that have multiple audio chunks per buffer. Modified files: . : ChangeLog ext/ffmpeg : gstffmpegdec.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-ffmpeg/ChangeLog.diff?r1=1.71&r2=1.72 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-ffmpeg/ext/ffmpeg/gstffmpegdec.c.diff?r1=1.61&r2=1.62 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /home/cvs/gstreamer/gst-ffmpeg/ChangeLog,v retrieving revision 1.71 retrieving revision 1.72 diff -u -d -r1.71 -r1.72 --- ChangeLog 22 Sep 2004 07:53:48 -0000 1.71 +++ ChangeLog 23 Sep 2004 14:54:57 -0000 1.72 @@ -1,3 +1,10 @@ +2004-09-23 Ronald S. Bultje <rb...@ro...> + + * ext/ffmpeg/gstffmpegdec.c: (gst_ffmpegdec_chain): + Update timestamp for every new buffer that we output. Improves + audio playback for several files that have multiple audio chunks + per buffer. 2004-09-22 Ronald S. Bultje <rb...@ro...> * ext/ffmpeg/gstffmpegdec.c: (gst_ffmpegdec_register): Index: gstffmpegdec.c RCS file: /home/cvs/gstreamer/gst-ffmpeg/ext/ffmpeg/gstffmpegdec.c,v retrieving revision 1.61 retrieving revision 1.62 diff -u -d -r1.61 -r1.62 --- gstffmpegdec.c 22 Sep 2004 07:53:48 -0000 1.61 +++ gstffmpegdec.c 23 Sep 2004 14:54:57 -0000 1.62 @@ -368,6 +368,7 @@ guchar *data; gint size, len = 0; gint have_data; + guint64 expected_ts = GST_BUFFER_TIMESTAMP (inbuf); if (!ffmpegdec->opened) { GST_ELEMENT_ERROR (ffmpegdec, CORE, NEGOTIATION, (NULL), @@ -443,8 +444,14 @@ } } - /* this isn't necessarily true, but it's better than nothing */ - GST_BUFFER_DURATION (outbuf) = GST_BUFFER_DURATION (inbuf); + /* note that ffmpeg sometimes gets the FPS wrong */ + if (GST_CLOCK_TIME_IS_VALID (expected_ts)) { + GST_BUFFER_TIMESTAMP (outbuf) = expected_ts; + GST_BUFFER_DURATION (outbuf) = GST_SECOND * + ffmpegdec->context->frame_rate_base / + ffmpegdec->context->frame_rate; + expected_ts += GST_BUFFER_DURATION (outbuf); + } } break; @@ -462,8 +469,13 @@ if (have_data) { GST_BUFFER_SIZE (outbuf) = have_data; - GST_BUFFER_DURATION (outbuf) = (have_data * GST_SECOND) / - (ffmpegdec->context->channels * ffmpegdec->context->sample_rate); + GST_BUFFER_DURATION (outbuf) = (have_data * GST_SECOND) / + (2 * ffmpegdec->context->channels * + ffmpegdec->context->sample_rate); } else { gst_buffer_unref (outbuf); @@ -511,8 +523,6 @@ gst_caps_free (caps); } - GST_BUFFER_TIMESTAMP (outbuf) = GST_BUFFER_TIMESTAMP (inbuf); - gst_pad_push (ffmpegdec->srcpad, GST_DATA (outbuf)); } |
From: <rb...@fr...> - 2004-10-01 10:51:25
|
CVS Root: /home/cvs/gstreamer Module: gst-ffmpeg Changes by: rbultje Date: Fri Oct 01 2004 03:51:10 PDT Log message: * ext/ffmpeg/gstffmpegcodecmap.c: (gst_ffmpeg_codecid_to_caps), (gst_ffmpeg_caps_with_codecid), (gst_ffmpeg_caps_to_codecid): Simplify codec_data handling. Modified files: . : ChangeLog ext/ffmpeg : gstffmpegcodecmap.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-ffmpeg/ChangeLog.diff?r1=1.72&r2=1.73 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-ffmpeg/ext/ffmpeg/gstffmpegcodecmap.c.diff?r1=1.58&r2=1.59 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /home/cvs/gstreamer/gst-ffmpeg/ChangeLog,v retrieving revision 1.72 retrieving revision 1.73 diff -u -d -r1.72 -r1.73 --- ChangeLog 23 Sep 2004 14:54:57 -0000 1.72 +++ ChangeLog 1 Oct 2004 10:50:58 -0000 1.73 @@ -1,3 +1,9 @@ +2004-10-01 Ronald S. Bultje <rb...@ro...> + + * ext/ffmpeg/gstffmpegcodecmap.c: (gst_ffmpeg_codecid_to_caps), + (gst_ffmpeg_caps_with_codecid), (gst_ffmpeg_caps_to_codecid): + Simplify codec_data handling. 2004-09-23 Ronald S. Bultje <rb...@ro...> * ext/ffmpeg/gstffmpegdec.c: (gst_ffmpegdec_chain): Index: gstffmpegcodecmap.c RCS file: /home/cvs/gstreamer/gst-ffmpeg/ext/ffmpeg/gstffmpegcodecmap.c,v retrieving revision 1.58 retrieving revision 1.59 diff -u -d -r1.58 -r1.59 --- gstffmpegcodecmap.c 20 Sep 2004 12:29:03 -0000 1.58 +++ gstffmpegcodecmap.c 1 Oct 2004 10:50:58 -0000 1.59 @@ -264,7 +264,7 @@ "mpegversion", G_TYPE_INT, 4, "systemstream", G_TYPE_BOOLEAN, FALSE, NULL); gst_caps_append (caps, GST_FF_VID_CAPS_NEW ("video/x-divx", - "divxversion", GST_TYPE_INT_RANGE, 4, 5, NULL)); + "divxversion", GST_TYPE_INT_RANGE, 4, 5, NULL)); gst_caps_append (caps, GST_FF_VID_CAPS_NEW ("video/x-xvid", NULL)); gst_caps_append (caps, GST_FF_VID_CAPS_NEW ("video/x-3ivx", NULL)); } @@ -285,7 +285,7 @@ "msmpegversion", G_TYPE_INT, version, NULL); if (!encode && codec_id == CODEC_ID_MSMPEG4V3) { gst_caps_append (caps, GST_FF_VID_CAPS_NEW ("video/x-divx", - "divxversion", G_TYPE_INT, 3, NULL)); + "divxversion", G_TYPE_INT, 3, NULL)); } } while (0); break; @@ -295,19 +295,7 @@ do { gint version = (codec_id == CODEC_ID_WMV1) ? 1 : 2; - if (context && context->extradata_size) - { - GstBuffer *buffer; - - buffer = gst_buffer_new_and_alloc (context->extradata_size); - memcpy (GST_BUFFER_DATA (buffer), context->extradata, context->extradata_size); - - caps = GST_FF_VID_CAPS_NEW ("video/x-wmv", - "wmvversion", G_TYPE_INT, version, - "codec_data", GST_TYPE_BUFFER, buffer, NULL); - } - else + caps = GST_FF_VID_CAPS_NEW ("video/x-wmv", "wmvversion", G_TYPE_INT, version, NULL); @@ -342,17 +330,10 @@ case CODEC_ID_WMAV2: gint version = (codec_id == CODEC_ID_WMAV1) ? 1 : 2; - + if (context) { caps = GST_FF_AUD_CAPS_NEW ("audio/x-wma", "wmaversion", G_TYPE_INT, version, - "codec_data", GST_TYPE_BUFFER, buffer, "block_align", G_TYPE_INT, context->block_align, "bitrate", G_TYPE_INT, context->bit_rate, NULL); } else { @@ -696,24 +677,27 @@ default: break; - /* set private data */ - if (context && context->extradata_size > 0) { - GstBuffer *data = gst_buffer_new_and_alloc (context->extradata_size); - memcpy (GST_BUFFER_DATA (data), context->extradata, - context->extradata_size); - gst_caps_set_simple (caps, - "gst_ff_extradata", GST_TYPE_BUFFER, data, NULL); - } } } if (caps != NULL) { - char *str = gst_caps_to_string (caps); + char *str; + /* set private data */ + if (context && context->extradata_size > 0) { + GstBuffer *data = gst_buffer_new_and_alloc (context->extradata_size); + memcpy (GST_BUFFER_DATA (data), context->extradata, + context->extradata_size); + gst_caps_set_simple (caps, + "codec_data", GST_TYPE_BUFFER, data, NULL); + gst_buffer_unref (data); + } + str = gst_caps_to_string (caps); GST_DEBUG ("caps for codec_id=%d: %s", codec_id, str); g_free (str); } else { GST_WARNING ("No caps found for codec_id=%d", codec_id); @@ -1100,10 +1084,21 @@ enum CodecType codec_type, const GstCaps *caps, AVCodecContext *context) { GstStructure *str = gst_caps_get_structure (caps, 0); + const GValue *value; + const GstBuffer *buf; if (!context) return; + /* extradata parsing (esds [mpeg4], wma/wmv, msmpeg4v1/2/3, etc.) */ + if ((value = gst_structure_get_value (str, "codec_data"))) { + buf = g_value_get_boxed (value); + context->extradata = av_mallocz (GST_BUFFER_SIZE (buf)); + memcpy (context->extradata, GST_BUFFER_DATA (buf), + GST_BUFFER_SIZE (buf)); + context->extradata_size = GST_BUFFER_SIZE (buf); + } switch (codec_id) { case CODEC_ID_MPEG4: @@ -1115,21 +1110,8 @@ context->codec_tag = GST_MAKE_FOURCC ('X', 'V', 'I', 'D'); else if (!strcmp (mime, "video/x-3ivx")) context->codec_tag = GST_MAKE_FOURCC ('3', 'I', 'V', '1'); - else if (!strcmp (mime, "video/mpeg")) { - const GValue *value; - const GstBuffer *buf; + else if (!strcmp (mime, "video/mpeg")) context->codec_tag = GST_MAKE_FOURCC ('m', 'p', '4', 'v'); - /* esds atom parsing */ - if ((value = gst_structure_get_value (str, "codec_data"))) { - buf = g_value_get_boxed (value); - context->extradata = av_mallocz (GST_BUFFER_SIZE (buf)); - memcpy (context->extradata, GST_BUFFER_DATA (buf), - GST_BUFFER_SIZE (buf)); - context->extradata_size = GST_BUFFER_SIZE (buf); - } @@ -1163,31 +1145,6 @@ - case CODEC_ID_WMAV1: - case CODEC_ID_WMAV2: - case CODEC_ID_WMV1: - case CODEC_ID_WMV2: - do { - const GValue *value; - const GstBuffer *buf; - if ((value = gst_structure_get_value (str, "codec_data"))) { - buf = g_value_get_boxed (value); - if (GST_BUFFER_SIZE (buf) != 0) { - GST_BUFFER_SIZE (buf)); - context->extradata_size = GST_BUFFER_SIZE (buf); - } - } while (0); - break; - case CODEC_ID_AAC: - case CODEC_ID_MPEG4AAC: - /* if we cared (we don't), we would do esds/extra_data parsing here */ case CODEC_ID_MSRLE: case CODEC_ID_QTRLE: @@ -1644,18 +1601,6 @@ video = TRUE; else if (mimetype[0] == 'a') audio = TRUE; - /* extradata */ - if ((data_v = gst_structure_get_value (structure, - "gst_ff_extradata")) && context) { - data = g_value_get_boxed (data_v); - if (context->extradata) - av_free (context->extradata); - context->extradata = av_malloc (GST_BUFFER_SIZE (data)); - memcpy (context->extradata, GST_BUFFER_DATA (data), - GST_BUFFER_SIZE (data)); - context->extradata_size = GST_BUFFER_SIZE (data); |
From: <rb...@fr...> - 2004-10-02 14:11:59
|
CVS Root: /home/cvs/gstreamer Module: gst-ffmpeg Changes by: rbultje Date: Sat Oct 02 2004 07:10:40 PDT Log message: * ext/ffmpeg/gstffmpegcodecmap.c: (gst_ffmpeg_pixfmt_to_caps), (gst_ffmpeg_caps_to_pixfmt): * ext/ffmpeg/gstffmpegcolorspace.c: (gst_ffmpegcsp_pad_link), (gst_ffmpegcsp_init), (gst_ffmpegcsp_chain), (gst_ffmpegcsp_change_state), (gst_ffmpegcsp_register): * ext/ffmpeg/gstffmpegdec.c: (gst_ffmpegdec_chain): Move palette handling over from the decoder to the colorspace conversion plugin (where you would expect it). Modified files: . : ChangeLog ext/ffmpeg : gstffmpegcodecmap.c gstffmpegcolorspace.c gstffmpegdec.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-ffmpeg/ChangeLog.diff?r1=1.73&r2=1.74 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-ffmpeg/ext/ffmpeg/gstffmpegcodecmap.c.diff?r1=1.59&r2=1.60 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-ffmpeg/ext/ffmpeg/gstffmpegcolorspace.c.diff?r1=1.21&r2=1.22 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-ffmpeg/ext/ffmpeg/gstffmpegdec.c.diff?r1=1.62&r2=1.63 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /home/cvs/gstreamer/gst-ffmpeg/ChangeLog,v retrieving revision 1.73 retrieving revision 1.74 diff -u -d -r1.73 -r1.74 --- ChangeLog 1 Oct 2004 10:50:58 -0000 1.73 +++ ChangeLog 2 Oct 2004 14:10:27 -0000 1.74 @@ -1,3 +1,14 @@ +2004-10-02 Ronald S. Bultje <rb...@ro...> + + * ext/ffmpeg/gstffmpegcodecmap.c: (gst_ffmpeg_pixfmt_to_caps), + (gst_ffmpeg_caps_to_pixfmt): + * ext/ffmpeg/gstffmpegcolorspace.c: (gst_ffmpegcsp_pad_link), + (gst_ffmpegcsp_init), (gst_ffmpegcsp_chain), + (gst_ffmpegcsp_change_state), (gst_ffmpegcsp_register): + * ext/ffmpeg/gstffmpegdec.c: (gst_ffmpegdec_chain): + Move palette handling over from the decoder to the colorspace + conversion plugin (where you would expect it). 2004-10-01 Ronald S. Bultje <rb...@ro...> * ext/ffmpeg/gstffmpegcodecmap.c: (gst_ffmpeg_codecid_to_caps), Index: gstffmpegcodecmap.c RCS file: /home/cvs/gstreamer/gst-ffmpeg/ext/ffmpeg/gstffmpegcodecmap.c,v retrieving revision 1.59 retrieving revision 1.60 diff -u -d -r1.59 -r1.60 --- gstffmpegcodecmap.c 1 Oct 2004 10:50:58 -0000 1.59 +++ gstffmpegcodecmap.c 2 Oct 2004 14:10:27 -0000 1.60 @@ -783,19 +783,33 @@ g_mask = 0x03e0; b_mask = 0x001f; break; + case PIX_FMT_PAL8: + bpp = depth = 8; + endianness = G_BYTE_ORDER; + break; default: /* give up ... */ } if (bpp != 0) { - caps = GST_FF_VID_CAPS_NEW ("video/x-raw-rgb", - "bpp", G_TYPE_INT, bpp, - "depth", G_TYPE_INT, depth, - "red_mask", G_TYPE_INT, r_mask, - "green_mask", G_TYPE_INT, g_mask, - "blue_mask", G_TYPE_INT, b_mask, - "endianness", G_TYPE_INT, endianness, NULL); + if (r_mask != 0) { + caps = GST_FF_VID_CAPS_NEW ("video/x-raw-rgb", + "bpp", G_TYPE_INT, bpp, + "depth", G_TYPE_INT, depth, + "red_mask", G_TYPE_INT, r_mask, + "green_mask", G_TYPE_INT, g_mask, + "blue_mask", G_TYPE_INT, b_mask, + "endianness", G_TYPE_INT, endianness, NULL); + } else { + if (context) { + gst_ffmpeg_set_palette (caps, context); + } + } } else if (fmt) { caps = GST_FF_VID_CAPS_NEW ("video/x-raw-yuv", "format", GST_TYPE_FOURCC, fmt, NULL); @@ -1012,34 +1026,40 @@ gint bpp = 0, rmask = 0, endianness = 0; if (gst_structure_get_int (structure, "bpp", &bpp) && - gst_structure_get_int (structure, "endianness", &endianness) && - gst_structure_get_int (structure, "red_mask", &rmask)) { - switch (bpp) { - case 32: + gst_structure_get_int (structure, "endianness", &endianness)) { + if (gst_structure_get_int (structure, "red_mask", &rmask)) { + switch (bpp) { + case 32: #if (G_BYTE_ORDER == G_BIG_ENDIAN) - if (rmask == 0x00ff0000) + if (rmask == 0x00ff0000) #else - if (rmask == 0x0000ff00) + if (rmask == 0x0000ff00) #endif - context->pix_fmt = PIX_FMT_RGBA32; - break; - case 24: - if (rmask == 0x0000FF) - context->pix_fmt = PIX_FMT_BGR24; - else - context->pix_fmt = PIX_FMT_RGB24; - case 16: - if (endianness == G_BYTE_ORDER) - context->pix_fmt = PIX_FMT_RGB565; - case 15: - context->pix_fmt = PIX_FMT_RGB555; - default: - /* nothing */ + context->pix_fmt = PIX_FMT_RGBA32; + break; + case 24: + if (rmask == 0x0000FF) + context->pix_fmt = PIX_FMT_BGR24; + else + context->pix_fmt = PIX_FMT_RGB24; + case 16: + if (endianness == G_BYTE_ORDER) + context->pix_fmt = PIX_FMT_RGB565; + case 15: + context->pix_fmt = PIX_FMT_RGB555; + default: + /* nothing */ + } + } else { + if (bpp == 8) { + context->pix_fmt = PIX_FMT_PAL8; + gst_ffmpeg_get_palette (caps, context); } } Index: gstffmpegcolorspace.c RCS file: /home/cvs/gstreamer/gst-ffmpeg/ext/ffmpeg/gstffmpegcolorspace.c,v retrieving revision 1.21 retrieving revision 1.22 diff -u -d -r1.21 -r1.22 --- gstffmpegcolorspace.c 21 Jul 2004 09:20:55 -0000 1.21 +++ gstffmpegcolorspace.c 2 Oct 2004 14:10:27 -0000 1.22 @@ -56,6 +56,7 @@ gfloat fps; enum PixelFormat from_pixfmt, to_pixfmt; AVFrame *from_frame, *to_frame; + AVPaletteControl *palette; GstCaps *sinkcaps; }; @@ -227,6 +228,11 @@ space->to_pixfmt = ctx->pix_fmt; } else { space->from_pixfmt = ctx->pix_fmt; + /* palette */ + if (space->palette) + av_free (space->palette); + space->palette = ctx->palctrl; av_free (ctx); if (space->from_frame) @@ -311,6 +317,7 @@ space->from_pixfmt = space->to_pixfmt = PIX_FMT_NB; space->from_frame = space->to_frame = NULL; + space->palette = NULL; } static void @@ -344,25 +351,54 @@ if (space->from_pixfmt == space->to_pixfmt) { outbuf = inbuf; - /* use bufferpool here */ + enum PixelFormat from_pixfmt = + (space->from_pixfmt == PIX_FMT_PAL8) ? + PIX_FMT_RGBA32 : space->from_pixfmt; guint size = avpicture_get_size (space->to_pixfmt, - space->width, - space->height); + space->width, space->height); + GstBuffer *inbuf2; + if (from_pixfmt != space->from_pixfmt) { + /* manual conversion from palette to RGBA32 */ + gint x, y, pix, wd = space->width; + guint8 *dest; + guint32 conv; + AVPaletteControl *pal = space->palette; + inbuf2 = gst_buffer_new_and_alloc (4 * + space->width * space->height); + dest = GST_BUFFER_DATA (inbuf2); + for (y = 0; y < space->height; y++) { + for (x = 0; x < space->width; x++) { + pix = GST_BUFFER_DATA (inbuf)[y * wd + x]; + conv = pal->palette[pix]; + dest[(y * wd + x) * 4] = ((guint8 *) &conv)[0]; + dest[(y * wd + x) * 4 + 1] = ((guint8 *) &conv)[1]; + dest[(y * wd + x) * 4 + 2] = ((guint8 *) &conv)[2]; + dest[(y * wd + x) * 4 + 3] = ((guint8 *) &conv)[3]; + inbuf2 = inbuf; outbuf = gst_pad_alloc_buffer (space->srcpad, GST_BUFFER_OFFSET_NONE, size); /* convert */ - avpicture_fill ((AVPicture *) space->from_frame, GST_BUFFER_DATA (inbuf), - space->from_pixfmt, space->width, space->height); + avpicture_fill ((AVPicture *) space->from_frame, GST_BUFFER_DATA (inbuf2), + from_pixfmt, space->width, space->height); avpicture_fill ((AVPicture *) space->to_frame, GST_BUFFER_DATA (outbuf), space->to_pixfmt, space->width, space->height); img_convert ((AVPicture *) space->to_frame, space->to_pixfmt, - (AVPicture *) space->from_frame, space->from_pixfmt, + (AVPicture *) space->from_frame, from_pixfmt, space->width, space->height); GST_BUFFER_TIMESTAMP (outbuf) = GST_BUFFER_TIMESTAMP (inbuf); GST_BUFFER_DURATION (outbuf) = GST_BUFFER_DURATION (inbuf); + if (inbuf != inbuf2) + gst_buffer_unref (inbuf2); gst_buffer_unref (inbuf); @@ -382,8 +418,11 @@ av_free (space->from_frame); if (space->to_frame) av_free (space->to_frame); + if (space->palette) + av_free (space->palette); space->from_frame = NULL; space->to_frame = NULL; + space->palette = NULL; @@ -437,6 +476,8 @@ /* build templates */ srctempl = gst_pad_template_new ("src", GST_PAD_SRC, GST_PAD_ALWAYS, gst_caps_copy (caps)); + /* the sink template will do palette handling as well... */ sinktempl = gst_pad_template_new ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, caps); return gst_element_register (plugin, "ffcolorspace", Index: gstffmpegdec.c RCS file: /home/cvs/gstreamer/gst-ffmpeg/ext/ffmpeg/gstffmpegdec.c,v retrieving revision 1.62 retrieving revision 1.63 diff -u -d -r1.62 -r1.63 --- gstffmpegdec.c 23 Sep 2004 14:54:57 -0000 1.62 +++ gstffmpegdec.c 2 Oct 2004 14:10:27 -0000 1.63 @@ -409,40 +409,18 @@ * errors inside. This drives me crazy, so we let it allocate * it's own buffers and copy to our own buffer afterwards... */ AVPicture pic; - enum PixelFormat to_fmt = - (ffmpegdec->context->pix_fmt == PIX_FMT_PAL8) ? - PIX_FMT_RGBA32 : ffmpegdec->context->pix_fmt; - gint size = avpicture_get_size (to_fmt, + gint size = avpicture_get_size (ffmpegdec->context->pix_fmt, ffmpegdec->context->width, ffmpegdec->context->height); outbuf = gst_buffer_new_and_alloc (size); - avpicture_fill (&pic, GST_BUFFER_DATA (outbuf), to_fmt, + avpicture_fill (&pic, GST_BUFFER_DATA (outbuf), + ffmpegdec->context->pix_fmt, + ffmpegdec->context->width, ffmpegdec->context->height); + img_convert (&pic, ffmpegdec->context->pix_fmt, + (AVPicture *) ffmpegdec->picture, ffmpegdec->context->width, ffmpegdec->context->height); - if (to_fmt == ffmpegdec->context->pix_fmt) { - img_convert (&pic, ffmpegdec->context->pix_fmt, - (AVPicture *) ffmpegdec->picture, - ffmpegdec->context->pix_fmt, - ffmpegdec->context->width, ffmpegdec->context->height); - } else { - /* manual conversion from palette to RGBA32 */ - gint x, y, pix, ws = ffmpegdec->picture->linesize[0], - wd = ffmpegdec->context->width; - guint8 *dest = GST_BUFFER_DATA (outbuf); - guint32 conv; - AVPaletteControl *pal = ffmpegdec->context->palctrl; - - for (y = 0; y < ffmpegdec->context->height; y++) { - for (x = 0; x < ffmpegdec->context->width; x++) { - pix = ffmpegdec->picture->data[0][y * ws + x]; - conv = pal->palette[pix]; - dest[(y * wd + x) * 4] = ((guint8 *) &conv)[0]; - dest[(y * wd + x) * 4 + 1] = ((guint8 *) &conv)[1]; - dest[(y * wd + x) * 4 + 2] = ((guint8 *) &conv)[2]; - dest[(y * wd + x) * 4 + 3] = ((guint8 *) &conv)[3]; - } - } - } /* note that ffmpeg sometimes gets the FPS wrong */ if (GST_CLOCK_TIME_IS_VALID (expected_ts)) { |
From: <rb...@fr...> - 2004-10-02 18:32:23
|
CVS Root: /home/cvs/gstreamer Module: gst-ffmpeg Changes by: rbultje Date: Sat Oct 02 2004 11:31:01 PDT Log message: * ext/ffmpeg/gstffmpegdemux.c: (gst_ffmpegdemux_loop): Signal no_more_pads. * ext/ffmpeg/gstffmpegprotocol.c: (gst_ffmpegdata_read), (gst_ffmpegdata_seek): Handle events. Modified files: . : ChangeLog ext/ffmpeg : gstffmpegdemux.c gstffmpegprotocol.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-ffmpeg/ChangeLog.diff?r1=1.74&r2=1.75 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-ffmpeg/ext/ffmpeg/gstffmpegdemux.c.diff?r1=1.33&r2=1.34 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-ffmpeg/ext/ffmpeg/gstffmpegprotocol.c.diff?r1=1.14&r2=1.15 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /home/cvs/gstreamer/gst-ffmpeg/ChangeLog,v retrieving revision 1.74 retrieving revision 1.75 diff -u -d -r1.74 -r1.75 --- ChangeLog 2 Oct 2004 14:10:27 -0000 1.74 +++ ChangeLog 2 Oct 2004 18:30:48 -0000 1.75 @@ -1,5 +1,13 @@ 2004-10-02 Ronald S. Bultje <rb...@ro...> + * ext/ffmpeg/gstffmpegdemux.c: (gst_ffmpegdemux_loop): + Signal no_more_pads. + * ext/ffmpeg/gstffmpegprotocol.c: (gst_ffmpegdata_read), + (gst_ffmpegdata_seek): + Handle events. + +2004-10-02 Ronald S. Bultje <rb...@ro...> * ext/ffmpeg/gstffmpegcodecmap.c: (gst_ffmpeg_pixfmt_to_caps), (gst_ffmpeg_caps_to_pixfmt): * ext/ffmpeg/gstffmpegcolorspace.c: (gst_ffmpegcsp_pad_link), Index: gstffmpegdemux.c RCS file: /home/cvs/gstreamer/gst-ffmpeg/ext/ffmpeg/gstffmpegdemux.c,v retrieving revision 1.33 retrieving revision 1.34 diff -u -d -r1.33 -r1.34 --- gstffmpegdemux.c 20 Sep 2004 12:29:03 -0000 1.33 +++ gstffmpegdemux.c 2 Oct 2004 18:30:48 -0000 1.34 @@ -570,6 +570,7 @@ if (!demux->opened) { if (!gst_ffmpegdemux_open (demux)) return; + gst_element_no_more_pads (element); } /* read a package */ @@ -622,9 +623,10 @@ memcpy (GST_BUFFER_DATA (outbuf), pkt.data, pkt.size); GST_BUFFER_SIZE (outbuf) = pkt.size; - if (pkt.pts != AV_NOPTS_VALUE && demux->context->pts_den) + if (pkt.pts != AV_NOPTS_VALUE && demux->context->pts_den) { GST_BUFFER_TIMESTAMP (outbuf) = (double) pkt.pts * GST_SECOND * demux->context->pts_num / demux->context->pts_den; + } if (pkt.flags & PKT_FLAG_KEY) { GST_BUFFER_FLAG_SET (outbuf, GST_BUFFER_KEY_UNIT); Index: gstffmpegprotocol.c RCS file: /home/cvs/gstreamer/gst-ffmpeg/ext/ffmpeg/gstffmpegprotocol.c,v retrieving revision 1.14 retrieving revision 1.15 diff -u -d -r1.14 -r1.15 --- gstffmpegprotocol.c 14 Jun 2004 01:21:01 -0000 1.14 +++ gstffmpegprotocol.c 2 Oct 2004 18:30:49 -0000 1.15 @@ -145,6 +145,13 @@ have_event = FALSE; gst_event_unref (event); break; + case GST_EVENT_FLUSH: + gst_event_unref (event); + break; + case GST_EVENT_INTERRUPT: + have_event = FALSE; default: gst_pad_event_default (info->pad, event); @@ -219,6 +226,7 @@ /* handle discont */ gst_bytestream_seek (info->bs, pos, seek_type); /* prevent eos */ if (gst_bytestream_tell (info->bs) == gst_bytestream_length (info->bs)) { @@ -239,11 +247,15 @@ g_warning ("unexpected/unwanted EOS event after seek"); info->eos = TRUE; gst_event_unref (event); - break; + return -1; case GST_EVENT_DISCONTINUOUS: - gst_bytestream_flush_fast (info->bs, remaining); gst_event_unref (event); /* we expect this */ break; + case GST_EVENT_FLUSH: + break; + case GST_EVENT_INTERRUPT: + gst_event_unref (event); default: gst_pad_event_default (info->pad, event); |
From: <rb...@fr...> - 2004-10-02 20:27:38
|
CVS Root: /home/cvs/gstreamer Module: gst-ffmpeg Changes by: rbultje Date: Sat Oct 02 2004 13:26:22 PDT Log message: * ext/ffmpeg/gstffmpegcodecmap.c: (gst_ffmpeg_codecid_to_caps), (gst_ffmpeg_caps_with_codecid), (gst_ffmpeg_caps_to_codecid): Generalized palette functions, add actual mimetypes for wing commander formats. * ext/ffmpeg/gstffmpegcolorspace.c: (gst_ffmpegcsp_chain): Ffmpeg has internal palette functions, so I noticed. * ext/ffmpeg/gstffmpegdec.c: (gst_ffmpegdec_chain): Actually remove all palette code. Modified files: . : ChangeLog ext/ffmpeg : gstffmpegcodecmap.c gstffmpegcolorspace.c gstffmpegdec.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-ffmpeg/ChangeLog.diff?r1=1.75&r2=1.76 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-ffmpeg/ext/ffmpeg/gstffmpegcodecmap.c.diff?r1=1.60&r2=1.61 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-ffmpeg/ext/ffmpeg/gstffmpegcolorspace.c.diff?r1=1.22&r2=1.23 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-ffmpeg/ext/ffmpeg/gstffmpegdec.c.diff?r1=1.63&r2=1.64 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /home/cvs/gstreamer/gst-ffmpeg/ChangeLog,v retrieving revision 1.75 retrieving revision 1.76 diff -u -d -r1.75 -r1.76 --- ChangeLog 2 Oct 2004 18:30:48 -0000 1.75 +++ ChangeLog 2 Oct 2004 20:26:10 -0000 1.76 @@ -1,5 +1,16 @@ 2004-10-02 Ronald S. Bultje <rb...@ro...> + * ext/ffmpeg/gstffmpegcodecmap.c: (gst_ffmpeg_codecid_to_caps), + (gst_ffmpeg_caps_with_codecid), (gst_ffmpeg_caps_to_codecid): + Generalized palette functions, add actual mimetypes for wing + commander formats. + * ext/ffmpeg/gstffmpegcolorspace.c: (gst_ffmpegcsp_chain): + Ffmpeg has internal palette functions, so I noticed. + * ext/ffmpeg/gstffmpegdec.c: (gst_ffmpegdec_chain): + Actually remove all palette code. + +2004-10-02 Ronald S. Bultje <rb...@ro...> * ext/ffmpeg/gstffmpegdemux.c: (gst_ffmpegdemux_loop): Signal no_more_pads. * ext/ffmpeg/gstffmpegprotocol.c: (gst_ffmpegdata_read), Index: gstffmpegcodecmap.c RCS file: /home/cvs/gstreamer/gst-ffmpeg/ext/ffmpeg/gstffmpegcodecmap.c,v retrieving revision 1.60 retrieving revision 1.61 diff -u -d -r1.60 -r1.61 --- gstffmpegcodecmap.c 2 Oct 2004 14:10:27 -0000 1.60 +++ gstffmpegcodecmap.c 2 Oct 2004 20:26:10 -0000 1.61 @@ -401,13 +401,17 @@ caps = GST_FF_VID_CAPS_NEW ("video/x-4xm", NULL); break; + case CODEC_ID_XAN_WC3: + case CODEC_ID_XAN_WC4: + caps = GST_FF_VID_CAPS_NEW ("video/x-xan", + "wcversion", G_TYPE_INT, 3 - CODEC_ID_XAN_WC3 + codec_id, NULL); + break; case CODEC_ID_VCR1: case CODEC_ID_CLJR: case CODEC_ID_MDEC: case CODEC_ID_ROQ: case CODEC_ID_INTERPLAY_VIDEO: - case CODEC_ID_XAN_WC3: - case CODEC_ID_XAN_WC4: buildcaps = TRUE; @@ -427,7 +431,6 @@ if (context) { gst_caps_set_simple (caps, "depth", G_TYPE_INT, (gint) context->bits_per_sample, NULL); - gst_ffmpeg_set_palette (caps, context); } else { gst_caps_set_simple (caps, "depth", GST_TYPE_INT_RANGE, 1, 64, NULL); } @@ -694,6 +697,11 @@ gst_buffer_unref (data); } + /* palette */ + if (context) { + gst_ffmpeg_set_palette (caps, context); + } str = gst_caps_to_string (caps); GST_DEBUG ("caps for codec_id=%d: %s", codec_id, str); g_free (str); @@ -1172,7 +1180,6 @@ if (gst_structure_get_int (str, "depth", &depth)) context->bits_per_sample = depth; - gst_ffmpeg_get_palette (caps, context); } while (0); @@ -1184,6 +1191,7 @@ switch (codec_type) { case CODEC_TYPE_VIDEO: gst_ffmpeg_caps_to_pixfmt (caps, context, codec_id == CODEC_ID_RAWVIDEO); + gst_ffmpeg_get_palette (caps, context); case CODEC_TYPE_AUDIO: gst_ffmpeg_caps_to_smpfmt (caps, context, FALSE); @@ -1604,6 +1612,23 @@ video = TRUE; + } else if (!strcmp (mimetype, "video/x-xan")) { + gint wcversion = 0; + if ((gst_structure_get_int (structure, "wcversion", &wcversion))) { + switch (wcversion) { + case 3: + id = CODEC_ID_XAN_WC3; + video = TRUE; + break; + case 4: + id = CODEC_ID_XAN_WC4; + default: + } } else if (!strncmp (mimetype, "audio/x-gst_ff-", 15) || !strncmp (mimetype, "video/x-gst_ff-", 15)) { gchar ext[16]; Index: gstffmpegcolorspace.c RCS file: /home/cvs/gstreamer/gst-ffmpeg/ext/ffmpeg/gstffmpegcolorspace.c,v retrieving revision 1.22 retrieving revision 1.23 diff -u -d -r1.22 -r1.23 --- gstffmpegcolorspace.c 2 Oct 2004 14:10:27 -0000 1.22 +++ gstffmpegcolorspace.c 2 Oct 2004 20:26:10 -0000 1.23 @@ -351,54 +351,25 @@ if (space->from_pixfmt == space->to_pixfmt) { outbuf = inbuf; } else { - enum PixelFormat from_pixfmt = - (space->from_pixfmt == PIX_FMT_PAL8) ? - PIX_FMT_RGBA32 : space->from_pixfmt; guint size = avpicture_get_size (space->to_pixfmt, space->width, space->height); - GstBuffer *inbuf2; - - if (from_pixfmt != space->from_pixfmt) { - /* manual conversion from palette to RGBA32 */ - gint x, y, pix, wd = space->width; - guint8 *dest; - guint32 conv; - AVPaletteControl *pal = space->palette; - inbuf2 = gst_buffer_new_and_alloc (4 * - space->width * space->height); - dest = GST_BUFFER_DATA (inbuf2); - for (y = 0; y < space->height; y++) { - for (x = 0; x < space->width; x++) { - pix = GST_BUFFER_DATA (inbuf)[y * wd + x]; - conv = pal->palette[pix]; - dest[(y * wd + x) * 4] = ((guint8 *) &conv)[0]; - dest[(y * wd + x) * 4 + 1] = ((guint8 *) &conv)[1]; - dest[(y * wd + x) * 4 + 2] = ((guint8 *) &conv)[2]; - dest[(y * wd + x) * 4 + 3] = ((guint8 *) &conv)[3]; - } - } - } else { - inbuf2 = inbuf; - } outbuf = gst_pad_alloc_buffer (space->srcpad, GST_BUFFER_OFFSET_NONE, size); /* convert */ - avpicture_fill ((AVPicture *) space->from_frame, GST_BUFFER_DATA (inbuf2), - from_pixfmt, space->width, space->height); + avpicture_fill ((AVPicture *) space->from_frame, GST_BUFFER_DATA (inbuf), + space->from_pixfmt, space->width, space->height); + if (space->palette) + space->from_frame->data[1] = (uint8_t *) space->palette; avpicture_fill ((AVPicture *) space->to_frame, GST_BUFFER_DATA (outbuf), space->to_pixfmt, space->width, space->height); img_convert ((AVPicture *) space->to_frame, space->to_pixfmt, - (AVPicture *) space->from_frame, from_pixfmt, + (AVPicture *) space->from_frame, space->from_pixfmt, GST_BUFFER_TIMESTAMP (outbuf) = GST_BUFFER_TIMESTAMP (inbuf); GST_BUFFER_DURATION (outbuf) = GST_BUFFER_DURATION (inbuf); - if (inbuf != inbuf2) - gst_buffer_unref (inbuf2); gst_buffer_unref (inbuf); } Index: gstffmpegdec.c RCS file: /home/cvs/gstreamer/gst-ffmpeg/ext/ffmpeg/gstffmpegdec.c,v retrieving revision 1.63 retrieving revision 1.64 diff -u -d -r1.63 -r1.64 --- gstffmpegdec.c 2 Oct 2004 14:10:27 -0000 1.63 +++ gstffmpegdec.c 2 Oct 2004 20:26:10 -0000 1.64 @@ -472,13 +472,9 @@ if (have_data) { if (!GST_PAD_CAPS (ffmpegdec->srcpad)) { GstCaps *caps; - enum PixelFormat orig_fmt = ffmpegdec->context->pix_fmt; - ffmpegdec->context->pix_fmt = (orig_fmt == PIX_FMT_PAL8) ? - PIX_FMT_RGBA32 : orig_fmt; caps = gst_ffmpeg_codectype_to_caps (oclass->in_plugin->type, ffmpegdec->context); - ffmpegdec->context->pix_fmt = orig_fmt; /* add in pixel-aspect-ratio if we have it */ if (caps && ffmpegdec->par) { |
From: <rb...@fr...> - 2004-10-02 21:18:15
|
CVS Root: /home/cvs/gstreamer Module: gst-ffmpeg Changes by: rbultje Date: Sat Oct 02 2004 14:17:38 PDT Log message: * ext/ffmpeg/gstffmpegdemux.c: (gst_ffmpegdemux_loop): Fix timestamps. Quite some of the gaming formats work now. :). Modified files: . : ChangeLog ext/ffmpeg : gstffmpegdemux.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-ffmpeg/ChangeLog.diff?r1=1.76&r2=1.77 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-ffmpeg/ext/ffmpeg/gstffmpegdemux.c.diff?r1=1.34&r2=1.35 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /home/cvs/gstreamer/gst-ffmpeg/ChangeLog,v retrieving revision 1.76 retrieving revision 1.77 diff -u -d -r1.76 -r1.77 --- ChangeLog 2 Oct 2004 20:26:10 -0000 1.76 +++ ChangeLog 2 Oct 2004 21:17:26 -0000 1.77 @@ -1,5 +1,10 @@ 2004-10-02 Ronald S. Bultje <rb...@ro...> + * ext/ffmpeg/gstffmpegdemux.c: (gst_ffmpegdemux_loop): + Fix timestamps. Quite some of the gaming formats work now. :). + +2004-10-02 Ronald S. Bultje <rb...@ro...> * ext/ffmpeg/gstffmpegcodecmap.c: (gst_ffmpeg_codecid_to_caps), (gst_ffmpeg_caps_with_codecid), (gst_ffmpeg_caps_to_codecid): Generalized palette functions, add actual mimetypes for wing Index: gstffmpegdemux.c RCS file: /home/cvs/gstreamer/gst-ffmpeg/ext/ffmpeg/gstffmpegdemux.c,v retrieving revision 1.34 retrieving revision 1.35 diff -u -d -r1.34 -r1.35 --- gstffmpegdemux.c 2 Oct 2004 18:30:48 -0000 1.34 +++ gstffmpegdemux.c 2 Oct 2004 21:17:26 -0000 1.35 @@ -617,15 +617,16 @@ /* and handle the data by pushing it forward... */ if (pad && GST_PAD_IS_USABLE (pad)) { + AVStream *stream = gst_ffmpegdemux_stream_from_pad (pad); GstBuffer *outbuf; outbuf = gst_buffer_new_and_alloc (pkt.size); memcpy (GST_BUFFER_DATA (outbuf), pkt.data, pkt.size); GST_BUFFER_SIZE (outbuf) = pkt.size; - if (pkt.pts != AV_NOPTS_VALUE && demux->context->pts_den) { - GST_BUFFER_TIMESTAMP (outbuf) = (double) pkt.pts * GST_SECOND * - demux->context->pts_num / demux->context->pts_den; + if (pkt.pts != AV_NOPTS_VALUE) { + GST_BUFFER_TIMESTAMP (outbuf) = (gdouble) (pkt.pts + + stream->start_time) * GST_SECOND / AV_TIME_BASE; } if (pkt.flags & PKT_FLAG_KEY) { |
From: <rb...@fr...> - 2004-10-04 16:11:47
|
CVS Root: /home/cvs/gstreamer Module: gst-ffmpeg Changes by: rbultje Date: Mon Oct 04 2004 09:11:42 PDT Log message: * ext/ffmpeg/gstffmpegcodecmap.c: (gst_ffmpeg_codecid_to_caps), (gst_ffmpeg_caps_with_codecid): Negotiation fixes for real video codecs. Modified files: . : ChangeLog ext/ffmpeg : gstffmpegcodecmap.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-ffmpeg/ChangeLog.diff?r1=1.77&r2=1.78 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-ffmpeg/ext/ffmpeg/gstffmpegcodecmap.c.diff?r1=1.61&r2=1.62 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /home/cvs/gstreamer/gst-ffmpeg/ChangeLog,v retrieving revision 1.77 retrieving revision 1.78 diff -u -d -r1.77 -r1.78 --- ChangeLog 2 Oct 2004 21:17:26 -0000 1.77 +++ ChangeLog 4 Oct 2004 16:11:30 -0000 1.78 @@ -1,3 +1,9 @@ +2004-10-04 Ronald S. Bultje <rb...@ro...> + + * ext/ffmpeg/gstffmpegcodecmap.c: (gst_ffmpeg_codecid_to_caps), + (gst_ffmpeg_caps_with_codecid): + Negotiation fixes for real video codecs. 2004-10-02 Ronald S. Bultje <rb...@ro...> * ext/ffmpeg/gstffmpegdemux.c: (gst_ffmpegdemux_loop): Index: gstffmpegcodecmap.c RCS file: /home/cvs/gstreamer/gst-ffmpeg/ext/ffmpeg/gstffmpegcodecmap.c,v retrieving revision 1.61 retrieving revision 1.62 diff -u -d -r1.61 -r1.62 --- gstffmpegcodecmap.c 2 Oct 2004 20:26:10 -0000 1.61 +++ gstffmpegcodecmap.c 4 Oct 2004 16:11:30 -0000 1.62 @@ -177,6 +177,10 @@ caps = GST_FF_VID_CAPS_NEW ("video/x-pn-realvideo", "systemstream", G_TYPE_BOOLEAN, FALSE, "rmversion", G_TYPE_INT, version, NULL); + if (context) { + gst_caps_set_simple (caps, + "rmsubid", GST_TYPE_FOURCC, context->sub_id, NULL); + } } while (0); break; @@ -1183,6 +1187,16 @@ + case CODEC_ID_RV10: + case CODEC_ID_RV20: + do { + guint32 fourcc; + if (gst_structure_get_fourcc (str, "rmsubid", &fourcc)) + context->sub_id = fourcc; + } while (0); + break; default: } |
From: <rb...@fr...> - 2004-10-09 16:13:55
|
CVS Root: /home/cvs/gstreamer Module: gst-ffmpeg Changes by: rbultje Date: Sat Oct 09 2004 09:13:44 PDT Log message: * ext/ffmpeg/gstffmpegdec.c: (gst_ffmpegdec_chain): Unref when not usable. Modified files: . : ChangeLog ext/ffmpeg : gstffmpegdec.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-ffmpeg/ChangeLog.diff?r1=1.78&r2=1.79 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-ffmpeg/ext/ffmpeg/gstffmpegdec.c.diff?r1=1.64&r2=1.65 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /home/cvs/gstreamer/gst-ffmpeg/ChangeLog,v retrieving revision 1.78 retrieving revision 1.79 diff -u -d -r1.78 -r1.79 --- ChangeLog 4 Oct 2004 16:11:30 -0000 1.78 +++ ChangeLog 9 Oct 2004 16:13:31 -0000 1.79 @@ -1,3 +1,8 @@ +2004-10-09 Ronald S. Bultje <rb...@ro...> + + * ext/ffmpeg/gstffmpegdec.c: (gst_ffmpegdec_chain): + Unref when not usable. 2004-10-04 Ronald S. Bultje <rb...@ro...> * ext/ffmpeg/gstffmpegcodecmap.c: (gst_ffmpeg_codecid_to_caps), Index: gstffmpegdec.c RCS file: /home/cvs/gstreamer/gst-ffmpeg/ext/ffmpeg/gstffmpegdec.c,v retrieving revision 1.64 retrieving revision 1.65 diff -u -d -r1.64 -r1.65 --- gstffmpegdec.c 2 Oct 2004 20:26:10 -0000 1.64 +++ gstffmpegdec.c 9 Oct 2004 16:13:31 -0000 1.65 @@ -445,7 +445,7 @@ return; } - if (have_data) { + if (len >= 0 && have_data) { GST_BUFFER_SIZE (outbuf) = have_data; if (GST_CLOCK_TIME_IS_VALID (expected_ts)) { GST_BUFFER_TIMESTAMP (outbuf) = expected_ts; @@ -492,12 +492,16 @@ oclass->in_plugin->name)); if (caps != NULL) gst_caps_free (caps); + gst_buffer_unref (outbuf); gst_caps_free (caps); } - gst_pad_push (ffmpegdec->srcpad, GST_DATA (outbuf)); + if (GST_PAD_IS_USABLE (ffmpegdec->srcpad)) + gst_pad_push (ffmpegdec->srcpad, GST_DATA (outbuf)); + else + gst_buffer_unref (outbuf); } size -= len; |
From: <rb...@fr...> - 2004-10-11 08:21:38
|
CVS Root: /home/cvs/gstreamer Module: gst-ffmpeg Changes by: rbultje Date: Mon Oct 11 2004 01:21:28 PDT Log message: * ext/ffmpeg/gstffmpegenc.c: (gst_ffmpegenc_init), (gst_ffmpegenc_chain_video): Set chain function before adding pad, fix memleak on error, error out on encode errors because none of subsequent frames will work any better (this is not input dependent). Modified files: . : ChangeLog ext/ffmpeg : gstffmpegenc.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-ffmpeg/ChangeLog.diff?r1=1.81&r2=1.82 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-ffmpeg/ext/ffmpeg/gstffmpegenc.c.diff?r1=1.48&r2=1.49 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /home/cvs/gstreamer/gst-ffmpeg/ChangeLog,v retrieving revision 1.81 retrieving revision 1.82 diff -u -d -r1.81 -r1.82 --- ChangeLog 9 Oct 2004 18:33:03 -0000 1.81 +++ ChangeLog 11 Oct 2004 08:21:16 -0000 1.82 @@ -1,3 +1,11 @@ +2004-10-11 Ronald S. Bultje <rb...@ro...> + + * ext/ffmpeg/gstffmpegenc.c: (gst_ffmpegenc_init), + (gst_ffmpegenc_chain_video): + Set chain function before adding pad, fix memleak on error, error + out on encode errors because none of subsequent frames will work + any better (this is not input dependent). 2004-10-09 Ronald S. Bultje <rb...@ro...> * configure.ac: Index: gstffmpegenc.c RCS file: /home/cvs/gstreamer/gst-ffmpeg/ext/ffmpeg/gstffmpegenc.c,v retrieving revision 1.48 retrieving revision 1.49 diff -u -d -r1.48 -r1.49 --- gstffmpegenc.c 8 Jul 2004 14:01:28 -0000 1.48 +++ gstffmpegenc.c 11 Oct 2004 08:21:16 -0000 1.49 @@ -243,9 +243,6 @@ ffmpegenc->srcpad = gst_pad_new_from_template (oclass->srctempl, "src"); gst_pad_use_explicit_caps (ffmpegenc->srcpad); - gst_element_add_pad (GST_ELEMENT (ffmpegenc), ffmpegenc->sinkpad); - gst_element_add_pad (GST_ELEMENT (ffmpegenc), ffmpegenc->srcpad); - /* ffmpeg objects */ ffmpegenc->context = avcodec_alloc_context (); ffmpegenc->picture = avcodec_alloc_frame (); @@ -263,6 +260,9 @@ ffmpegenc->bitrate = 128000; } + gst_element_add_pad (GST_ELEMENT (ffmpegenc), ffmpegenc->sinkpad); + gst_element_add_pad (GST_ELEMENT (ffmpegenc), ffmpegenc->srcpad); } static void @@ -404,8 +404,10 @@ GST_BUFFER_MAXSIZE (outbuf), ffmpegenc->picture); if (ret_size < 0) { - g_warning ("ffenc_%s: failed to encode buffer", oclass->in_plugin->name); + GST_ELEMENT_ERROR (ffmpegenc, LIBRARY, ENCODE, (NULL), + ("ffenc_%s: failed to encode buffer", oclass->in_plugin->name)); gst_buffer_unref (inbuf); + gst_buffer_unref (outbuf); return; |
From: <rb...@fr...> - 2004-10-24 22:24:59
|
CVS Root: /home/cvs/gstreamer Module: gst-ffmpeg Changes by: rbultje Date: Sun Oct 24 2004 15:24:56 PDT Log message: * ext/ffmpeg/gstffmpegcodecmap.c: (gst_ffmpeg_get_codecid_longname): * ext/ffmpeg/gstffmpegcodecmap.h: * ext/ffmpeg/gstffmpegdec.c: (gst_ffmpegdec_base_init), (gst_ffmpegdec_register): * ext/ffmpeg/gstffmpegenc.c: (gst_ffmpegenc_base_init), (gst_ffmpegenc_register): Hmm, fancy names... Modified files: . : ChangeLog ext/ffmpeg : gstffmpegcodecmap.c gstffmpegcodecmap.h gstffmpegdec.c gstffmpegenc.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-ffmpeg/ChangeLog.diff?r1=1.84&r2=1.85 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-ffmpeg/ext/ffmpeg/gstffmpegcodecmap.c.diff?r1=1.62&r2=1.63 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-ffmpeg/ext/ffmpeg/gstffmpegcodecmap.h.diff?r1=1.9&r2=1.10 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-ffmpeg/ext/ffmpeg/gstffmpegdec.c.diff?r1=1.65&r2=1.66 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-ffmpeg/ext/ffmpeg/gstffmpegenc.c.diff?r1=1.49&r2=1.50 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /home/cvs/gstreamer/gst-ffmpeg/ChangeLog,v retrieving revision 1.84 retrieving revision 1.85 diff -u -d -r1.84 -r1.85 --- ChangeLog 20 Oct 2004 11:48:35 -0000 1.84 +++ ChangeLog 24 Oct 2004 22:24:43 -0000 1.85 @@ -1,3 +1,14 @@ +2004-10-25 Ronald S. Bultje <rb...@ro...> + + * ext/ffmpeg/gstffmpegcodecmap.c: + (gst_ffmpeg_get_codecid_longname): + * ext/ffmpeg/gstffmpegcodecmap.h: + * ext/ffmpeg/gstffmpegdec.c: (gst_ffmpegdec_base_init), + (gst_ffmpegdec_register): + * ext/ffmpeg/gstffmpegenc.c: (gst_ffmpegenc_base_init), + (gst_ffmpegenc_register): + Hmm, fancy names... 2004-10-20 Thomas Vander Stichele <thomas at apestaart dot org> * configure.ac: up req of GStreamer since we use fractions Index: gstffmpegcodecmap.c RCS file: /home/cvs/gstreamer/gst-ffmpeg/ext/ffmpeg/gstffmpegcodecmap.c,v retrieving revision 1.62 retrieving revision 1.63 diff -u -d -r1.62 -r1.63 --- gstffmpegcodecmap.c 4 Oct 2004 16:11:30 -0000 1.62 +++ gstffmpegcodecmap.c 24 Oct 2004 22:24:43 -0000 1.63 @@ -1685,3 +1685,267 @@ return id; } +G_CONST_RETURN gchar * +gst_ffmpeg_get_codecid_longname (enum CodecID codec_id) +{ + const gchar *name = NULL; + switch (codec_id) { + case CODEC_ID_MPEG1VIDEO: + name = "MPEG-1 video"; + break; + case CODEC_ID_MPEG2VIDEO: + name = "MPEG-2 video"; + case CODEC_ID_H263: + name = "H.263 video"; + case CODEC_ID_RV10: + name = "Realvideo 1.0"; + case CODEC_ID_RV20: + name = "Realvideo 2.0"; + case CODEC_ID_MP2: + name = "MPEG-1 layer 2 audio"; + case CODEC_ID_MP3: + name = "MPEG-1 layer 3 audio"; + case CODEC_ID_VORBIS: + name = "Vorbis audio"; + case CODEC_ID_AC3: + name = "AC-3 audio"; + case CODEC_ID_MJPEG: + name = "Motion-JPEG"; + case CODEC_ID_MJPEGB: + name = "Quicktime Motion-JPEG B"; + case CODEC_ID_LJPEG: + name = "Lossless JPEG"; + case CODEC_ID_SP5X: + name = "Sp5x-like JPEG"; + case CODEC_ID_MPEG4: + name = "MPEG-4 compatible video"; + case CODEC_ID_MSMPEG4V1: + name = "Microsoft MPEG-4 v1"; + case CODEC_ID_MSMPEG4V2: + name = "Microsoft MPEG-4 v2"; + case CODEC_ID_MSMPEG4V3: + name = "Microsoft MPEG-4 v3"; + case CODEC_ID_WMV1: + name = "Windows Media Video v7"; + case CODEC_ID_WMV2: + name = "Windows Media Video v8"; + case CODEC_ID_H263P: + name = "H.263 (P) video"; + case CODEC_ID_H263I: + name = "H.263 (I) video"; + case CODEC_ID_FLV1: + name = "FLV video"; + case CODEC_ID_SVQ1: + name = "Sorensen-1 video"; + case CODEC_ID_SVQ3: + name = "Sorensen-3 video"; + case CODEC_ID_DVVIDEO: + name = "Digital video"; + case CODEC_ID_DVAUDIO: + name = "Digital audio"; + case CODEC_ID_WMAV1: + name = "Windows Media Audio v7"; + case CODEC_ID_WMAV2: + name = "Windows Media Audion v8/9"; + case CODEC_ID_MACE3: + name = "MACE-3 audio"; + case CODEC_ID_MACE6: + name = "MACE-6 audio"; + case CODEC_ID_HUFFYUV: + name = "Huffyuv lossless video"; + case CODEC_ID_CYUV: + name = "CYUV lossless video"; + case CODEC_ID_H264: + name = "H.264 video"; + case CODEC_ID_INDEO3: + name = "Indeo-3 video"; + case CODEC_ID_VP3: + name = "VP3 video"; + case CODEC_ID_THEORA: + name = "Theora video"; + case CODEC_ID_AAC: + case CODEC_ID_MPEG4AAC: + name = "MPEG-2/4 AAC audio"; + case CODEC_ID_ASV1: + name = "Asus video v1"; + case CODEC_ID_ASV2: + name = "Asus video v2"; + case CODEC_ID_FFV1: + name = "FFMpeg video v1"; + case CODEC_ID_4XM: + name = "4-XM video"; + case CODEC_ID_VCR1: + name = "ATI VCR-1 video"; + case CODEC_ID_CLJR: + name = "Cirrus Logipak AccuPak video"; + case CODEC_ID_MDEC: + name = "Playstation MDEC video"; + case CODEC_ID_ROQ: + name = "ID/RoQ video"; + case CODEC_ID_INTERPLAY_VIDEO: + name = "Interplay video"; + case CODEC_ID_XAN_WC3: + name = "XAN Wing Commander 3 video"; + case CODEC_ID_XAN_WC4: + name = "XAN Wing Commander 4 video"; + case CODEC_ID_RPZA: + name = "Apple RPZA video"; + case CODEC_ID_CINEPAK: + name = "Cinepak video"; + case CODEC_ID_WS_VQA: + name = "Westwood VQA video"; + case CODEC_ID_MSRLE: + name = "Microsoft RLE video"; + case CODEC_ID_MSVIDEO1: + name = "Microsoft video v1"; + case CODEC_ID_IDCIN: + name = "ID Quake II CIN video"; + case CODEC_ID_8BPS: + name = "Quicktime planar 8bps video"; + case CODEC_ID_SMC: + name = "Quicktime SMC graphics video"; + case CODEC_ID_FLIC: + name = "FLIC animation video"; + case CODEC_ID_TRUEMOTION1: + name = "Duck Truemotion video"; + case CODEC_ID_VMDVIDEO: + name = "Sierra VMD video"; + case CODEC_ID_VMDAUDIO: + name = "Sierra VMD audio"; + case CODEC_ID_MSZH: + name = "Lossless MSZH video"; + case CODEC_ID_ZLIB: + name = "Lossless zlib video"; + case CODEC_ID_QTRLE: + name = "Quicktime RLE animation video"; + case CODEC_ID_PCM_MULAW: + name = "Mu-law audio"; + case CODEC_ID_PCM_ALAW: + name = "A-law audio"; + case CODEC_ID_ADPCM_IMA_QT: + name = "IMA/Quicktime ADPCM audio"; + case CODEC_ID_ADPCM_IMA_WAV: + name = "IMA/DVI ADPCM audio"; + case CODEC_ID_ADPCM_IMA_DK3: + name = "IMA/DK3 ADPCM audio"; + case CODEC_ID_ADPCM_IMA_DK4: + name = "IMA/DK4 ADPCM"; + case CODEC_ID_ADPCM_IMA_WS: + name = "IMA/Westwood ADPCM audio"; + case CODEC_ID_ADPCM_IMA_SMJPEG: + name = "IMA/SMJPEG ADPCM audio"; + case CODEC_ID_ADPCM_MS: + name = "Microsoft ADPCM audio"; + case CODEC_ID_ADPCM_4XM: + name = "4-XM ADPCM audio"; + case CODEC_ID_ADPCM_XA: + name = "CD-ROM XA ADPCM"; + case CODEC_ID_ADPCM_ADX: + name = "ADX ADPCM"; + case CODEC_ID_ADPCM_EA: + name = "Electronic Arts ADPCM"; + case CODEC_ID_ADPCM_G726: + name = "G.726 ADPCM"; + case CODEC_ID_RA_144: + name = "Realaudio 14k4bps"; + case CODEC_ID_RA_288: + name = "Realaudio 28k8bps"; + case CODEC_ID_ROQ_DPCM: + name = "RoQ DPCM audio"; + case CODEC_ID_INTERPLAY_DPCM: + name = "Interplay DPCM audio"; + case CODEC_ID_XAN_DPCM: + name = "XAN DPCM audio"; + case CODEC_ID_FLAC: + name = "FLAC lossless audio"; + default: + GST_WARNING ("Unknown codecID 0x%x", codec_id); + } + return name; +} Index: gstffmpegcodecmap.h RCS file: /home/cvs/gstreamer/gst-ffmpeg/ext/ffmpeg/gstffmpegcodecmap.h,v retrieving revision 1.9 retrieving revision 1.10 diff -u -d -r1.9 -r1.10 --- gstffmpegcodecmap.h 7 Jul 2004 15:12:02 -0000 1.9 +++ gstffmpegcodecmap.h 24 Oct 2004 22:24:43 -0000 1.10 @@ -87,9 +87,20 @@ GstCaps * gst_ffmpeg_formatid_to_caps (const gchar *format_name); +/* + * Since FFMpeg has such really cool and useful descriptions + * of its codecs, we use our own... + */ +gst_ffmpeg_get_codecid_longname (enum CodecID codec_id); + * FFMPEG debugging function; maybe move to a different file. -/* FFMPEG debugging function; maybe move to a different file */ GST_DEBUG_CATEGORY_EXTERN (ffmpeg_debug); static void gst_ffmpeg_log_callback (void * ptr, int level, const char * fmt, va_list vl); Index: gstffmpegdec.c RCS file: /home/cvs/gstreamer/gst-ffmpeg/ext/ffmpeg/gstffmpegdec.c,v retrieving revision 1.65 retrieving revision 1.66 diff -u -d -r1.65 -r1.66 --- gstffmpegdec.c 9 Oct 2004 16:13:31 -0000 1.65 +++ gstffmpegdec.c 24 Oct 2004 22:24:43 -0000 1.66 @@ -135,7 +135,7 @@ /* construct the element details struct */ details.longname = g_strdup_printf ("FFMPEG %s decoder", - params->in_plugin->name); + gst_ffmpeg_get_codecid_longname (params->in_plugin->id)); details.klass = g_strdup_printf ("Codec/Decoder/%s", (params->in_plugin->type == CODEC_TYPE_VIDEO) ? "Video" : "Audio"); details.description = g_strdup_printf ("FFMPEG %s decoder", @@ -568,6 +568,10 @@ goto next; } + /* name */ + if (!gst_ffmpeg_get_codecid_longname (in_plugin->id)) + goto next; /* first make sure we've got a supported type */ sinkcaps = gst_ffmpeg_codecid_to_caps (in_plugin->id, NULL, FALSE); srccaps = gst_ffmpeg_codectype_to_caps (in_plugin->type, NULL); Index: gstffmpegenc.c RCS file: /home/cvs/gstreamer/gst-ffmpeg/ext/ffmpeg/gstffmpegenc.c,v retrieving revision 1.49 retrieving revision 1.50 diff -u -d -r1.49 -r1.50 --- gstffmpegenc.c 11 Oct 2004 08:21:16 -0000 1.49 +++ gstffmpegenc.c 24 Oct 2004 22:24:43 -0000 1.50 @@ -165,7 +165,7 @@ details.longname = g_strdup_printf ("FFMPEG %s encoder", details.klass = g_strdup_printf ("Codec/Encoder/%s", details.description = g_strdup_printf ("FFMPEG %s encoder", @@ -629,6 +629,10 @@ srccaps = gst_ffmpeg_codecid_to_caps (in_plugin->id, NULL, TRUE); sinkcaps = gst_ffmpeg_codectype_to_caps (in_plugin->type, NULL); |
From: <rb...@fr...> - 2004-10-25 11:57:08
|
CVS Root: /home/cvs/gstreamer Module: gst-ffmpeg Changes by: rbultje Date: Mon Oct 25 2004 04:57:04 PDT Log message: * ext/ffmpeg/gstffmpegcodecmap.c: (gst_ffmpeg_codecid_to_caps), (gst_ffmpeg_codectype_to_caps), (gst_ffmpeg_caps_with_codecid): * ext/ffmpeg/gstffmpegenc.c: (gst_ffmpegenc_base_init), (gst_ffmpegenc_connect), (gst_ffmpegenc_register): Fix encoders. Fix if encoder supports >1 caps. Modified files: . : ChangeLog ext/ffmpeg : gstffmpegcodecmap.c gstffmpegenc.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-ffmpeg/ChangeLog.diff?r1=1.85&r2=1.86 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-ffmpeg/ext/ffmpeg/gstffmpegcodecmap.c.diff?r1=1.63&r2=1.64 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-ffmpeg/ext/ffmpeg/gstffmpegenc.c.diff?r1=1.50&r2=1.51 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /home/cvs/gstreamer/gst-ffmpeg/ChangeLog,v retrieving revision 1.85 retrieving revision 1.86 diff -u -d -r1.85 -r1.86 --- ChangeLog 24 Oct 2004 22:24:43 -0000 1.85 +++ ChangeLog 25 Oct 2004 11:56:52 -0000 1.86 @@ -1,5 +1,13 @@ 2004-10-25 Ronald S. Bultje <rb...@ro...> + * ext/ffmpeg/gstffmpegcodecmap.c: (gst_ffmpeg_codecid_to_caps), + (gst_ffmpeg_codectype_to_caps), (gst_ffmpeg_caps_with_codecid): + * ext/ffmpeg/gstffmpegenc.c: (gst_ffmpegenc_base_init), + (gst_ffmpegenc_connect), (gst_ffmpegenc_register): + Fix encoders. Fix if encoder supports >1 caps. + +2004-10-25 Ronald S. Bultje <rb...@ro...> * ext/ffmpeg/gstffmpegcodecmap.c: (gst_ffmpeg_get_codecid_longname): * ext/ffmpeg/gstffmpegcodecmap.h: Index: gstffmpegcodecmap.c RCS file: /home/cvs/gstreamer/gst-ffmpeg/ext/ffmpeg/gstffmpegcodecmap.c,v retrieving revision 1.63 retrieving revision 1.64 diff -u -d -r1.63 -r1.64 --- gstffmpegcodecmap.c 24 Oct 2004 22:24:43 -0000 1.63 +++ gstffmpegcodecmap.c 25 Oct 2004 11:56:52 -0000 1.64 @@ -241,15 +241,10 @@ break; case CODEC_ID_MPEG4: - if (encode) { + if (encode && context != NULL) { /* I'm not exactly sure what ffmpeg outputs... ffmpeg itself uses * the AVI fourcc 'DIVX', but 'mp4v' for Quicktime... */ - guint32 fourcc = 0; - - if (context) - fourcc = context->codec_tag; - switch (fourcc) { + switch (context->codec_tag) { case GST_MAKE_FOURCC ('D', 'I', 'V', 'X'): caps = GST_FF_VID_CAPS_NEW ("video/x-divx", "divxversion", G_TYPE_INT, 5, NULL); @@ -267,10 +262,15 @@ caps = GST_FF_VID_CAPS_NEW ("video/mpeg", "mpegversion", G_TYPE_INT, 4, "systemstream", G_TYPE_BOOLEAN, FALSE, NULL); - gst_caps_append (caps, GST_FF_VID_CAPS_NEW ("video/x-divx", - "divxversion", GST_TYPE_INT_RANGE, 4, 5, NULL)); - gst_caps_append (caps, GST_FF_VID_CAPS_NEW ("video/x-xvid", NULL)); - gst_caps_append (caps, GST_FF_VID_CAPS_NEW ("video/x-3ivx", NULL)); + if (encode) { + gst_caps_append (caps, GST_FF_VID_CAPS_NEW ("video/x-divx", + "divxversion", G_TYPE_INT, 5, NULL)); + } else { + "divxversion", GST_TYPE_INT_RANGE, 4, 5, NULL)); + gst_caps_append (caps, GST_FF_VID_CAPS_NEW ("video/x-xvid", NULL)); + gst_caps_append (caps, GST_FF_VID_CAPS_NEW ("video/x-3ivx", NULL)); + } } @@ -901,7 +901,8 @@ switch (codec_type) { case CODEC_TYPE_VIDEO: if (context) { - caps = gst_ffmpeg_pixfmt_to_caps (context->pix_fmt, context); + caps = gst_ffmpeg_pixfmt_to_caps (context->pix_fmt, + context->width == -1 ? NULL : context); } else { GstCaps *temp; enum PixelFormat i; @@ -1201,6 +1202,9 @@ } + if (!gst_caps_is_fixed (caps)) + return; /* common properties (width, height, fps) */ Index: gstffmpegenc.c RCS file: /home/cvs/gstreamer/gst-ffmpeg/ext/ffmpeg/gstffmpegenc.c,v retrieving revision 1.50 retrieving revision 1.51 diff -u -d -r1.50 -r1.51 --- gstffmpegenc.c 24 Oct 2004 22:24:43 -0000 1.50 +++ gstffmpegenc.c 25 Oct 2004 11:56:52 -0000 1.51 @@ -154,6 +154,7 @@ GstFFMpegEncClassParams *params; GstElementDetails details; GstPadTemplate *srctempl, *sinktempl; + AVCodecContext *ctx; params = g_hash_table_lookup (enc_global_plugins, GINT_TO_POINTER (G_OBJECT_CLASS_TYPE (gobject_class))); @@ -177,6 +178,28 @@ g_free (details.klass); g_free (details.description); + /* get pix_fmt for this encoder */ + if (params->in_plugin->type == CODEC_TYPE_VIDEO && + (ctx = avcodec_alloc_context ()) != NULL) { + ctx->width = 384; + ctx->height = 288; + ctx->frame_rate_base = DEFAULT_FRAME_RATE_BASE; + ctx->frame_rate = 25 * DEFAULT_FRAME_RATE_BASE; + ctx->bit_rate = 350 * 1000; + /* makes it silent */ + ctx->strict_std_compliance = -1; + if (avcodec_open (ctx, params->in_plugin) >= 0) { + gst_caps_free (params->sinkcaps); + ctx->width = -1; + params->sinkcaps = + gst_ffmpeg_codectype_to_caps (params->in_plugin->type, ctx); + } + /* FIXME: ffmpeg likes to crash on this */ + //avcodec_close (ctx); + av_free (ctx); + } /* pad templates */ sinktempl = gst_pad_template_new ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, params->sinkcaps); @@ -337,20 +360,24 @@ return GST_PAD_LINK_REFUSED; + /* some codecs support more than one format, first auto-choose one */ + allowed_caps = gst_pad_get_allowed_caps (ffmpegenc->srcpad); + gst_ffmpeg_caps_with_codecid (oclass->in_plugin->id, + oclass->in_plugin->type, allowed_caps, ffmpegenc->context); /* try to set this caps on the other side */ other_caps = gst_ffmpeg_codecid_to_caps (oclass->in_plugin->id, ffmpegenc->context, TRUE); if (!other_caps) { avcodec_close (ffmpegenc->context); GST_DEBUG ("Unsupported codec - no caps found"); - allowed_caps = gst_pad_get_allowed_caps (ffmpegenc->srcpad); icaps = gst_caps_intersect (allowed_caps, other_caps); gst_caps_free (allowed_caps); gst_caps_free (other_caps); if (gst_caps_is_empty (icaps)) { gst_caps_free (icaps); @@ -361,7 +388,7 @@ newcaps = gst_caps_new_full (gst_structure_copy (gst_caps_get_structure (icaps, - 0)), NULL); + 0)), NULL); icaps = newcaps; @@ -619,6 +646,7 @@ /* no quasi codecs, please */ if (in_plugin->id == CODEC_ID_RAWVIDEO || + in_plugin->id == CODEC_ID_ZLIB || (in_plugin->id >= CODEC_ID_PCM_S16LE && in_plugin->id <= CODEC_ID_PCM_ALAW)) { goto next; |
From: <rb...@fr...> - 2004-10-25 21:26:50
|
CVS Root: /home/cvs/gstreamer Module: gst-ffmpeg Changes by: rbultje Date: Mon Oct 25 2004 14:26:46 PDT Log message: * ext/ffmpeg/gstffmpegcolorspace.c: (gst_ffmpegcsp_pad_link): Backport changes from ffmpegcolorspace (gst-plugins) so we can then move the whole of this plugin back and deprecate this (no, I'm not insane). Modified files: . : ChangeLog ext/ffmpeg : gstffmpegcolorspace.c Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-ffmpeg/ChangeLog.diff?r1=1.86&r2=1.87 http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-ffmpeg/ext/ffmpeg/gstffmpegcolorspace.c.diff?r1=1.23&r2=1.24 ====Begin Diffs==== Index: ChangeLog =================================================================== RCS file: /home/cvs/gstreamer/gst-ffmpeg/ChangeLog,v retrieving revision 1.86 retrieving revision 1.87 diff -u -d -r1.86 -r1.87 --- ChangeLog 25 Oct 2004 11:56:52 -0000 1.86 +++ ChangeLog 25 Oct 2004 21:26:34 -0000 1.87 @@ -1,5 +1,12 @@ 2004-10-25 Ronald S. Bultje <rb...@ro...> + * ext/ffmpeg/gstffmpegcolorspace.c: (gst_ffmpegcsp_pad_link): + Backport changes from ffmpegcolorspace (gst-plugins) so we can + then move the whole of this plugin back and deprecate this (no, + I'm not insane). + +2004-10-25 Ronald S. Bultje <rb...@ro...> * ext/ffmpeg/gstffmpegcodecmap.c: (gst_ffmpeg_codecid_to_caps), (gst_ffmpeg_codectype_to_caps), (gst_ffmpeg_caps_with_codecid): * ext/ffmpeg/gstffmpegenc.c: (gst_ffmpegenc_base_init), Index: gstffmpegcolorspace.c RCS file: /home/cvs/gstreamer/gst-ffmpeg/ext/ffmpeg/gstffmpegcolorspace.c,v retrieving revision 1.23 retrieving revision 1.24 diff -u -d -r1.23 -r1.24 --- gstffmpegcolorspace.c 2 Oct 2004 20:26:10 -0000 1.23 +++ gstffmpegcolorspace.c 25 Oct 2004 21:26:34 -0000 1.24 @@ -176,15 +176,20 @@ GstPadLinkReturn ret; int height, width; double framerate; + const GValue *par = NULL; space = GST_FFMPEGCSP (gst_pad_get_parent (pad)); + GST_DEBUG_OBJECT (space, "pad_link on %s:%s with caps %" GST_PTR_FORMAT, + GST_DEBUG_PAD_NAME (pad), caps); otherpad = (pad == space->srcpad) ? space->sinkpad : space->srcpad; structure = gst_caps_get_structure (caps, 0); gst_structure_get_int (structure, "width", &width); gst_structure_get_int (structure, "height", &height); gst_structure_get_double (structure, "framerate", &framerate); + par = gst_structure_get_value (structure, "pixel-aspect-ratio"); /* FIXME attempt and/or check for passthru */ @@ -218,6 +223,12 @@ "width", G_TYPE_INT, width, "height", G_TYPE_INT, height, "framerate", G_TYPE_DOUBLE, framerate, NULL); + if (par) { + gst_caps_set_simple (caps, + "pixel-aspect-ratio", GST_TYPE_FRACTION, + gst_value_get_fraction_numerator (par), + gst_value_get_fraction_denominator (par), NULL); + } ret = gst_pad_try_set_caps (otherpad, caps); if (GST_PAD_LINK_FAILED (ret)) { return ret; |