[FFmpeg-devel] [PATCH 1/3] lavc: implement accessors for some AVFrame fields.

Nicolas George nicolas.george at normalesup.org
Sun Apr 29 11:21:44 CEST 2012


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).

Signed-off-by: Nicolas George <nicolas.george at normalesup.org>
---
 libavcodec/avcodec.h |   22 ++++++++++++++++++----
 libavcodec/utils.c   |    9 +++++++++
 libavcodec/version.h |    2 +-
 3 files changed, 28 insertions(+), 5 deletions(-)


Considering code size: (on x86_64)
 - each accessor is 8 bytes of machine code plus 8 bytes of padding;
 - the call site goes from 21 bytes (using av_opt_str) to 8 bytes.

Another benefit is that we can decide to make one of the accessors
non-trivial if needs be.


diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h
index ba51ec1..b1f4fa7 100644
--- a/libavcodec/avcodec.h
+++ b/libavcodec/avcodec.h
@@ -1243,7 +1243,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.
      */
@@ -1252,7 +1252,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.
      */
@@ -1263,7 +1263,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;
 
@@ -1272,12 +1272,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 4b6ddea..71227e9 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 24e6837..3852e6b 100644
--- a/libavcodec/version.h
+++ b/libavcodec/version.h
@@ -27,7 +27,7 @@
  */
 
 #define LIBAVCODEC_VERSION_MAJOR 54
-#define LIBAVCODEC_VERSION_MINOR  17
+#define LIBAVCODEC_VERSION_MINOR  18
 #define LIBAVCODEC_VERSION_MICRO 100
 
 #define LIBAVCODEC_VERSION_INT  AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \
-- 
1.7.2.5



More information about the ffmpeg-devel mailing list