]> git.sesse.net Git - ffmpeg/blobdiff - libavcodec/dca.c
DirectDraw Surface image decoder
[ffmpeg] / libavcodec / dca.c
index 0f1eeecf7bbd0b3fd4fc927972d727eeb46f6d04..ebe9fdb47cc147c02c4d14600efd0b0fd5011472 100644 (file)
  */
 
 #include <stdint.h>
+#include <string.h>
+
+#include "libavutil/error.h"
 
 #include "dca.h"
+#include "dca_syncwords.h"
+#include "put_bits.h"
 
-const uint32_t avpriv_dca_sample_rates[16] =
-{
+const uint32_t avpriv_dca_sample_rates[16] = {
     0, 8000, 16000, 32000, 0, 0, 11025, 22050, 44100, 0, 0,
     12000, 24000, 48000, 96000, 192000
 };
+
+int ff_dca_convert_bitstream(const uint8_t *src, int src_size, uint8_t *dst,
+                             int max_size)
+{
+    uint32_t mrk;
+    int i, tmp;
+    const uint16_t *ssrc = (const uint16_t *) src;
+    uint16_t *sdst = (uint16_t *) dst;
+    PutBitContext pb;
+
+    if ((unsigned) src_size > (unsigned) max_size)
+        src_size = max_size;
+
+    mrk = AV_RB32(src);
+    switch (mrk) {
+    case DCA_SYNCWORD_CORE_BE:
+        memcpy(dst, src, src_size);
+        return src_size;
+    case DCA_SYNCWORD_CORE_LE:
+        for (i = 0; i < (src_size + 1) >> 1; i++)
+            *sdst++ = av_bswap16(*ssrc++);
+        return src_size;
+    case DCA_SYNCWORD_CORE_14B_BE:
+    case DCA_SYNCWORD_CORE_14B_LE:
+        init_put_bits(&pb, dst, max_size);
+        for (i = 0; i < (src_size + 1) >> 1; i++, src += 2) {
+            tmp = ((mrk == DCA_SYNCWORD_CORE_14B_BE) ? AV_RB16(src) : AV_RL16(src)) & 0x3FFF;
+            put_bits(&pb, 14, tmp);
+        }
+        flush_put_bits(&pb);
+        return (put_bits_count(&pb) + 7) >> 3;
+    default:
+        return AVERROR_INVALIDDATA;
+    }
+}