diff --git a/doc/APIchanges b/doc/APIchanges
index a31268195ffddf69fa8f4489a311409a98fe06ca..240e613dda23ae375ea62ad0b64f6c4e6e4112a1 100644
--- a/doc/APIchanges
+++ b/doc/APIchanges
@@ -13,6 +13,9 @@ libavutil:   2011-04-18
 
 API changes, most recent first:
 
+2011-08-xx - xxxxxxx - lavu 51.10.0
+  Add AV_OPT_SEARCH_FAKE_OBJ flag for av_opt_find() function.
+
 2011-08-xx - xxxxxx - lavu 51.9.0
   Add av_fifo_peek2(), deprecate av_fifo_peek().
 
diff --git a/libavcodec/options.c b/libavcodec/options.c
index a715dfafcb1d223ebc7065baf64ebd637440748f..97525634d819a7037111bd33d84a6816c77e2f71 100644
--- a/libavcodec/options.c
+++ b/libavcodec/options.c
@@ -44,7 +44,7 @@ static const AVOption *opt_find(void *obj, const char *name, const char *unit, i
     AVCodecContext *s = obj;
     AVCodec        *c = NULL;
 
-    if (s->priv_data) {
+    if (!(search_flags & AV_OPT_SEARCH_FAKE_OBJ) && s->priv_data) {
         if (s->codec->priv_class)
             return av_opt_find(s->priv_data, name, unit, opt_flags, search_flags);
         return NULL;
diff --git a/libavformat/options.c b/libavformat/options.c
index 3ca8c834807284046ebdf5abd8ddf23f284ec463..5ea0b181cbdbc468e6f94ef95bc4044c30611245 100644
--- a/libavformat/options.c
+++ b/libavformat/options.c
@@ -38,7 +38,7 @@ static const AVOption *opt_find(void *obj, const char *name, const char *unit, i
     AVFormatContext   *s = obj;
     AVInputFormat  *ifmt = NULL;
     AVOutputFormat *ofmt = NULL;
-    if (s->priv_data) {
+    if (!(search_flags & AV_OPT_SEARCH_FAKE_OBJ) && s->priv_data) {
         if ((s->iformat && !s->iformat->priv_class) ||
             (s->oformat && !s->oformat->priv_class))
             return NULL;
diff --git a/libavutil/avutil.h b/libavutil/avutil.h
index 484659a58ba86d9af40c13809d3f975375584fdd..24594107bc3cdaf256484f5894175ed2de21d0ec 100644
--- a/libavutil/avutil.h
+++ b/libavutil/avutil.h
@@ -40,7 +40,7 @@
 #define AV_VERSION(a, b, c) AV_VERSION_DOT(a, b, c)
 
 #define LIBAVUTIL_VERSION_MAJOR 51
-#define LIBAVUTIL_VERSION_MINOR  9
+#define LIBAVUTIL_VERSION_MINOR 10
 #define LIBAVUTIL_VERSION_MICRO  0
 
 #define LIBAVUTIL_VERSION_INT   AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \
diff --git a/libavutil/opt.h b/libavutil/opt.h
index 30aa54f5b6c021633d8c1c9249dcc1bd07d8d80c..21dac7c56952da2d5b777dcc0f84b95ae99da30f 100644
--- a/libavutil/opt.h
+++ b/libavutil/opt.h
@@ -215,6 +215,13 @@ int av_opt_set_dict(void *obj, struct AVDictionary **options);
 
 #define AV_OPT_SEARCH_CHILDREN   0x0001 /**< Search in possible children of the
                                              given object first. */
+/**
+ *  The obj passed to av_opt_find() is fake -- only a double pointer to AVClass
+ *  instead of a required pointer to a struct containing AVClass. This is
+ *  useful for searching for options without needing to allocate the corresponding
+ *  object.
+ */
+#define AV_OPT_SEARCH_FAKE_OBJ   0x0002
 
 /**
  * Look for an option in an object. Consider only options which
@@ -222,6 +229,8 @@ int av_opt_set_dict(void *obj, struct AVDictionary **options);
  *
  * @param[in] obj A pointer to a struct whose first element is a
  *                pointer to an AVClass.
+ *                Alternatively a double pointer to an AVClass, if
+ *                AV_OPT_SEARCH_FAKE_OBJ search flag is set.
  * @param[in] name The name of the option to look for.
  * @param[in] unit When searching for named constants, name of the unit
  *                 it belongs to.