Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/FFmpeg/FFmpeg.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Niedermayer <michaelni@gmx.at>2012-03-26 01:10:30 +0400
committerMichael Niedermayer <michaelni@gmx.at>2012-03-26 01:10:30 +0400
commit9621646eb316d7595f0f8198efd39f36efa30440 (patch)
tree8cc20303687a958f7a1530e14c65e9eadd54be8f /libavcodec/dpcm.c
parent8d7f2db60a9cc2b6fd87a410a69f4deafa3edff9 (diff)
parent62ce9defb81d0b6bd179131d1502858c8778f411 (diff)
Merge remote-tracking branch 'qatar/master'
* qatar/master: x86: dsputil: prettyprint gcc inline asm x86: K&R prettyprinting cosmetics for dsputil_mmx.c x86: conditionally compile H.264 QPEL optimizations dsputil_mmx: Surround QPEL macros by "do { } while (0);" blocks. Ignore generated files below doc/. dpcm: convert to bytestream2. interplayvideo: convert to bytestream2. movenc: Merge if statements h264: fix memleak in error path. pthread: Immediately release all frames in ff_thread_flush() h264: Add check for invalid chroma_format_idc utvideo: port header reading to bytestream2. Conflicts: .gitignore configure libavcodec/h264_ps.c libavcodec/interplayvideo.c libavcodec/pthread.c libavcodec/x86/dsputil_mmx.c Merged-by: Michael Niedermayer <michaelni@gmx.at>
Diffstat (limited to 'libavcodec/dpcm.c')
-rw-r--r--libavcodec/dpcm.c58
1 files changed, 31 insertions, 27 deletions
diff --git a/libavcodec/dpcm.c b/libavcodec/dpcm.c
index 4915223bc8..b7e620a3e0 100644
--- a/libavcodec/dpcm.c
+++ b/libavcodec/dpcm.c
@@ -40,6 +40,7 @@
#include "libavutil/intreadwrite.h"
#include "avcodec.h"
#include "bytestream.h"
+#include "mathops.h"
typedef struct DPCMContext {
AVFrame frame;
@@ -173,20 +174,18 @@ static av_cold int dpcm_decode_init(AVCodecContext *avctx)
static int dpcm_decode_frame(AVCodecContext *avctx, void *data,
int *got_frame_ptr, AVPacket *avpkt)
{
- const uint8_t *buf = avpkt->data;
int buf_size = avpkt->size;
- const uint8_t *buf_end = buf + buf_size;
DPCMContext *s = avctx->priv_data;
int out = 0, ret;
int predictor[2];
int ch = 0;
int stereo = s->channels - 1;
- int16_t *output_samples;
+ int16_t *output_samples, *samples_end;
+ GetByteContext gb;
- if (stereo && (buf_size & 1)) {
+ if (stereo && (buf_size & 1))
buf_size--;
- buf_end--;
- }
+ bytestream2_init(&gb, avpkt->data, buf_size);
/* calculate output size */
switch(avctx->codec->id) {
@@ -221,22 +220,23 @@ static int dpcm_decode_frame(AVCodecContext *avctx, void *data,
return ret;
}
output_samples = (int16_t *)s->frame.data[0];
+ samples_end = output_samples + out;
switch(avctx->codec->id) {
case CODEC_ID_ROQ_DPCM:
- buf += 6;
+ bytestream2_skipu(&gb, 6);
if (stereo) {
- predictor[1] = (int16_t)(bytestream_get_byte(&buf) << 8);
- predictor[0] = (int16_t)(bytestream_get_byte(&buf) << 8);
+ predictor[1] = sign_extend(bytestream2_get_byteu(&gb) << 8, 16);
+ predictor[0] = sign_extend(bytestream2_get_byteu(&gb) << 8, 16);
} else {
- predictor[0] = (int16_t)bytestream_get_le16(&buf);
+ predictor[0] = sign_extend(bytestream2_get_le16u(&gb), 16);
}
/* decode the samples */
- while (buf < buf_end) {
- predictor[ch] += s->roq_square_array[*buf++];
+ while (output_samples < samples_end) {
+ predictor[ch] += s->roq_square_array[bytestream2_get_byteu(&gb)];
predictor[ch] = av_clip_int16(predictor[ch]);
*output_samples++ = predictor[ch];
@@ -246,16 +246,16 @@ static int dpcm_decode_frame(AVCodecContext *avctx, void *data,
break;
case CODEC_ID_INTERPLAY_DPCM:
- buf += 6; /* skip over the stream mask and stream length */
+ bytestream2_skipu(&gb, 6); /* skip over the stream mask and stream length */
for (ch = 0; ch < s->channels; ch++) {
- predictor[ch] = (int16_t)bytestream_get_le16(&buf);
+ predictor[ch] = sign_extend(bytestream2_get_le16u(&gb), 16);
*output_samples++ = predictor[ch];
}
ch = 0;
- while (buf < buf_end) {
- predictor[ch] += interplay_delta_table[*buf++];
+ while (output_samples < samples_end) {
+ predictor[ch] += interplay_delta_table[bytestream2_get_byteu(&gb)];
predictor[ch] = av_clip_int16(predictor[ch]);
*output_samples++ = predictor[ch];
@@ -269,16 +269,19 @@ static int dpcm_decode_frame(AVCodecContext *avctx, void *data,
int shift[2] = { 4, 4 };
for (ch = 0; ch < s->channels; ch++)
- predictor[ch] = (int16_t)bytestream_get_le16(&buf);
+ predictor[ch] = sign_extend(bytestream2_get_le16u(&gb), 16);
ch = 0;
- while (buf < buf_end) {
- uint8_t n = *buf++;
- int16_t diff = (n & 0xFC) << 8;
- if ((n & 0x03) == 3)
+ while (output_samples < samples_end) {
+ int diff = bytestream2_get_byteu(&gb);
+ int n = diff & 3;
+
+ if (n == 3)
shift[ch]++;
else
- shift[ch] -= (2 * (n & 3));
+ shift[ch] -= (2 * n);
+ diff = sign_extend((diff &~ 3) << 8, 16);
+
/* saturate the shifter to a lower limit of 0 */
if (shift[ch] < 0)
shift[ch] = 0;
@@ -296,9 +299,10 @@ static int dpcm_decode_frame(AVCodecContext *avctx, void *data,
}
case CODEC_ID_SOL_DPCM:
if (avctx->codec_tag != 3) {
- uint8_t *output_samples_u8 = s->frame.data[0];
- while (buf < buf_end) {
- uint8_t n = *buf++;
+ uint8_t *output_samples_u8 = s->frame.data[0],
+ *samples_end_u8 = output_samples_u8 + out;
+ while (output_samples_u8 < samples_end_u8) {
+ int n = bytestream2_get_byteu(&gb);
s->sample[0] += s->sol_table[n >> 4];
s->sample[0] = av_clip_uint8(s->sample[0]);
@@ -309,8 +313,8 @@ static int dpcm_decode_frame(AVCodecContext *avctx, void *data,
*output_samples_u8++ = s->sample[stereo];
}
} else {
- while (buf < buf_end) {
- uint8_t n = *buf++;
+ while (output_samples < samples_end) {
+ int n = bytestream2_get_byteu(&gb);
if (n & 0x80) s->sample[ch] -= sol_table_16[n & 0x7F];
else s->sample[ch] += sol_table_16[n & 0x7F];
s->sample[ch] = av_clip_int16(s->sample[ch]);