aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Niedermayer <michaelni@gmx.at>2015-06-17 20:11:43 +0200
committerMichael Niedermayer <michaelni@gmx.at>2015-06-17 20:11:43 +0200
commite6190045b3a119cc27efe9fbd91eb7881fb6f823 (patch)
tree9f43fe27e5c327727f07bf52c8f84ba861d3a0c1
parent2687a51a3fcffd28fcc88b7f67e4773eae259825 (diff)
downloadffmpeg-e6190045b3a119cc27efe9fbd91eb7881fb6f823.tar.gz
avcodec/mqcenc: Add ff_mqc_flush_to()
This is needed to separate the end padding from the bitstream, allowing to end it multiple times without disturbing it. Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
-rw-r--r--libavcodec/mqc.h1
-rw-r--r--libavcodec/mqcenc.c21
2 files changed, 22 insertions, 0 deletions
diff --git a/libavcodec/mqc.h b/libavcodec/mqc.h
index e4123c2109..39104b1f3d 100644
--- a/libavcodec/mqc.h
+++ b/libavcodec/mqc.h
@@ -59,6 +59,7 @@ int ff_mqc_length(MqcState *mqc);
/** flush the encoder [returns number of bytes encoded] */
int ff_mqc_flush(MqcState *mqc);
+int ff_mqc_flush_to(MqcState *mqc, uint8_t *dst, int *dst_len);
/* decoder */
diff --git a/libavcodec/mqcenc.c b/libavcodec/mqcenc.c
index 97d352be44..b82752750e 100644
--- a/libavcodec/mqcenc.c
+++ b/libavcodec/mqcenc.c
@@ -25,6 +25,7 @@
* @author Kamil Nowosad
*/
+#include "libavutil/avassert.h"
#include "mqc.h"
static void byteout(MqcState *mqc)
@@ -117,3 +118,23 @@ int ff_mqc_flush(MqcState *mqc)
mqc->bp++;
return mqc->bp - mqc->bpstart;
}
+
+int ff_mqc_flush_to(MqcState *mqc, uint8_t *dst, int *dst_len)
+{
+ int len;
+ MqcState mqc2 = *mqc;
+ mqc2.bpstart=
+ mqc2.bp = dst;
+ *mqc2.bp = *mqc->bp;
+ ff_mqc_flush(&mqc2);
+ *dst_len = mqc2.bp - dst;
+ if (mqc->bp < mqc->bpstart) {
+ av_assert1(mqc->bpstart - mqc->bp == 1);
+ av_assert1(*dst_len > 0);
+ av_assert1(mqc->bp[0] == 0 && dst[0] == 0);
+ (*dst_len) --;
+ memmove(dst, dst+1, *dst_len);
+ return mqc->bp - mqc->bpstart + 1 + *dst_len;
+ }
+ return mqc->bp - mqc->bpstart + *dst_len;
+}