This kind of hwaccel does not require cooperation from the software
decoder at all. Initialize it as soon as the decoder is opened.
---
 avconv.c | 29 +++++++++++++++++++++++++++++
 1 file changed, 29 insertions(+)

diff --git a/avconv.c b/avconv.c
index 7dd335e..5532eac 100644
--- a/avconv.c
+++ b/avconv.c
@@ -1530,6 +1530,17 @@ static int get_buffer(AVCodecContext *s, AVFrame *frame, 
int flags)
     return avcodec_default_get_buffer2(s, frame, flags);
 }
 
+static const HWAccel *get_full_hwaccel(int hwaccel_id)
+{
+    int i;
+    for (i = 0; hwaccels[i].name; i++)
+        if (hwaccels[i].id == hwaccel_id &&
+            hwaccels[i].pix_fmt == AV_PIX_FMT_NONE)
+            return &hwaccels[i];
+
+    return NULL;
+}
+
 static int init_input_stream(int ist_index, char *error, int error_len)
 {
     int i, ret;
@@ -1574,6 +1585,24 @@ static int init_input_stream(int ist_index, char *error, 
int error_len)
                      ist->file_index, ist->st->index, errbuf);
             return ret;
         }
+
+        if (ist->hwaccel_id) {
+            const HWAccel *hwaccel = get_full_hwaccel(ist->hwaccel_id);
+            if (hwaccel) {
+                if ((ret = hwaccel->init(ist->dec_ctx)) < 0) {
+                    char errbuf[128];
+
+                    av_strerror(ret, errbuf, sizeof(errbuf));
+
+                    av_log(NULL, AV_LOG_WARNING,
+                           "The hardware acceleration backend %s "
+                           "cannot be used: %s.",
+                           hwaccel->name, errbuf);
+                    av_log(NULL, AV_LOG_WARNING,
+                           "Falling back to software decoding.");
+                }
+            }
+        }
         assert_avoptions(ist->decoder_opts);
     }
 
-- 
2.1.0

_______________________________________________
libav-devel mailing list
libav-devel@libav.org
https://lists.libav.org/mailman/listinfo/libav-devel

Reply via email to