Signed-off-by: Michael Niedermayer <michaelni@gmx.at>tags/n1.1
@@ -110,7 +110,7 @@ int av_const h263_get_picture_format(int width, int height); | |||||
void ff_clean_h263_qscales(MpegEncContext *s); | void ff_clean_h263_qscales(MpegEncContext *s); | ||||
int ff_h263_resync(MpegEncContext *s); | int ff_h263_resync(MpegEncContext *s); | ||||
const uint8_t *ff_h263_find_resync_marker(const uint8_t *p, const uint8_t *end); | |||||
const uint8_t *ff_h263_find_resync_marker(MpegEncContext *s, const uint8_t *p, const uint8_t *end); | |||||
int ff_h263_get_gob_height(MpegEncContext *s); | int ff_h263_get_gob_height(MpegEncContext *s); | ||||
void ff_h263_encode_motion(MpegEncContext * s, int val, int f_code); | void ff_h263_encode_motion(MpegEncContext * s, int val, int f_code); | ||||
@@ -170,7 +170,7 @@ static int decode_slice(MpegEncContext *s){ | |||||
if (s->avctx->hwaccel) { | if (s->avctx->hwaccel) { | ||||
const uint8_t *start= s->gb.buffer + get_bits_count(&s->gb)/8; | const uint8_t *start= s->gb.buffer + get_bits_count(&s->gb)/8; | ||||
const uint8_t *end = ff_h263_find_resync_marker(start + 1, s->gb.buffer_end); | |||||
const uint8_t *end = ff_h263_find_resync_marker(s, start + 1, s->gb.buffer_end); | |||||
skip_bits_long(&s->gb, 8*(end - start)); | skip_bits_long(&s->gb, 8*(end - start)); | ||||
return s->avctx->hwaccel->decode_slice(s->avctx, start, end - start); | return s->avctx->hwaccel->decode_slice(s->avctx, start, end - start); | ||||
} | } | ||||
@@ -207,16 +207,18 @@ static int h263_decode_gob_header(MpegEncContext *s) | |||||
* @param end pointer to the end of the buffer | * @param end pointer to the end of the buffer | ||||
* @return pointer to the next resync_marker, or end if none was found | * @return pointer to the next resync_marker, or end if none was found | ||||
*/ | */ | ||||
const uint8_t *ff_h263_find_resync_marker(const uint8_t *av_restrict p, const uint8_t *av_restrict end) | |||||
const uint8_t *ff_h263_find_resync_marker(MpegEncContext *s, const uint8_t *av_restrict p, const uint8_t *av_restrict end) | |||||
{ | { | ||||
av_assert2(p < end); | av_assert2(p < end); | ||||
end-=2; | end-=2; | ||||
p++; | p++; | ||||
for(;p<end; p+=2){ | |||||
if(!*p){ | |||||
if (!p[-1] && p[1]) return p - 1; | |||||
else if(!p[ 1] && p[2]) return p; | |||||
if(s->resync_marker){ | |||||
for(;p<end; p+=2){ | |||||
if(!*p){ | |||||
if (!p[-1] && p[1]) return p - 1; | |||||
else if(!p[ 1] && p[2]) return p; | |||||
} | |||||
} | } | ||||
} | } | ||||
return end+2; | return end+2; | ||||