From: Zhao Zhili <zhiliz...@tencent.com>

---
 libavformat/hls.c | 47 ++++++++++++++++++++++++++++++++++-------------
 1 file changed, 34 insertions(+), 13 deletions(-)

diff --git a/libavformat/hls.c b/libavformat/hls.c
index 6623c80309..5cddf4b5c0 100644
--- a/libavformat/hls.c
+++ b/libavformat/hls.c
@@ -1331,6 +1331,37 @@ static void intercept_id3(struct playlist *pls, uint8_t 
*buf,
         pls->is_id3_timestamped = (pls->id3_mpegts_timestamp != 
AV_NOPTS_VALUE);
 }
 
+static int read_key(HLSContext *c, struct playlist *pls, struct segment *seg)
+{
+    AVIOContext *pb = NULL;
+
+    int ret = open_url(pls->parent, &pb, seg->key, &c->avio_opts, NULL, NULL);
+    if (ret < 0) {
+        av_log(pls->parent, AV_LOG_ERROR, "Unable to open key file %s, %s\n",
+               seg->key, av_err2str(ret));
+        return ret;
+    }
+
+    ret = avio_read(pb, pls->key, sizeof(pls->key));
+    ff_format_io_close(pls->parent, &pb);
+    if (ret != sizeof(pls->key)) {
+        if (ret < 0) {
+            av_log(pls->parent, AV_LOG_ERROR, "Unable to read key file %s, 
%s\n",
+                   seg->key, av_err2str(ret));
+        } else {
+            av_log(pls->parent, AV_LOG_ERROR, "Unable to read key file %s, 
read bytes %d != %zu\n",
+                   seg->key, ret, sizeof(pls->key));
+            ret = AVERROR_INVALIDDATA;
+        }
+
+        return ret;
+    }
+
+    av_strlcpy(pls->key_url, seg->key, sizeof(pls->key_url));
+
+    return 0;
+}
+
 static int open_input(HLSContext *c, struct playlist *pls, struct segment 
*seg, AVIOContext **in)
 {
     AVDictionary *opts = NULL;
@@ -1352,19 +1383,9 @@ static int open_input(HLSContext *c, struct playlist 
*pls, struct segment *seg,
 
     if (seg->key_type == KEY_AES_128 || seg->key_type == KEY_SAMPLE_AES) {
         if (strcmp(seg->key, pls->key_url)) {
-            AVIOContext *pb = NULL;
-            if (open_url(pls->parent, &pb, seg->key, &c->avio_opts, NULL, 
NULL) == 0) {
-                ret = avio_read(pb, pls->key, sizeof(pls->key));
-                if (ret != sizeof(pls->key)) {
-                    av_log(pls->parent, AV_LOG_ERROR, "Unable to read key file 
%s\n",
-                           seg->key);
-                }
-                ff_format_io_close(pls->parent, &pb);
-            } else {
-                av_log(pls->parent, AV_LOG_ERROR, "Unable to open key file 
%s\n",
-                       seg->key);
-            }
-            av_strlcpy(pls->key_url, seg->key, sizeof(pls->key_url));
+            ret = read_key(c, pls, seg);
+            if (ret < 0)
+                goto cleanup;
         }
     }
 
-- 
2.46.0

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

To unsubscribe, visit link above, or email
ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".

Reply via email to