mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2025-03-28 12:32:17 +02:00
h264: move resync_mb_{x,y} into the per-slice context
This commit is contained in:
parent
d4d9068cdf
commit
7bbc254d64
libavcodec
@ -358,6 +358,8 @@ typedef struct H264SliceContext {
|
|||||||
|
|
||||||
int mb_x, mb_y;
|
int mb_x, mb_y;
|
||||||
int mb_xy;
|
int mb_xy;
|
||||||
|
int resync_mb_x;
|
||||||
|
int resync_mb_y;
|
||||||
int mb_skip_run;
|
int mb_skip_run;
|
||||||
int is_complex;
|
int is_complex;
|
||||||
|
|
||||||
@ -528,8 +530,6 @@ typedef struct H264Context {
|
|||||||
int x264_build;
|
int x264_build;
|
||||||
|
|
||||||
int mb_y;
|
int mb_y;
|
||||||
int resync_mb_x;
|
|
||||||
int resync_mb_y;
|
|
||||||
int mb_height, mb_width;
|
int mb_height, mb_width;
|
||||||
int mb_stride;
|
int mb_stride;
|
||||||
int mb_num;
|
int mb_num;
|
||||||
|
@ -1557,11 +1557,11 @@ int ff_h264_decode_slice_header(H264Context *h, H264SliceContext *sl, H264Contex
|
|||||||
av_log(h->avctx, AV_LOG_ERROR, "first_mb_in_slice overflow\n");
|
av_log(h->avctx, AV_LOG_ERROR, "first_mb_in_slice overflow\n");
|
||||||
return AVERROR_INVALIDDATA;
|
return AVERROR_INVALIDDATA;
|
||||||
}
|
}
|
||||||
h->resync_mb_x = sl->mb_x = first_mb_in_slice % h->mb_width;
|
sl->resync_mb_x = sl->mb_x = first_mb_in_slice % h->mb_width;
|
||||||
h->resync_mb_y = sl->mb_y = (first_mb_in_slice / h->mb_width) <<
|
sl->resync_mb_y = sl->mb_y = (first_mb_in_slice / h->mb_width) <<
|
||||||
FIELD_OR_MBAFF_PICTURE(h);
|
FIELD_OR_MBAFF_PICTURE(h);
|
||||||
if (h->picture_structure == PICT_BOTTOM_FIELD)
|
if (h->picture_structure == PICT_BOTTOM_FIELD)
|
||||||
h->resync_mb_y = sl->mb_y = sl->mb_y + 1;
|
sl->resync_mb_y = sl->mb_y = sl->mb_y + 1;
|
||||||
assert(sl->mb_y < h->mb_height);
|
assert(sl->mb_y < h->mb_height);
|
||||||
|
|
||||||
if (h->picture_structure == PICT_FRAME) {
|
if (h->picture_structure == PICT_FRAME) {
|
||||||
@ -2224,7 +2224,7 @@ static int decode_slice(struct AVCodecContext *avctx, void *arg)
|
|||||||
|
|
||||||
if ((h->workaround_bugs & FF_BUG_TRUNCATED) &&
|
if ((h->workaround_bugs & FF_BUG_TRUNCATED) &&
|
||||||
sl->cabac.bytestream > sl->cabac.bytestream_end + 2) {
|
sl->cabac.bytestream > sl->cabac.bytestream_end + 2) {
|
||||||
er_add_slice(h, sl, h->resync_mb_x, h->resync_mb_y, sl->mb_x - 1,
|
er_add_slice(h, sl, sl->resync_mb_x, sl->resync_mb_y, sl->mb_x - 1,
|
||||||
sl->mb_y, ER_MB_END);
|
sl->mb_y, ER_MB_END);
|
||||||
if (sl->mb_x >= lf_x_start)
|
if (sl->mb_x >= lf_x_start)
|
||||||
loop_filter(h, sl, lf_x_start, sl->mb_x + 1);
|
loop_filter(h, sl, lf_x_start, sl->mb_x + 1);
|
||||||
@ -2235,7 +2235,7 @@ static int decode_slice(struct AVCodecContext *avctx, void *arg)
|
|||||||
"error while decoding MB %d %d, bytestream %td\n",
|
"error while decoding MB %d %d, bytestream %td\n",
|
||||||
sl->mb_x, sl->mb_y,
|
sl->mb_x, sl->mb_y,
|
||||||
sl->cabac.bytestream_end - sl->cabac.bytestream);
|
sl->cabac.bytestream_end - sl->cabac.bytestream);
|
||||||
er_add_slice(h, sl, h->resync_mb_x, h->resync_mb_y, sl->mb_x,
|
er_add_slice(h, sl, sl->resync_mb_x, sl->resync_mb_y, sl->mb_x,
|
||||||
sl->mb_y, ER_MB_ERROR);
|
sl->mb_y, ER_MB_ERROR);
|
||||||
return AVERROR_INVALIDDATA;
|
return AVERROR_INVALIDDATA;
|
||||||
}
|
}
|
||||||
@ -2255,7 +2255,7 @@ static int decode_slice(struct AVCodecContext *avctx, void *arg)
|
|||||||
if (eos || sl->mb_y >= h->mb_height) {
|
if (eos || sl->mb_y >= h->mb_height) {
|
||||||
tprintf(h->avctx, "slice end %d %d\n",
|
tprintf(h->avctx, "slice end %d %d\n",
|
||||||
get_bits_count(&h->gb), h->gb.size_in_bits);
|
get_bits_count(&h->gb), h->gb.size_in_bits);
|
||||||
er_add_slice(h, sl, h->resync_mb_x, h->resync_mb_y, sl->mb_x - 1,
|
er_add_slice(h, sl, sl->resync_mb_x, sl->resync_mb_y, sl->mb_x - 1,
|
||||||
sl->mb_y, ER_MB_END);
|
sl->mb_y, ER_MB_END);
|
||||||
if (sl->mb_x > lf_x_start)
|
if (sl->mb_x > lf_x_start)
|
||||||
loop_filter(h, sl, lf_x_start, sl->mb_x);
|
loop_filter(h, sl, lf_x_start, sl->mb_x);
|
||||||
@ -2282,7 +2282,7 @@ static int decode_slice(struct AVCodecContext *avctx, void *arg)
|
|||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
av_log(h->avctx, AV_LOG_ERROR,
|
av_log(h->avctx, AV_LOG_ERROR,
|
||||||
"error while decoding MB %d %d\n", sl->mb_x, sl->mb_y);
|
"error while decoding MB %d %d\n", sl->mb_x, sl->mb_y);
|
||||||
er_add_slice(h, sl, h->resync_mb_x, h->resync_mb_y, sl->mb_x,
|
er_add_slice(h, sl, sl->resync_mb_x, sl->resync_mb_y, sl->mb_x,
|
||||||
sl->mb_y, ER_MB_ERROR);
|
sl->mb_y, ER_MB_ERROR);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
@ -2302,12 +2302,12 @@ static int decode_slice(struct AVCodecContext *avctx, void *arg)
|
|||||||
get_bits_count(&h->gb), h->gb.size_in_bits);
|
get_bits_count(&h->gb), h->gb.size_in_bits);
|
||||||
|
|
||||||
if (get_bits_left(&h->gb) == 0) {
|
if (get_bits_left(&h->gb) == 0) {
|
||||||
er_add_slice(h, sl, h->resync_mb_x, h->resync_mb_y,
|
er_add_slice(h, sl, sl->resync_mb_x, sl->resync_mb_y,
|
||||||
sl->mb_x - 1, sl->mb_y, ER_MB_END);
|
sl->mb_x - 1, sl->mb_y, ER_MB_END);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
} else {
|
} else {
|
||||||
er_add_slice(h, sl, h->resync_mb_x, h->resync_mb_y,
|
er_add_slice(h, sl, sl->resync_mb_x, sl->resync_mb_y,
|
||||||
sl->mb_x - 1, sl->mb_y, ER_MB_END);
|
sl->mb_x - 1, sl->mb_y, ER_MB_END);
|
||||||
|
|
||||||
return AVERROR_INVALIDDATA;
|
return AVERROR_INVALIDDATA;
|
||||||
@ -2320,14 +2320,14 @@ static int decode_slice(struct AVCodecContext *avctx, void *arg)
|
|||||||
get_bits_count(&h->gb), h->gb.size_in_bits);
|
get_bits_count(&h->gb), h->gb.size_in_bits);
|
||||||
|
|
||||||
if (get_bits_left(&h->gb) == 0) {
|
if (get_bits_left(&h->gb) == 0) {
|
||||||
er_add_slice(h, sl, h->resync_mb_x, h->resync_mb_y,
|
er_add_slice(h, sl, sl->resync_mb_x, sl->resync_mb_y,
|
||||||
sl->mb_x - 1, sl->mb_y, ER_MB_END);
|
sl->mb_x - 1, sl->mb_y, ER_MB_END);
|
||||||
if (sl->mb_x > lf_x_start)
|
if (sl->mb_x > lf_x_start)
|
||||||
loop_filter(h, sl, lf_x_start, sl->mb_x);
|
loop_filter(h, sl, lf_x_start, sl->mb_x);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
} else {
|
} else {
|
||||||
er_add_slice(h, sl, h->resync_mb_x, h->resync_mb_y, sl->mb_x,
|
er_add_slice(h, sl, sl->resync_mb_x, sl->resync_mb_y, sl->mb_x,
|
||||||
sl->mb_y, ER_MB_ERROR);
|
sl->mb_y, ER_MB_ERROR);
|
||||||
|
|
||||||
return AVERROR_INVALIDDATA;
|
return AVERROR_INVALIDDATA;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user