diff options
author | Michael Niedermayer <michaelni@gmx.at> | 2015-06-17 20:11:43 +0200 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2015-06-17 20:11:43 +0200 |
commit | e6190045b3a119cc27efe9fbd91eb7881fb6f823 (patch) | |
tree | 9f43fe27e5c327727f07bf52c8f84ba861d3a0c1 | |
parent | 2687a51a3fcffd28fcc88b7f67e4773eae259825 (diff) | |
download | ffmpeg-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.h | 1 | ||||
-rw-r--r-- | libavcodec/mqcenc.c | 21 |
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; +} |