utvideoenc: properly set slice height/last line
Mimic decoder and obey sampling.
Does not affect fate tests for utvideo.
Fixes ticket #3949.
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
(cherry picked from commit cb530dda7d
)
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
This commit is contained in:

committed by
Michael Niedermayer

parent
3bb4c3e74d
commit
aa40f11b81
@@ -387,7 +387,7 @@ static int write_huff_codes(uint8_t *src, uint8_t *dst, int dst_size,
|
|||||||
}
|
}
|
||||||
|
|
||||||
static int encode_plane(AVCodecContext *avctx, uint8_t *src,
|
static int encode_plane(AVCodecContext *avctx, uint8_t *src,
|
||||||
uint8_t *dst, int stride,
|
uint8_t *dst, int stride, int plane_no,
|
||||||
int width, int height, PutByteContext *pb)
|
int width, int height, PutByteContext *pb)
|
||||||
{
|
{
|
||||||
UtvideoContext *c = avctx->priv_data;
|
UtvideoContext *c = avctx->priv_data;
|
||||||
@@ -397,6 +397,7 @@ static int encode_plane(AVCodecContext *avctx, uint8_t *src,
|
|||||||
HuffEntry he[256];
|
HuffEntry he[256];
|
||||||
|
|
||||||
uint32_t offset = 0, slice_len = 0;
|
uint32_t offset = 0, slice_len = 0;
|
||||||
|
const int cmask = ~(!plane_no && avctx->pix_fmt == AV_PIX_FMT_YUV420P);
|
||||||
int i, sstart, send = 0;
|
int i, sstart, send = 0;
|
||||||
int symbol;
|
int symbol;
|
||||||
int ret;
|
int ret;
|
||||||
@@ -406,7 +407,7 @@ static int encode_plane(AVCodecContext *avctx, uint8_t *src,
|
|||||||
case PRED_NONE:
|
case PRED_NONE:
|
||||||
for (i = 0; i < c->slices; i++) {
|
for (i = 0; i < c->slices; i++) {
|
||||||
sstart = send;
|
sstart = send;
|
||||||
send = height * (i + 1) / c->slices;
|
send = height * (i + 1) / c->slices & cmask;
|
||||||
av_image_copy_plane(dst + sstart * width, width,
|
av_image_copy_plane(dst + sstart * width, width,
|
||||||
src + sstart * stride, stride,
|
src + sstart * stride, stride,
|
||||||
width, send - sstart);
|
width, send - sstart);
|
||||||
@@ -415,7 +416,7 @@ static int encode_plane(AVCodecContext *avctx, uint8_t *src,
|
|||||||
case PRED_LEFT:
|
case PRED_LEFT:
|
||||||
for (i = 0; i < c->slices; i++) {
|
for (i = 0; i < c->slices; i++) {
|
||||||
sstart = send;
|
sstart = send;
|
||||||
send = height * (i + 1) / c->slices;
|
send = height * (i + 1) / c->slices & cmask;
|
||||||
left_predict(src + sstart * stride, dst + sstart * width,
|
left_predict(src + sstart * stride, dst + sstart * width,
|
||||||
stride, width, send - sstart);
|
stride, width, send - sstart);
|
||||||
}
|
}
|
||||||
@@ -423,7 +424,7 @@ static int encode_plane(AVCodecContext *avctx, uint8_t *src,
|
|||||||
case PRED_MEDIAN:
|
case PRED_MEDIAN:
|
||||||
for (i = 0; i < c->slices; i++) {
|
for (i = 0; i < c->slices; i++) {
|
||||||
sstart = send;
|
sstart = send;
|
||||||
send = height * (i + 1) / c->slices;
|
send = height * (i + 1) / c->slices & cmask;
|
||||||
median_predict(c, src + sstart * stride, dst + sstart * width,
|
median_predict(c, src + sstart * stride, dst + sstart * width,
|
||||||
stride, width, send - sstart);
|
stride, width, send - sstart);
|
||||||
}
|
}
|
||||||
@@ -487,7 +488,7 @@ static int encode_plane(AVCodecContext *avctx, uint8_t *src,
|
|||||||
send = 0;
|
send = 0;
|
||||||
for (i = 0; i < c->slices; i++) {
|
for (i = 0; i < c->slices; i++) {
|
||||||
sstart = send;
|
sstart = send;
|
||||||
send = height * (i + 1) / c->slices;
|
send = height * (i + 1) / c->slices & cmask;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Write the huffman codes to a buffer,
|
* Write the huffman codes to a buffer,
|
||||||
@@ -569,7 +570,7 @@ static int utvideo_encode_frame(AVCodecContext *avctx, AVPacket *pkt,
|
|||||||
case AV_PIX_FMT_RGBA:
|
case AV_PIX_FMT_RGBA:
|
||||||
for (i = 0; i < c->planes; i++) {
|
for (i = 0; i < c->planes; i++) {
|
||||||
ret = encode_plane(avctx, c->slice_buffer[i] + 2 * c->slice_stride,
|
ret = encode_plane(avctx, c->slice_buffer[i] + 2 * c->slice_stride,
|
||||||
c->slice_buffer[i], c->slice_stride,
|
c->slice_buffer[i], c->slice_stride, i,
|
||||||
width, height, &pb);
|
width, height, &pb);
|
||||||
|
|
||||||
if (ret) {
|
if (ret) {
|
||||||
@@ -581,7 +582,7 @@ static int utvideo_encode_frame(AVCodecContext *avctx, AVPacket *pkt,
|
|||||||
case AV_PIX_FMT_YUV422P:
|
case AV_PIX_FMT_YUV422P:
|
||||||
for (i = 0; i < c->planes; i++) {
|
for (i = 0; i < c->planes; i++) {
|
||||||
ret = encode_plane(avctx, pic->data[i], c->slice_buffer[0],
|
ret = encode_plane(avctx, pic->data[i], c->slice_buffer[0],
|
||||||
pic->linesize[i], width >> !!i, height, &pb);
|
pic->linesize[i], i, width >> !!i, height, &pb);
|
||||||
|
|
||||||
if (ret) {
|
if (ret) {
|
||||||
av_log(avctx, AV_LOG_ERROR, "Error encoding plane %d.\n", i);
|
av_log(avctx, AV_LOG_ERROR, "Error encoding plane %d.\n", i);
|
||||||
@@ -592,7 +593,7 @@ static int utvideo_encode_frame(AVCodecContext *avctx, AVPacket *pkt,
|
|||||||
case AV_PIX_FMT_YUV420P:
|
case AV_PIX_FMT_YUV420P:
|
||||||
for (i = 0; i < c->planes; i++) {
|
for (i = 0; i < c->planes; i++) {
|
||||||
ret = encode_plane(avctx, pic->data[i], c->slice_buffer[0],
|
ret = encode_plane(avctx, pic->data[i], c->slice_buffer[0],
|
||||||
pic->linesize[i], width >> !!i, height >> !!i,
|
pic->linesize[i], i, width >> !!i, height >> !!i,
|
||||||
&pb);
|
&pb);
|
||||||
|
|
||||||
if (ret) {
|
if (ret) {
|
||||||
|
Reference in New Issue
Block a user