lavf: add avformat_query_codec().
authorAnton Khirnov <anton@khirnov.net>
Thu, 11 Aug 2011 18:34:45 +0000 (20:34 +0200)
committerAnton Khirnov <anton@khirnov.net>
Tue, 16 Aug 2011 18:24:20 +0000 (20:24 +0200)
It allows to check if a given codec can be written into a container.

doc/APIchanges
libavformat/avformat.h
libavformat/utils.c

index 64d1571..cfce48b 100644 (file)
@@ -13,6 +13,9 @@ libavutil:   2011-04-18
 
 API changes, most recent first:
 
+2011-08-xx - xxxxxxx - lavf 53.4.0
+  Add avformat_query_codec().
+
 2011-08-xx - xxxxxxx - lavc 53.8.0
   Add avcodec_get_type().
 
index 957039f..2a00a9f 100644 (file)
@@ -322,6 +322,14 @@ typedef struct AVOutputFormat {
 
     const AVClass *priv_class; ///< AVClass for the private context
 
+    /**
+     * Test if the given codec can be stored in this container.
+     *
+     * @return 1 if the codec is supported, 0 if it is not.
+     *         A negative number if unknown.
+     */
+    int (*query_codec)(enum CodecID id, int std_compliance);
+
     /* private fields */
     struct AVOutputFormat *next;
 } AVOutputFormat;
@@ -1595,4 +1603,14 @@ attribute_deprecated int avf_sdp_create(AVFormatContext *ac[], int n_files, char
  */
 int av_match_ext(const char *filename, const char *extensions);
 
+/**
+ * Test if the given container can store a codec.
+ *
+ * @param std_compliance standards compliance level, one of FF_COMPLIANCE_*
+ *
+ * @return 1 if codec with ID codec_id can be stored in ofmt, 0 if it cannot.
+ *         A negative number if this information is not available.
+ */
+int avformat_query_codec(AVOutputFormat *ofmt, enum CodecID codec_id, int std_compliance);
+
 #endif /* AVFORMAT_AVFORMAT_H */
index b848ebb..6e3cb2f 100644 (file)
@@ -3904,3 +3904,17 @@ int64_t ff_iso8601_to_unix_time(const char *datestr)
     return 0;
 #endif
 }
+
+int avformat_query_codec(AVOutputFormat *ofmt, enum CodecID codec_id, int std_compliance)
+{
+    if (ofmt) {
+        if (ofmt->query_codec)
+            return ofmt->query_codec(codec_id, std_compliance);
+        else if (ofmt->codec_tag)
+            return !!av_codec_get_tag(ofmt->codec_tag, codec_id);
+        else if (codec_id == ofmt->video_codec || codec_id == ofmt->audio_codec ||
+                 codec_id == ofmt->subtitle_codec)
+                return 1;
+    }
+    return AVERROR_PATCHWELCOME;
+}