diff --git a/doc/APIchanges b/doc/APIchanges index 7611587de4..48d791951a 100644 --- a/doc/APIchanges +++ b/doc/APIchanges @@ -15,6 +15,10 @@ libavutil: 2012-10-22 API changes, most recent first: +2013-04-10 - xxxxxxx - lavu 25.26.100 - avutil.h,opt.h + Add av_int_list_length() + and av_opt_set_int_list(). + 2013-03-30 - xxxxxxx - lavu 52.24.100 - samplefmt.h Add av_samples_alloc_array_and_samples(). diff --git a/libavutil/avutil.h b/libavutil/avutil.h index 78deff1fd8..d71eb1ef4c 100644 --- a/libavutil/avutil.h +++ b/libavutil/avutil.h @@ -252,6 +252,27 @@ static inline void *av_x_if_null(const void *p, const void *x) return (void *)(intptr_t)(p ? p : x); } +/** + * Compute the length of an integer list. + * + * @param elsize size in bytes of each list element (only 1, 2, 4 or 8) + * @param term list terminator (usually 0 or -1) + * @param list pointer to the list + * @return length of the list, in elements, not counting the terminator + */ +unsigned av_int_list_length_for_size(unsigned elsize, + const void *list, uint64_t term); + +/** + * Compute the length of an integer list. + * + * @param term list terminator (usually 0 or -1) + * @param list pointer to the list + * @return length of the list, in elements, not counting the terminator + */ +#define av_int_list_length(list, term) \ + av_int_list_length_for_size(sizeof(*list), list, term) + /** * @} * @} diff --git a/libavutil/opt.h b/libavutil/opt.h index 30f729e447..e368259455 100644 --- a/libavutil/opt.h +++ b/libavutil/opt.h @@ -656,6 +656,20 @@ int av_opt_set_image_size(void *obj, const char *name, int w, int h, int search_ int av_opt_set_pixel_fmt (void *obj, const char *name, enum AVPixelFormat fmt, int search_flags); int av_opt_set_sample_fmt(void *obj, const char *name, enum AVSampleFormat fmt, int search_flags); int av_opt_set_video_rate(void *obj, const char *name, AVRational val, int search_flags); + +/** + * Set a binary option to an integer list. + * + * @param obj AVClass object to set options on + * @param name name of the binary option + * @param val pointer to an integer list (must have the correct type with + * regard to the contents of the list) + * @param term list terminator (usually 0 or -1) + * @param flags search flags + */ +#define av_opt_set_int_list(obj, name, val, term, flags) \ + av_opt_set_bin(obj, name, (const uint8_t *)val, \ + av_int_list_length(val, term) * sizeof(*val), flags) /** * @} */ diff --git a/libavutil/utils.c b/libavutil/utils.c index fbfbc49e1c..291c736454 100644 --- a/libavutil/utils.c +++ b/libavutil/utils.c @@ -79,3 +79,22 @@ char av_get_picture_type_char(enum AVPictureType pict_type) default: return '?'; } } + +unsigned av_int_list_length_for_size(unsigned elsize, + const void *list, uint64_t term) +{ + unsigned i; + + if (!list) + return 0; +#define LIST_LENGTH(type) \ + { type t = term, *l = list; for (i = 0; l[i] != t; i++); } + switch (elsize) { + case 1: LIST_LENGTH(uint8_t); break; + case 2: LIST_LENGTH(uint16_t); break; + case 4: LIST_LENGTH(uint32_t); break; + case 8: LIST_LENGTH(uint64_t); break; + default: av_assert0(!"valid element size"); + } + return i; +}