---
libavcodec/h263.h | 3 ++-
libavcodec/h263dec.c | 54 +++++++++++++++++++------------------
libavcodec/intelh263dec.c | 69 ++++++++++++++++++++++++-----------------------
3 files changed, 65 insertions(+), 61 deletions(-)
diff --git a/libavcodec/h263.h b/libavcodec/h263.h
index 42c78f4..5377813 100644
--- a/libavcodec/h263.h
+++ b/libavcodec/h263.h
@@ -22,10 +22,11 @@
#include <stdint.h>
#include "libavutil/rational.h"
-#include "get_bits.h"
+#include "bitstream.h"
#include "mpegvideo.h"
#include "h263data.h"
#include "rl.h"
+#include "vlc.h"
#if !FF_API_ASPECT_EXTENDED
#define FF_ASPECT_EXTENDED 15
diff --git a/libavcodec/h263dec.c b/libavcodec/h263dec.c
index e4a7227..0335ebb 100644
--- a/libavcodec/h263dec.c
+++ b/libavcodec/h263dec.c
@@ -27,6 +27,7 @@
#include "libavutil/cpu.h"
#include "avcodec.h"
+#include "bitstream.h"
#include "error_resilience.h"
#include "flv.h"
#include "h263.h"
@@ -146,7 +147,7 @@ av_cold int ff_h263_decode_end(AVCodecContext *avctx)
*/
static int get_consumed_bytes(MpegEncContext *s, int buf_size)
{
- int pos = (get_bits_count(&s->gb) + 7) >> 3;
+ int pos = (bitstream_tell(&s->bc) + 7) >> 3;
if (s->divx_packed || s->avctx->hwaccel) {
/* We would have to scan through the whole buf to handle the weird
@@ -177,7 +178,7 @@ static int decode_slice(MpegEncContext *s)
const int mb_size = 16;
int ret;
- s->last_resync_gb = s->gb;
+ s->last_resync_bc = s->bc;
s->first_slice_line = 1;
s->resync_mb_x = s->mb_x;
s->resync_mb_y = s->mb_y;
@@ -185,10 +186,10 @@ static int decode_slice(MpegEncContext *s)
ff_set_qscale(s, s->qscale);
if (s->avctx->hwaccel) {
- const uint8_t *start = s->gb.buffer + get_bits_count(&s->gb) / 8;
+ const uint8_t *start = s->bc.buffer + bitstream_tell(&s->bc) / 8;
const uint8_t *end = ff_h263_find_resync_marker(start + 1,
- s->gb.buffer_end);
- skip_bits_long(&s->gb, 8 * (end - start));
+ s->bc.buffer_end);
+ bitstream_skip(&s->bc, 8 * (end - start));
return s->avctx->hwaccel->decode_slice(s->avctx, start, end - start);
}
@@ -237,7 +238,7 @@ static int decode_slice(MpegEncContext *s)
s->mv_dir = MV_DIR_FORWARD;
s->mv_type = MV_TYPE_16X16;
ff_dlog(s, "%d %06X\n",
- get_bits_count(&s->gb), show_bits(&s->gb, 24));
+ bitstream_tell(&s->bc), bitstream_peek(&s->bc, 24));
ret = s->decode_mb(s, s->block);
if (s->pict_type != AV_PICTURE_TYPE_B)
@@ -292,29 +293,30 @@ static int decode_slice(MpegEncContext *s)
if (s->codec_id == AV_CODEC_ID_MPEG4 &&
(s->workaround_bugs & FF_BUG_AUTODETECT) &&
- get_bits_left(&s->gb) >= 48 &&
- show_bits(&s->gb, 24) == 0x4010 &&
+ bitstream_bits_left(&s->bc) >= 48 &&
+ bitstream_peek(&s->bc, 24) == 0x4010 &&
!s->data_partitioning)
s->padding_bug_score += 32;
/* try to detect the padding bug */
if (s->codec_id == AV_CODEC_ID_MPEG4 &&
(s->workaround_bugs & FF_BUG_AUTODETECT) &&
- get_bits_left(&s->gb) >= 0 &&
- get_bits_left(&s->gb) < 48 &&
+ bitstream_bits_left(&s->bc) >= 0 &&
+ bitstream_bits_left(&s->bc) < 48 &&
!s->data_partitioning) {
- const int bits_count = get_bits_count(&s->gb);
- const int bits_left = s->gb.size_in_bits - bits_count;
+ const int bits_count = bitstream_tell(&s->bc);
+ const int bits_left = bitstream_bits_left(&s->bc);
+ //printf("h263: bits_left %d\n", bits_left);
if (bits_left == 0) {
s->padding_bug_score += 16;
} else if (bits_left != 1) {
- int v = show_bits(&s->gb, 8);
+ int v = bitstream_peek(&s->bc, 8);
v |= 0x7F >> (7 - (bits_count & 7));
if (v == 0x7F && bits_left <= 8)
s->padding_bug_score--;
- else if (v == 0x7F && ((get_bits_count(&s->gb) + 8) & 8) &&
+ else if (v == 0x7F && ((bitstream_tell(&s->bc) + 8) & 8) &&
bits_left <= 16)
s->padding_bug_score += 4;
else
@@ -332,7 +334,7 @@ static int decode_slice(MpegEncContext *s)
// handle formats which don't have unique end markers
if (s->msmpeg4_version || (s->workaround_bugs & FF_BUG_NO_PADDING)) { //
FIXME perhaps solve this more cleanly
- int left = get_bits_left(&s->gb);
+ int left = bitstream_bits_left(&s->bc);
int max_extra = 7;
/* no markers in M$ crap */
@@ -350,7 +352,7 @@ static int decode_slice(MpegEncContext *s)
if (left > max_extra)
av_log(s->avctx, AV_LOG_ERROR,
"discarding %d junk bits at end, next would be %X\n",
- left, show_bits(&s->gb, 24));
+ left, bitstream_peek(&s->bc, 24));
else if (left < 0)
av_log(s->avctx, AV_LOG_ERROR, "overreading %d bits\n", -left);
else
@@ -362,7 +364,7 @@ static int decode_slice(MpegEncContext *s)
av_log(s->avctx, AV_LOG_ERROR,
"slice end not reached but screenspace end (%d left %06X, score=
%d)\n",
- get_bits_left(&s->gb), show_bits(&s->gb, 24), s->padding_bug_score);
+ bitstream_bits_left(&s->bc), bitstream_peek(&s->bc, 24),
s->padding_bug_score);
ff_er_add_slice(&s->er, s->resync_mb_x, s->resync_mb_y, s->mb_x, s->mb_y,
ER_MB_END & part_mask);
@@ -412,10 +414,10 @@ int ff_h263_decode_frame(AVCodecContext *avctx, void
*data, int *got_frame,
}
if (s->bitstream_buffer_size && (s->divx_packed || buf_size < 20)) // divx
5.01+/xvid frame reorder
- ret = init_get_bits8(&s->gb, s->bitstream_buffer,
+ ret = bitstream_init8(&s->bc, s->bitstream_buffer,
s->bitstream_buffer_size);
else
- ret = init_get_bits8(&s->gb, buf, buf_size);
+ ret = bitstream_init8(&s->bc, buf, buf_size);
s->bitstream_buffer_size = 0;
if (ret < 0)
@@ -432,15 +434,15 @@ int ff_h263_decode_frame(AVCodecContext *avctx, void
*data, int *got_frame,
ret = ff_msmpeg4_decode_picture_header(s);
} else if (CONFIG_MPEG4_DECODER && avctx->codec_id == AV_CODEC_ID_MPEG4) {
if (s->avctx->extradata_size && s->picture_number == 0) {
- GetBitContext gb;
+ BitstreamContext bc;
- ret = init_get_bits8(&gb, s->avctx->extradata,
+ ret = bitstream_init8(&bc, s->avctx->extradata,
s->avctx->extradata_size);
if (ret < 0)
return ret;
- ff_mpeg4_decode_picture_header(avctx->priv_data, &gb);
+ ff_mpeg4_decode_picture_header(avctx->priv_data, &bc);
}
- ret = ff_mpeg4_decode_picture_header(avctx->priv_data, &s->gb);
+ ret = ff_mpeg4_decode_picture_header(avctx->priv_data, &s->bc);
} else if (CONFIG_H263I_DECODER && s->codec_id == AV_CODEC_ID_H263I) {
ret = ff_intel_h263_decode_picture_header(s);
} else if (CONFIG_FLV_DECODER && s->h263_flv) {
@@ -562,8 +564,8 @@ int ff_h263_decode_frame(AVCodecContext *avctx, void *data,
int *got_frame,
ff_thread_finish_setup(avctx);
if (avctx->hwaccel) {
- ret = avctx->hwaccel->start_frame(avctx, s->gb.buffer,
- s->gb.buffer_end - s->gb.buffer);
+ ret = avctx->hwaccel->start_frame(avctx, s->bc.buffer,
+ s->bc.buffer_end - s->bc.buffer);
if (ret < 0 )
return ret;
}
@@ -589,7 +591,7 @@ int ff_h263_decode_frame(AVCodecContext *avctx, void *data,
int *got_frame,
while (s->mb_y < s->mb_height) {
if (s->msmpeg4_version) {
if (s->slice_height == 0 || s->mb_x != 0 ||
- (s->mb_y % s->slice_height) != 0 || get_bits_left(&s->gb) < 0)
+ (s->mb_y % s->slice_height) != 0 ||
bitstream_bits_left(&s->bc) < 0)
break;
} else {
int prev_x = s->mb_x, prev_y = s->mb_y;
diff --git a/libavcodec/intelh263dec.c b/libavcodec/intelh263dec.c
index cd1971f..9f7a078 100644
--- a/libavcodec/intelh263dec.c
+++ b/libavcodec/intelh263dec.c
@@ -18,6 +18,7 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
+#include "bitstream.h"
#include "mpegutils.h"
#include "mpegvideo.h"
#include "h263.h"
@@ -28,47 +29,47 @@ int ff_intel_h263_decode_picture_header(MpegEncContext *s)
{
int format;
- if (get_bits_left(&s->gb) == 64) { /* special dummy frames */
+ if (bitstream_bits_left(&s->bc) == 64) { /* special dummy frames */
return FRAME_SKIPPED;
}
/* picture header */
- if (get_bits_long(&s->gb, 22) != 0x20) {
+ if (bitstream_read(&s->bc, 22) != 0x20) {
av_log(s->avctx, AV_LOG_ERROR, "Bad picture start code\n");
return -1;
}
- s->picture_number = get_bits(&s->gb, 8); /* picture timestamp */
+ s->picture_number = bitstream_read(&s->bc, 8); /* picture timestamp */
- if (get_bits1(&s->gb) != 1) {
+ if (bitstream_read_bit(&s->bc) != 1) {
av_log(s->avctx, AV_LOG_ERROR, "Bad marker\n");
return -1; /* marker */
}
- if (get_bits1(&s->gb) != 0) {
+ if (bitstream_read_bit(&s->bc) != 0) {
av_log(s->avctx, AV_LOG_ERROR, "Bad H.263 id\n");
- return -1; /* H.263 id */
+ return -1; /* h263 id */
}
- skip_bits1(&s->gb); /* split screen off */
- skip_bits1(&s->gb); /* camera off */
- skip_bits1(&s->gb); /* freeze picture release off */
+ bitstream_skip(&s->bc, 1); /* split screen off */
+ bitstream_skip(&s->bc, 1); /* camera off */
+ bitstream_skip(&s->bc, 1); /* freeze picture release off */
- format = get_bits(&s->gb, 3);
+ format = bitstream_read(&s->bc, 3);
if (format == 0 || format == 6) {
av_log(s->avctx, AV_LOG_ERROR, "Intel H.263 free format not
supported\n");
return -1;
}
s->h263_plus = 0;
- s->pict_type = AV_PICTURE_TYPE_I + get_bits1(&s->gb);
+ s->pict_type = AV_PICTURE_TYPE_I + bitstream_read_bit(&s->bc);
- s->unrestricted_mv = get_bits1(&s->gb);
+ s->unrestricted_mv = bitstream_read_bit(&s->bc);
s->h263_long_vectors = s->unrestricted_mv;
- if (get_bits1(&s->gb) != 0) {
+ if (bitstream_read_bit(&s->bc) != 0) {
av_log(s->avctx, AV_LOG_ERROR, "SAC not supported\n");
return -1; /* SAC: off */
}
- s->obmc= get_bits1(&s->gb);
- s->pb_frame = get_bits1(&s->gb);
+ s->obmc= bitstream_read_bit(&s->bc);
+ s->pb_frame = bitstream_read_bit(&s->bc);
if (format < 6) {
s->width = ff_h263_format[format][0];
@@ -76,31 +77,31 @@ int ff_intel_h263_decode_picture_header(MpegEncContext *s)
s->avctx->sample_aspect_ratio.num = 12;
s->avctx->sample_aspect_ratio.den = 11;
} else {
- format = get_bits(&s->gb, 3);
+ format = bitstream_read(&s->bc, 3);
if(format == 0 || format == 7){
av_log(s->avctx, AV_LOG_ERROR, "Wrong Intel H.263 format\n");
return -1;
}
- if(get_bits(&s->gb, 2))
+ if(bitstream_read(&s->bc, 2))
av_log(s->avctx, AV_LOG_ERROR, "Bad value for reserved field\n");
- s->loop_filter = get_bits1(&s->gb);
- if(get_bits1(&s->gb))
+ s->loop_filter = bitstream_read_bit(&s->bc);
+ if(bitstream_read_bit(&s->bc))
av_log(s->avctx, AV_LOG_ERROR, "Bad value for reserved field\n");
- if(get_bits1(&s->gb))
+ if(bitstream_read_bit(&s->bc))
s->pb_frame = 2;
- if(get_bits(&s->gb, 5))
+ if(bitstream_read(&s->bc, 5))
av_log(s->avctx, AV_LOG_ERROR, "Bad value for reserved field\n");
- if(get_bits(&s->gb, 5) != 1)
+ if(bitstream_read(&s->bc, 5) != 1)
av_log(s->avctx, AV_LOG_ERROR, "Invalid marker\n");
}
if(format == 6){
- int ar = get_bits(&s->gb, 4);
- skip_bits(&s->gb, 9); // display width
- skip_bits1(&s->gb);
- skip_bits(&s->gb, 9); // display height
+ int ar = bitstream_read(&s->bc, 4);
+ bitstream_skip(&s->bc, 9); // display width
+ bitstream_skip(&s->bc, 1);
+ bitstream_skip(&s->bc, 9); // display height
if(ar == 15){
- s->avctx->sample_aspect_ratio.num = get_bits(&s->gb, 8); // aspect
ratio - width
- s->avctx->sample_aspect_ratio.den = get_bits(&s->gb, 8); // aspect
ratio - height
+ s->avctx->sample_aspect_ratio.num = bitstream_read(&s->bc, 8); //
aspect ratio - width
+ s->avctx->sample_aspect_ratio.den = bitstream_read(&s->bc, 8); //
aspect ratio - height
} else {
s->avctx->sample_aspect_ratio = ff_h263_pixel_aspect[ar];
}
@@ -108,17 +109,17 @@ int ff_intel_h263_decode_picture_header(MpegEncContext *s)
av_log(s->avctx, AV_LOG_ERROR, "Invalid aspect ratio.\n");
}
- s->chroma_qscale= s->qscale = get_bits(&s->gb, 5);
- skip_bits1(&s->gb); /* Continuous Presence Multipoint mode: off */
+ s->chroma_qscale= s->qscale = bitstream_read(&s->bc, 5);
+ bitstream_skip(&s->bc, 1); /* Continuous Presence Multipoint mode: off */
if(s->pb_frame){
- skip_bits(&s->gb, 3); //temporal reference for B-frame
- skip_bits(&s->gb, 2); //dbquant
+ bitstream_skip(&s->bc, 3); //temporal reference for B-frame
+ bitstream_skip(&s->bc, 2); //dbquant
}
/* PEI */
- while (get_bits1(&s->gb) != 0) {
- skip_bits(&s->gb, 8);
+ while (bitstream_read_bit(&s->bc) != 0) {
+ bitstream_skip(&s->bc, 8);
}
s->f_code = 1;
--
2.1.4
_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel