Commit cb530dda authored by Christophe Gisquet's avatar Christophe Gisquet Committed by Michael Niedermayer

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: 's avatarMichael Niedermayer <michaelni@gmx.at>
parent 171d971d
...@@ -389,7 +389,7 @@ static int write_huff_codes(uint8_t *src, uint8_t *dst, int dst_size, ...@@ -389,7 +389,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;
...@@ -399,6 +399,7 @@ static int encode_plane(AVCodecContext *avctx, uint8_t *src, ...@@ -399,6 +399,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;
...@@ -408,7 +409,7 @@ static int encode_plane(AVCodecContext *avctx, uint8_t *src, ...@@ -408,7 +409,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);
...@@ -417,7 +418,7 @@ static int encode_plane(AVCodecContext *avctx, uint8_t *src, ...@@ -417,7 +418,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);
} }
...@@ -425,7 +426,7 @@ static int encode_plane(AVCodecContext *avctx, uint8_t *src, ...@@ -425,7 +426,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);
} }
...@@ -489,7 +490,7 @@ static int encode_plane(AVCodecContext *avctx, uint8_t *src, ...@@ -489,7 +490,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,
...@@ -571,7 +572,7 @@ static int utvideo_encode_frame(AVCodecContext *avctx, AVPacket *pkt, ...@@ -571,7 +572,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) {
...@@ -583,7 +584,7 @@ static int utvideo_encode_frame(AVCodecContext *avctx, AVPacket *pkt, ...@@ -583,7 +584,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);
...@@ -594,7 +595,7 @@ static int utvideo_encode_frame(AVCodecContext *avctx, AVPacket *pkt, ...@@ -594,7 +595,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) {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment