From e296f1b1c4f0b8d4d33f83036a80fd602aca7dea Mon Sep 17 00:00:00 2001 From: Nicolas George Date: Sun, 29 Apr 2012 11:10:17 +0200 Subject: [PATCH] lavc: implement accessors for some AVFrame fields. Compared to av_opt_ptr, accessors bring: - better performance (negligible); - compile-time type check; - link-time existence check (or at worst, a dynamic linker error instead of a NULL dereference). --- libavcodec/avcodec.h | 22 ++++++++++++++++++---- libavcodec/utils.c | 9 +++++++++ libavcodec/version.h | 4 ++-- 3 files changed, 29 insertions(+), 6 deletions(-) diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h index b2279ea9ef..2e56a021db 100644 --- a/libavcodec/avcodec.h +++ b/libavcodec/avcodec.h @@ -1244,7 +1244,7 @@ typedef struct AVFrame { /** * frame timestamp estimated using various heuristics, in stream time base * Code outside libavcodec should access this field using: - * av_opt_ptr(avcodec_get_frame_class(), frame, "best_effort_timestamp"); + * av_frame_get_best_effort_timestamp(frame) * - encoding: unused * - decoding: set by libavcodec, read by user. */ @@ -1253,7 +1253,7 @@ typedef struct AVFrame { /** * reordered pos from the last AVPacket that has been input into the decoder * Code outside libavcodec should access this field using: - * av_opt_ptr(avcodec_get_frame_class(), frame, "pkt_pos"); + * av_frame_get_pkt_pos(frame) * - encoding: unused * - decoding: Read by user. */ @@ -1264,7 +1264,7 @@ typedef struct AVFrame { * - encoding: unused * - decoding: read by user. * Code outside libavcodec should access this field using: - * av_opt_ptr(avcodec_get_frame_class(), frame, "channel_layout") + * av_frame_get_channel_layout(frame) */ int64_t channel_layout; @@ -1273,12 +1273,26 @@ typedef struct AVFrame { * - encoding: unused * - decoding: read by user. * Code outside libavcodec should access this field using: - * av_opt_ptr(avcodec_get_frame_class(), frame, "sample_rate") + * av_frame_get_channel_layout(frame) */ int sample_rate; } AVFrame; +/** + * Accessors for some AVFrame fields. + * The position of these field in the structure is not part of the ABI, + * they should not be accessed directly outside libavcodec. + */ +int64_t av_frame_get_best_effort_timestamp(const AVFrame *frame); +int64_t av_frame_get_pkt_pos (const AVFrame *frame); +int64_t av_frame_get_channel_layout (const AVFrame *frame); +int av_frame_get_sample_rate (const AVFrame *frame); +void av_frame_set_best_effort_timestamp(AVFrame *frame, int64_t val); +void av_frame_set_pkt_pos (AVFrame *frame, int64_t val); +void av_frame_set_channel_layout (AVFrame *frame, int64_t val); +void av_frame_set_sample_rate (AVFrame *frame, int val); + struct AVCodecInternal; enum AVFieldOrder { diff --git a/libavcodec/utils.c b/libavcodec/utils.c index 4b6ddeae1c..71227e942a 100644 --- a/libavcodec/utils.c +++ b/libavcodec/utils.c @@ -672,6 +672,15 @@ AVFrame *avcodec_alloc_frame(void){ return pic; } +#define MAKE_ACCESSORS(str, name, type, field) \ + type av_##name##_get_##field(const str *s) { return s->field; } \ + void av_##name##_set_##field(str *s, type v) { s->field = v; } + +MAKE_ACCESSORS(AVFrame, frame, int64_t, best_effort_timestamp) +MAKE_ACCESSORS(AVFrame, frame, int64_t, pkt_pos) +MAKE_ACCESSORS(AVFrame, frame, int64_t, channel_layout) +MAKE_ACCESSORS(AVFrame, frame, int, sample_rate) + static void avcodec_get_subtitle_defaults(AVSubtitle *sub) { memset(sub, 0, sizeof(*sub)); diff --git a/libavcodec/version.h b/libavcodec/version.h index 23ce1db05f..3852e6b614 100644 --- a/libavcodec/version.h +++ b/libavcodec/version.h @@ -27,8 +27,8 @@ */ #define LIBAVCODEC_VERSION_MAJOR 54 -#define LIBAVCODEC_VERSION_MINOR 17 -#define LIBAVCODEC_VERSION_MICRO 101 +#define LIBAVCODEC_VERSION_MINOR 18 +#define LIBAVCODEC_VERSION_MICRO 100 #define LIBAVCODEC_VERSION_INT AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \ LIBAVCODEC_VERSION_MINOR, \