gsttaglist.h | gsttaglist.h | |||
---|---|---|---|---|
skipping to change at line 25 | skipping to change at line 25 | |||
* | * | |||
* You should have received a copy of the GNU Library General Public | * You should have received a copy of the GNU Library General Public | |||
* License along with this library; if not, write to the | * License along with this library; if not, write to the | |||
* Free Software Foundation, Inc., 59 Temple Place - Suite 330, | * Free Software Foundation, Inc., 59 Temple Place - Suite 330, | |||
* Boston, MA 02111-1307, USA. | * Boston, MA 02111-1307, USA. | |||
*/ | */ | |||
#ifndef __GST_TAGLIST_H__ | #ifndef __GST_TAGLIST_H__ | |||
#define __GST_TAGLIST_H__ | #define __GST_TAGLIST_H__ | |||
#include <gst/gstdatetime.h> | ||||
#include <gst/gstbuffer.h> | #include <gst/gstbuffer.h> | |||
#include <gst/gststructure.h> | #include <gst/gststructure.h> | |||
#include <gst/glib-compat.h> | #include <gst/glib-compat.h> | |||
G_BEGIN_DECLS | G_BEGIN_DECLS | |||
/** | /** | |||
* GstTagMergeMode: | * GstTagMergeMode: | |||
* @GST_TAG_MERGE_UNDEFINED: undefined merge mode | * @GST_TAG_MERGE_UNDEFINED: undefined merge mode | |||
* @GST_TAG_MERGE_REPLACE_ALL: replace all tags (clear list and append) | * @GST_TAG_MERGE_REPLACE_ALL: replace all tags (clear list and append) | |||
skipping to change at line 143 | skipping to change at line 144 | |||
typedef enum { | typedef enum { | |||
GST_TAG_FLAG_UNDEFINED, | GST_TAG_FLAG_UNDEFINED, | |||
GST_TAG_FLAG_META, | GST_TAG_FLAG_META, | |||
GST_TAG_FLAG_ENCODED, | GST_TAG_FLAG_ENCODED, | |||
GST_TAG_FLAG_DECODED, | GST_TAG_FLAG_DECODED, | |||
GST_TAG_FLAG_COUNT | GST_TAG_FLAG_COUNT | |||
} GstTagFlag; | } GstTagFlag; | |||
#define GST_TAG_FLAG_IS_VALID(flag) (((flag) > GST_TAG_FLAG_UNDEFINED) && ((flag) < GST_TAG_FLAG_COUNT)) | #define GST_TAG_FLAG_IS_VALID(flag) (((flag) > GST_TAG_FLAG_UNDEFINED) && ((flag) < GST_TAG_FLAG_COUNT)) | |||
/* FIXME 0.11: Don't typedef GstTagList to be a GstStructure, they're | ||||
* internally the same but not from an API point of view. | ||||
* See bug #518934. | ||||
*/ | ||||
/** | /** | |||
* GstTagList: | * GstTagList: | |||
* | * | |||
* Opaque #GstTagList data structure. | * Opaque #GstTagList data structure. | |||
*/ | */ | |||
#ifdef _FOOL_GTK_DOC_ | ||||
typedef struct _GstTagList GstTagList; | ||||
#else | ||||
#ifdef IN_GOBJECT_INTROSPECTION | ||||
typedef struct _GstTagList GstTagList; | ||||
#else | ||||
typedef GstStructure GstTagList; | typedef GstStructure GstTagList; | |||
#endif | ||||
#endif | ||||
#define GST_TAG_LIST(x) ((GstTagList *) (x)) | #define GST_TAG_LIST(x) ((GstTagList *) (x)) | |||
#define GST_IS_TAG_LIST(x) ((x) != NULL && gst_is_tag_list (GST_TAG_LIST (x))) | #define GST_IS_TAG_LIST(x) ((x) != NULL && gst_is_tag_list (GST_TAG_LIST (x))) | |||
#define GST_TYPE_TAG_LIST (gst_tag_list_get_type ()) | #define GST_TYPE_TAG_LIST (gst_tag_list_get_type ()) | |||
/** | /** | |||
* GstTagForeachFunc: | * GstTagForeachFunc: | |||
* @list: the #GstTagList | * @list: the #GstTagList | |||
* @tag: a name of a tag in @list | * @tag: a name of a tag in @list | |||
* @user_data: user data | * @user_data: user data | |||
* | * | |||
skipping to change at line 200 | skipping to change at line 214 | |||
/* basic tag support */ | /* basic tag support */ | |||
gboolean gst_tag_exists (const gchar * tag); | gboolean gst_tag_exists (const gchar * tag); | |||
GType gst_tag_get_type (const gchar * tag); | GType gst_tag_get_type (const gchar * tag); | |||
G_CONST_RETURN gchar * gst_tag_get_nick (const gchar * tag); | G_CONST_RETURN gchar * gst_tag_get_nick (const gchar * tag); | |||
G_CONST_RETURN gchar * gst_tag_get_description (const gchar * tag); | G_CONST_RETURN gchar * gst_tag_get_description (const gchar * tag); | |||
GstTagFlag gst_tag_get_flag (const gchar * tag); | GstTagFlag gst_tag_get_flag (const gchar * tag); | |||
gboolean gst_tag_is_fixed (const gchar * tag); | gboolean gst_tag_is_fixed (const gchar * tag); | |||
/* tag lists */ | /* tag lists */ | |||
GstTagList * gst_tag_list_new (void); | GstTagList * gst_tag_list_new (void); | |||
GstTagList * gst_tag_list_new_full (const gchar * tag, ...); | ||||
GstTagList * gst_tag_list_new_full_valist (va_list var_args); | ||||
gboolean gst_is_tag_list (gconstpointer p); | gboolean gst_is_tag_list (gconstpointer p); | |||
GstTagList * gst_tag_list_copy (const GstTagList * list); | GstTagList * gst_tag_list_copy (const GstTagList * list); | |||
gboolean gst_tag_list_is_empty (const GstTagList * list); | gboolean gst_tag_list_is_empty (const GstTagList * list); | |||
void gst_tag_list_insert (GstTagList * into, | void gst_tag_list_insert (GstTagList * into, | |||
const GstTagList * from, | const GstTagList * from, | |||
GstTagMergeMode mode); | GstTagMergeMode mode); | |||
GstTagList * gst_tag_list_merge (const GstTagList * list1, | GstTagList * gst_tag_list_merge (const GstTagList * list1, | |||
const GstTagList * list2, | const GstTagList * list2, | |||
GstTagMergeMode mode); | GstTagMergeMode mode); | |||
void gst_tag_list_free (GstTagList * list); | void gst_tag_list_free (GstTagList * list); | |||
skipping to change at line 228 | skipping to change at line 245 | |||
const gchar * tag, | const gchar * tag, | |||
...) G_GNUC_NULL_TERMINATED; | ...) G_GNUC_NULL_TERMINATED; | |||
void gst_tag_list_add_valist (GstTagList * list, | void gst_tag_list_add_valist (GstTagList * list, | |||
GstTagMergeMode mode, | GstTagMergeMode mode, | |||
const gchar * tag, | const gchar * tag, | |||
va_list var_args); | va_list var_args); | |||
void gst_tag_list_add_valist_values (GstTagList * list, | void gst_tag_list_add_valist_values (GstTagList * list, | |||
GstTagMergeMode mode, | GstTagMergeMode mode, | |||
const gchar * tag, | const gchar * tag, | |||
va_list var_args); | va_list var_args); | |||
void gst_tag_list_add_value (GstTagList * list, | ||||
GstTagMergeMode mode, | ||||
const gchar * tag, | ||||
const GValue * value); | ||||
void gst_tag_list_remove_tag (GstTagList * list, | void gst_tag_list_remove_tag (GstTagList * list, | |||
const gchar * tag); | const gchar * tag); | |||
void gst_tag_list_foreach (const GstTagList * list, | void gst_tag_list_foreach (const GstTagList * list, | |||
GstTagForeachFunc func, | GstTagForeachFunc func, | |||
gpointer user_data); | gpointer user_data); | |||
G_CONST_RETURN GValue * | G_CONST_RETURN GValue * | |||
gst_tag_list_get_value_index (const GstTagList * list, | gst_tag_list_get_value_index (const GstTagList * list, | |||
const gchar * tag, | const gchar * tag, | |||
guint index); | guint index); | |||
skipping to change at line 327 | skipping to change at line 348 | |||
const gchar * tag, | const gchar * tag, | |||
guint index, | guint index, | |||
gdouble * value); | gdouble * value); | |||
gboolean gst_tag_list_get_string (const GstTagList * list, | gboolean gst_tag_list_get_string (const GstTagList * list, | |||
const gchar * tag, | const gchar * tag, | |||
gchar ** value); | gchar ** value); | |||
gboolean gst_tag_list_get_string_index (const GstTagList * list, | gboolean gst_tag_list_get_string_index (const GstTagList * list, | |||
const gchar * tag, | const gchar * tag, | |||
guint index, | guint index, | |||
gchar ** value); | gchar ** value); | |||
gboolean gst_tag_list_peek_string_index (const GstTagList * list, | ||||
const gchar * tag, | ||||
guint index, | ||||
const gchar ** value); | ||||
gboolean gst_tag_list_get_pointer (const GstTagList * list, | gboolean gst_tag_list_get_pointer (const GstTagList * list, | |||
const gchar * tag, | const gchar * tag, | |||
gpointer * value); | gpointer * value); | |||
gboolean gst_tag_list_get_pointer_index (const GstTagList * list, | gboolean gst_tag_list_get_pointer_index (const GstTagList * list, | |||
const gchar * tag, | const gchar * tag, | |||
guint index, | guint index, | |||
gpointer * value); | gpointer * value); | |||
gboolean gst_tag_list_get_date (const GstTagList * list, | gboolean gst_tag_list_get_date (const GstTagList * list, | |||
const gchar * tag, | const gchar * tag, | |||
GDate ** value); | GDate ** value); | |||
gboolean gst_tag_list_get_date_index (const GstTagList * list, | gboolean gst_tag_list_get_date_index (const GstTagList * list, | |||
const gchar * tag, | const gchar * tag, | |||
guint index, | guint index, | |||
GDate ** value); | GDate ** value); | |||
gboolean gst_tag_list_get_date_time (const GstTagList * list, | ||||
const gchar * tag, | ||||
GstDateTime ** value); | ||||
gboolean gst_tag_list_get_date_time_index (const GstTagList * list, | ||||
const gchar * tag, | ||||
guint index, | ||||
GstDateTime ** value); | ||||
gboolean gst_tag_list_get_buffer (const GstTagList * list, | gboolean gst_tag_list_get_buffer (const GstTagList * list, | |||
const gchar * tag, | const gchar * tag, | |||
GstBuffer ** value); | GstBuffer ** value); | |||
gboolean gst_tag_list_get_buffer_index (const GstTagList * list, | gboolean gst_tag_list_get_buffer_index (const GstTagList * list, | |||
const gchar * tag, | const gchar * tag, | |||
guint index, | guint index, | |||
GstBuffer ** value); | GstBuffer ** value); | |||
/* GStreamer core tags */ | /* GStreamer core tags */ | |||
/** | /** | |||
skipping to change at line 408 | skipping to change at line 440 | |||
* GST_TAG_ALBUM_SORTNAME: | * GST_TAG_ALBUM_SORTNAME: | |||
* | * | |||
* album containing this data, as used for sorting (string) | * album containing this data, as used for sorting (string) | |||
* | * | |||
* The album name as it should be sorted, e.g. 'Jazz Guitar, The' | * The album name as it should be sorted, e.g. 'Jazz Guitar, The' | |||
* | * | |||
* Since: 0.10.15 | * Since: 0.10.15 | |||
*/ | */ | |||
#define GST_TAG_ALBUM_SORTNAME "album-sortname" | #define GST_TAG_ALBUM_SORTNAME "album-sortname" | |||
/** | /** | |||
* GST_TAG_ALBUM_ARTIST: | ||||
* | ||||
* The artist of the entire album, as it should be displayed. | ||||
* | ||||
* Since: 0.10.25 | ||||
*/ | ||||
#define GST_TAG_ALBUM_ARTIST "album-artist" | ||||
/** | ||||
* GST_TAG_ALBUM_ARTIST_SORTNAME: | ||||
* | ||||
* The artist of the entire album, as it should be sorted. | ||||
* | ||||
* Since: 0.10.25 | ||||
*/ | ||||
#define GST_TAG_ALBUM_ARTIST_SORTNAME "album-artist-sortname" | ||||
/** | ||||
* GST_TAG_COMPOSER: | * GST_TAG_COMPOSER: | |||
* | * | |||
* person(s) who composed the recording (string) | * person(s) who composed the recording (string) | |||
* | * | |||
* Since: 0.10.15 | * Since: 0.10.15 | |||
*/ | */ | |||
#define GST_TAG_COMPOSER "composer" | #define GST_TAG_COMPOSER "composer" | |||
/** | /** | |||
* GST_TAG_DATE: | * GST_TAG_DATE: | |||
* | * | |||
* date the data was created (#GDate structure) | * date the data was created (#GDate structure) | |||
*/ | */ | |||
#define GST_TAG_DATE "date" | #define GST_TAG_DATE "date" | |||
/** | /** | |||
* GST_TAG_DATE_TIME: | ||||
* | ||||
* date and time the data was created (#GstDateTime structure) | ||||
* | ||||
* Since: 0.10.31 | ||||
*/ | ||||
#define GST_TAG_DATE_TIME "datetime" | ||||
/** | ||||
* GST_TAG_GENRE: | * GST_TAG_GENRE: | |||
* | * | |||
* genre this data belongs to (string) | * genre this data belongs to (string) | |||
*/ | */ | |||
#define GST_TAG_GENRE "genre" | #define GST_TAG_GENRE "genre" | |||
/** | /** | |||
* GST_TAG_COMMENT: | * GST_TAG_COMMENT: | |||
* | * | |||
* free text commenting the data (string) | * free text commenting the data (string) | |||
*/ | */ | |||
skipping to change at line 584 | skipping to change at line 640 | |||
#define GST_TAG_AUDIO_CODEC "audio-codec" | #define GST_TAG_AUDIO_CODEC "audio-codec" | |||
/** | /** | |||
* GST_TAG_SUBTITLE_CODEC: | * GST_TAG_SUBTITLE_CODEC: | |||
* | * | |||
* codec/format the subtitle data is stored in (string) | * codec/format the subtitle data is stored in (string) | |||
* | * | |||
* Since: 0.10.23 | * Since: 0.10.23 | |||
*/ | */ | |||
#define GST_TAG_SUBTITLE_CODEC "subtitle-codec" | #define GST_TAG_SUBTITLE_CODEC "subtitle-codec" | |||
/** | /** | |||
* GST_TAG_CONTAINER_FORMAT: | ||||
* | ||||
* container format the data is stored in (string) | ||||
* | ||||
* Since: 0.10.24 | ||||
*/ | ||||
#define GST_TAG_CONTAINER_FORMAT "container-format" | ||||
/** | ||||
* GST_TAG_BITRATE: | * GST_TAG_BITRATE: | |||
* | * | |||
* exact or average bitrate in bits/s (unsigned integer) | * exact or average bitrate in bits/s (unsigned integer) | |||
*/ | */ | |||
#define GST_TAG_BITRATE "bitrate" | #define GST_TAG_BITRATE "bitrate" | |||
/** | /** | |||
* GST_TAG_NOMINAL_BITRATE: | * GST_TAG_NOMINAL_BITRATE: | |||
* | * | |||
* nominal bitrate in bits/s (unsigned integer) | * nominal bitrate in bits/s (unsigned integer) | |||
*/ | */ | |||
skipping to change at line 752 | skipping to change at line 816 | |||
/** | /** | |||
* GST_TAG_GEO_LOCATION_ELEVATION: | * GST_TAG_GEO_LOCATION_ELEVATION: | |||
* | * | |||
* geo elevation of where the media has been recorded or produced in meters | * geo elevation of where the media has been recorded or produced in meters | |||
* according to WGS84 (zero is average sea level) (double). | * according to WGS84 (zero is average sea level) (double). | |||
* | * | |||
* Since: 0.10.21 | * Since: 0.10.21 | |||
*/ | */ | |||
#define GST_TAG_GEO_LOCATION_ELEVATION "geo-location-elevatio n" | #define GST_TAG_GEO_LOCATION_ELEVATION "geo-location-elevatio n" | |||
/** | ||||
* GST_TAG_GEO_LOCATION_COUNTRY: | ||||
* | ||||
* The country (english name) where the media has been produced (string). | ||||
* | ||||
* Since: 0.10.29 | ||||
*/ | ||||
#define GST_TAG_GEO_LOCATION_COUNTRY "geo-location-country" | ||||
/** | ||||
* GST_TAG_GEO_LOCATION_CITY: | ||||
* | ||||
* The city (english name) where the media has been produced (string). | ||||
* | ||||
* Since: 0.10.29 | ||||
*/ | ||||
#define GST_TAG_GEO_LOCATION_CITY "geo-location-city" | ||||
/** | ||||
* GST_TAG_GEO_LOCATION_SUBLOCATION: | ||||
* | ||||
* A location 'smaller' than GST_TAG_GEO_LOCATION_CITY that specifies bette | ||||
r | ||||
* where the media has been produced. (e.g. the neighborhood) (string). | ||||
* | ||||
* This tag has been added as this is how it is handled/named in XMP's | ||||
* Iptc4xmpcore schema. | ||||
* | ||||
* Since: 0.10.29 | ||||
*/ | ||||
#define GST_TAG_GEO_LOCATION_SUBLOCATION "geo-location-sublocat | ||||
ion" | ||||
/** | ||||
* GST_TAG_GEO_LOCATION_HORIZONTAL_ERROR: | ||||
* | ||||
* Represents the expected error on the horizontal positioning in | ||||
* meters (double). | ||||
* | ||||
* Since: 0.10.31 | ||||
*/ | ||||
#define GST_TAG_GEO_LOCATION_HORIZONTAL_ERROR "geo-location-horizontal-er | ||||
ror" | ||||
/** | ||||
* GST_TAG_GEO_LOCATION_MOVEMENT_SPEED: | ||||
* | ||||
* Speed of the capturing device when performing the capture. | ||||
* Represented in m/s. (double) | ||||
* | ||||
* See also #GST_TAG_GEO_LOCATION_MOVEMENT_DIRECTION | ||||
* | ||||
* Since 0.10.30 | ||||
*/ | ||||
#define GST_TAG_GEO_LOCATION_MOVEMENT_SPEED "geo-location-movement-sp | ||||
eed" | ||||
/** | ||||
* GST_TAG_GEO_LOCATION_MOVEMENT_DIRECTION: | ||||
* | ||||
* Indicates the movement direction of the device performing the capture | ||||
* of a media. It is represented as degrees in floating point representatio | ||||
n, | ||||
* 0 means the geographic north, and increases clockwise (double from 0 to | ||||
360) | ||||
* | ||||
* See also #GST_TAG_GEO_LOCATION_CAPTURE_DIRECTION | ||||
* | ||||
* Since: 0.10.30 | ||||
*/ | ||||
#define GST_TAG_GEO_LOCATION_MOVEMENT_DIRECTION "geo-location-movement-dire | ||||
ction" | ||||
/** | ||||
* GST_TAG_GEO_LOCATION_CAPTURE_DIRECTION: | ||||
* | ||||
* Indicates the direction the device is pointing to when capturing | ||||
* a media. It is represented as degrees in floating point representation, | ||||
* 0 means the geographic north, and increases clockwise (double from 0 to | ||||
360) | ||||
* | ||||
* See also #GST_TAG_GEO_LOCATION_MOVEMENT_DIRECTION | ||||
* | ||||
* Since: 0.10.30 | ||||
*/ | ||||
#define GST_TAG_GEO_LOCATION_CAPTURE_DIRECTION "geo-location-capture-direc | ||||
tion" | ||||
/** | ||||
* GST_TAG_SHOW_NAME: | ||||
* | ||||
* Name of the show, used for displaying (string) | ||||
* | ||||
* Since: 0.10.26 | ||||
*/ | ||||
#define GST_TAG_SHOW_NAME "show-name" | ||||
/** | ||||
* GST_TAG_SHOW_SORTNAME: | ||||
* | ||||
* Name of the show, used for sorting (string) | ||||
* | ||||
* Since: 0.10.26 | ||||
*/ | ||||
#define GST_TAG_SHOW_SORTNAME "show-sortname" | ||||
/** | ||||
* GST_TAG_SHOW_EPISODE_NUMBER: | ||||
* | ||||
* Number of the episode within a season/show (unsigned integer) | ||||
* | ||||
* Since: 0.10.26 | ||||
*/ | ||||
#define GST_TAG_SHOW_EPISODE_NUMBER "show-episode-number" | ||||
/** | ||||
* GST_TAG_SHOW_SEASON_NUMBER: | ||||
* | ||||
* Number of the season of a show/series (unsigned integer) | ||||
* | ||||
* Since: 0.10.26 | ||||
*/ | ||||
#define GST_TAG_SHOW_SEASON_NUMBER "show-season-number" | ||||
/** | ||||
* GST_TAG_LYRICS: | ||||
* | ||||
* The lyrics of the media (string) | ||||
* | ||||
* Since: 0.10.26 | ||||
*/ | ||||
#define GST_TAG_LYRICS "lyrics" | ||||
/** | ||||
* GST_TAG_COMPOSER_SORTNAME: | ||||
* | ||||
* The composer's name, used for sorting (string) | ||||
* | ||||
* Since: 0.10.26 | ||||
*/ | ||||
#define GST_TAG_COMPOSER_SORTNAME "composer-sortname" | ||||
/** | ||||
* GST_TAG_GROUPING: | ||||
* | ||||
* Groups together media that are related and spans multiple tracks. An | ||||
* example are multiple pieces of a concerto. (string) | ||||
* | ||||
* Since: 0.10.26 | ||||
*/ | ||||
#define GST_TAG_GROUPING "grouping" | ||||
/** | ||||
* GST_TAG_USER_RATING: | ||||
* | ||||
* Rating attributed by a person (likely the application user). | ||||
* The higher the value, the more the user likes this media | ||||
* (unsigned int from 0 to 100) | ||||
* | ||||
* Since: 0.10.29 | ||||
*/ | ||||
#define GST_TAG_USER_RATING "user-rating" | ||||
/** | ||||
* GST_TAG_DEVICE_MANUFACTURER: | ||||
* | ||||
* Manufacturer of the device used to create the media (string) | ||||
* | ||||
* Since: 0.10.30 | ||||
*/ | ||||
#define GST_TAG_DEVICE_MANUFACTURER "device-manufacturer" | ||||
/** | ||||
* GST_TAG_DEVICE_MODEL: | ||||
* | ||||
* Model of the device used to create the media (string) | ||||
* | ||||
* Since: 0.10.30 | ||||
*/ | ||||
#define GST_TAG_DEVICE_MODEL "device-model" | ||||
/** | ||||
* GST_TAG_APPLICATION_NAME: | ||||
* | ||||
* Name of the application used to create the media (string) | ||||
* | ||||
* Since: 0.10.31 | ||||
*/ | ||||
#define GST_TAG_APPLICATION_NAME "application-name" | ||||
/** | ||||
* GST_TAG_APPLICATION_DATA: | ||||
* | ||||
* Arbitrary application data (buffer) | ||||
* | ||||
* Some formats allow application's to add their own arbitrary data | ||||
* into files. This data is application's dependent. | ||||
* | ||||
* Since: 0.10.31 | ||||
*/ | ||||
#define GST_TAG_APPLICATION_DATA "application-data" | ||||
/** | ||||
* GST_TAG_IMAGE_ORIENTATION: | ||||
* | ||||
* Represents the 'Orientation' tag from EXIF. Defines how the image | ||||
* should be rotated and mirrored for display. (string) | ||||
* | ||||
* This tag has a predefined set of allowed values: | ||||
* "rotate-0" | ||||
* "rotate-90" | ||||
* "rotate-180" | ||||
* "rotate-270" | ||||
* "flip-rotate-0" | ||||
* "flip-rotate-90" | ||||
* "flip-rotate-180" | ||||
* "flip-rotate-270" | ||||
* | ||||
* The naming is adopted according to a possible transformation to perform | ||||
* on the image to fix its orientation, obviously equivalent operations wil | ||||
l | ||||
* yield the same result. | ||||
* | ||||
* Rotations indicated by the values are in clockwise direction and | ||||
* 'flip' means an horizontal mirroring. | ||||
* | ||||
* Since: 0.10.30 | ||||
*/ | ||||
#define GST_TAG_IMAGE_ORIENTATION "image-orientation" | ||||
G_END_DECLS | G_END_DECLS | |||
#endif /* __GST_TAGLIST_H__ */ | #endif /* __GST_TAGLIST_H__ */ | |||
End of changes. 12 change blocks. | ||||
0 lines changed or deleted | 274 lines changed or added | |||
This html diff was produced by rfcdiff 1.41. The latest version is available from http://tools.ietf.org/tools/rfcdiff/ |