[FFmpeg-devel] [PATCH] astenc: Add an option to set the loop flag

jamal jamrial at gmail.com
Wed Dec 12 03:37:02 CET 2012


Hello.
Here's an updated version of the patch. The muxer now will also ignore the values for loopstart and loopend if the loop flag is not enabled (Since they will be skipped by the player in such case anyway).

Regards.
-------------- next part --------------
>From 1ad49f4d78bdf04c529dc5495def82bc6a5bed85 Mon Sep 17 00:00:00 2001
From: James Almer <jamrial at gmail.com>
Date: Tue, 11 Dec 2012 22:54:11 -0300
Subject: [PATCH] astenc: Add an option to set the loop flag

Also ignore the values for loopstart and loopend if the loop flag
is not enabled.

Signed-off-by: James Almer <jamrial at gmail.com>
---
 libavformat/astenc.c     | 23 ++++++++++++++---------
 libavformat/version.h    |  2 +-
 tests/lavf-regression.sh |  2 +-
 3 files changed, 16 insertions(+), 11 deletions(-)

diff --git a/libavformat/astenc.c b/libavformat/astenc.c
index 6121a01..d72036e 100644
--- a/libavformat/astenc.c
+++ b/libavformat/astenc.c
@@ -33,6 +33,7 @@ typedef struct ASTMuxContext {
     int64_t  loopstart;
     int64_t  loopend;
     int      fbs;
+    int      flags;
 } ASTMuxContext;
 
 #define CHECK_LOOP(type) \
@@ -69,14 +70,16 @@ static int ast_write_header(AVFormatContext *s)
         return AVERROR(EINVAL);
     }
 
-    if (ast->loopstart && ast->loopend && ast->loopstart >= ast->loopend) {
-        av_log(s, AV_LOG_ERROR, "loopend can't be less or equal to loopstart\n");
-        return AVERROR(EINVAL);
-    }
-
-    /* Convert milliseconds to samples */
-    CHECK_LOOP(start)
-    CHECK_LOOP(end)
+    if (ast->flags) {
+        if (ast->loopend && ast->loopstart >= ast->loopend) {
+            av_log(s, AV_LOG_ERROR, "loopend can't be less or equal to loopstart\n");
+            return AVERROR(EINVAL);
+        }
+        /* Convert milliseconds to samples */
+        CHECK_LOOP(start)
+        CHECK_LOOP(end)
+    } else
+        ast->loopstart = ast->loopend = 0;
 
     ffio_wfourcc(pb, "STRM");
 
@@ -85,7 +88,7 @@ static int ast_write_header(AVFormatContext *s)
     avio_wb16(pb, codec_tag);
     avio_wb16(pb, 16); /* Bit depth */
     avio_wb16(pb, enc->channels);
-    avio_wb16(pb, 0xFFFF);
+    avio_wb16(pb, ast->flags ? 0xFFFF : 0); /* Loop flag */
     avio_wb32(pb, enc->sample_rate);
 
     ast->samples = avio_tell(pb);
@@ -175,6 +178,8 @@ static int ast_write_trailer(AVFormatContext *s)
 
 #define OFFSET(obj) offsetof(ASTMuxContext, obj)
 static const AVOption options[] = {
+  { "astflags",  "AST Muxer flags", OFFSET(flags), AV_OPT_TYPE_FLAGS, {.i64 = 0}, INT_MIN, INT_MAX, AV_OPT_FLAG_ENCODING_PARAM, "astflags" },
+  { "loop",      "Enable looping",  0,             AV_OPT_TYPE_CONST, {.i64 = 1}, INT_MIN, INT_MAX, AV_OPT_FLAG_ENCODING_PARAM, "astflags" },
   { "loopstart", "Loopstart position in milliseconds.", OFFSET(loopstart), AV_OPT_TYPE_INT64, { .i64 = 0 }, 0, INT_MAX, AV_OPT_FLAG_ENCODING_PARAM },
   { "loopend",   "Loopend position in milliseconds.",   OFFSET(loopend),   AV_OPT_TYPE_INT64, { .i64 = 0 }, 0, INT_MAX, AV_OPT_FLAG_ENCODING_PARAM },
   { NULL },
diff --git a/libavformat/version.h b/libavformat/version.h
index 3b2ba41..f2c0c11 100644
--- a/libavformat/version.h
+++ b/libavformat/version.h
@@ -31,7 +31,7 @@
 
 #define LIBAVFORMAT_VERSION_MAJOR 54
 #define LIBAVFORMAT_VERSION_MINOR 49
-#define LIBAVFORMAT_VERSION_MICRO 101
+#define LIBAVFORMAT_VERSION_MICRO 102
 
 #define LIBAVFORMAT_VERSION_INT AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR, \
                                                LIBAVFORMAT_VERSION_MINOR, \
diff --git a/tests/lavf-regression.sh b/tests/lavf-regression.sh
index 4afc29a..ba814c1 100755
--- a/tests/lavf-regression.sh
+++ b/tests/lavf-regression.sh
@@ -327,7 +327,7 @@ do_audio_only caf
 fi
 
 if [ -n "$do_ast" ] ; then
-do_audio_only ast "-ac 2" "-loopstart 1 -loopend 10"
+do_audio_only ast "-ac 2" "-astflags loop -loopstart 1 -loopend 10"
 fi
 
 if [ -n "$do_ircam" ] ; then
-- 
1.8.0.msysgit.0



More information about the ffmpeg-devel mailing list