[x264-devel] Fix bitstream reallocation with slice-max-size + MBAFF
Jason Garrett-Glaser
git at videolan.org
Wed Jun 15 04:54:15 CEST 2011
x264 | branch: master | Jason Garrett-Glaser <jason at x264.com> | Fri May 20 10:43:28 2011 -0700| [4e5eaf0a9f1b1079acee99fb4038b84a8b41ad95] | committer: Jason Garrett-Glaser
Fix bitstream reallocation with slice-max-size + MBAFF
> http://git.videolan.org/gitweb.cgi/x264.git/?a=commit;h=4e5eaf0a9f1b1079acee99fb4038b84a8b41ad95
---
encoder/encoder.c | 46 +++++++++++++++++++++++++---------------------
1 files changed, 25 insertions(+), 21 deletions(-)
diff --git a/encoder/encoder.c b/encoder/encoder.c
index 3571a91..a9c9b31 100644
--- a/encoder/encoder.c
+++ b/encoder/encoder.c
@@ -335,8 +335,9 @@ static void x264_slice_header_write( bs_t *s, x264_slice_header_t *sh, int i_nal
static int x264_bitstream_check_buffer( x264_t *h )
{
uint8_t *bs_bak = h->out.p_bitstream;
- if( (h->param.b_cabac && (h->cabac.p_end - h->cabac.p < 2500)) ||
- (h->out.bs.p_end - h->out.bs.p < 2500) )
+ int max_mb_size = 2500 << SLICE_MBAFF;
+ if( (h->param.b_cabac && (h->cabac.p_end - h->cabac.p < max_mb_size)) ||
+ (h->out.bs.p_end - h->out.bs.p < max_mb_size) )
{
h->out.i_bitstream += 100000;
CHECKED_MALLOC( h->out.p_bitstream, h->out.i_bitstream );
@@ -2029,27 +2030,30 @@ static int x264_slice_write( x264_t *h )
mb_xy = i_mb_x + i_mb_y * h->mb.i_mb_width;
int mb_spos = bs_pos(&h->out.bs) + x264_cabac_pos(&h->cabac);
- if( x264_bitstream_check_buffer( h ) )
- return -1;
-
- if( back_up_bitstream && (!SLICE_MBAFF || (i_mb_y&1) == 0) )
+ if( !(i_mb_y & SLICE_MBAFF) )
{
- mv_bits_bak = h->stat.frame.i_mv_bits;
- tex_bits_bak = h->stat.frame.i_tex_bits;
- /* We don't need the contexts because flushing the CABAC encoder has no context
- * dependency and macroblocks are only re-encoded in the case where a slice is
- * ended (and thus the content of all contexts are thrown away). */
- if( h->param.b_cabac )
- {
- memcpy( &cabac_bak, &h->cabac, offsetof(x264_cabac_t, f8_bits_encoded) );
- /* x264's CABAC writer modifies the previous byte during carry, so it has to be
- * backed up. */
- cabac_prevbyte_bak = h->cabac.p[-1];
- }
- else
+ if( x264_bitstream_check_buffer( h ) )
+ return -1;
+
+ if( back_up_bitstream )
{
- bs_bak = h->out.bs;
- i_skip_bak = i_skip;
+ mv_bits_bak = h->stat.frame.i_mv_bits;
+ tex_bits_bak = h->stat.frame.i_tex_bits;
+ /* We don't need the contexts because flushing the CABAC encoder has no context
+ * dependency and macroblocks are only re-encoded in the case where a slice is
+ * ended (and thus the content of all contexts are thrown away). */
+ if( h->param.b_cabac )
+ {
+ memcpy( &cabac_bak, &h->cabac, offsetof(x264_cabac_t, f8_bits_encoded) );
+ /* x264's CABAC writer modifies the previous byte during carry, so it has to be
+ * backed up. */
+ cabac_prevbyte_bak = h->cabac.p[-1];
+ }
+ else
+ {
+ bs_bak = h->out.bs;
+ i_skip_bak = i_skip;
+ }
}
}
More information about the x264-devel
mailing list