avcodec/mpegutils: Fix ff_draw_horiz_band()
Broken in5ecf5b93dd. More precisely,3994623df2changed the precursor of ff_mpv_reconstruct_mb() to always decode to the first row of macroblocks for B pictures when a draw_horiz_band callback is set and to (they are exported to the caller via said callback and each row overwrites the previously decoded row; this was probably intended as a cache-optimization). This first macroblock row was used as source for the draw_horiz_band callback. This of course means that the ordinary output B-frame was not decoded correctly at all. Therefore the first aforementioned commit removed this special handling of draw_horiz_band; yet it did not remove the special handling for B-frames in ff_draw_horiz_band(), which broke draw_horiz_band for B-frames. This commit fixes this. (Actually, draw_horiz_band was already broken before5ecf5b93ddwhen using slice-threading: All slice-threads would write to the first row of macroblocks for B-frames, leading to data races. It seems no one has ever complained about this, just as no one has ever complained about the breakage caused by5ecf5b93dd. Probably no one uses draw_horiz_band.) Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
This commit is contained in:
parent
f8b8f16163
commit
c28e553cbf
1 changed files with 7 additions and 14 deletions
|
|
@ -57,6 +57,7 @@ void ff_draw_horiz_band(AVCodecContext *avctx,
|
|||
int first_field, int low_delay)
|
||||
{
|
||||
const int field_pic = picture_structure != PICT_FRAME;
|
||||
const AVPixFmtDescriptor *desc;
|
||||
const AVFrame *src;
|
||||
int offset[AV_NUM_DATA_POINTERS];
|
||||
|
||||
|
|
@ -82,21 +83,13 @@ void ff_draw_horiz_band(AVCodecContext *avctx,
|
|||
else
|
||||
return;
|
||||
|
||||
if (cur->pict_type == AV_PICTURE_TYPE_B &&
|
||||
picture_structure == PICT_FRAME &&
|
||||
avctx->codec_id != AV_CODEC_ID_SVQ3) {
|
||||
for (int i = 0; i < AV_NUM_DATA_POINTERS; i++)
|
||||
offset[i] = 0;
|
||||
} else {
|
||||
const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(avctx->pix_fmt);
|
||||
int vshift = desc->log2_chroma_h;
|
||||
desc = av_pix_fmt_desc_get(avctx->pix_fmt);
|
||||
|
||||
offset[0] = y * src->linesize[0];
|
||||
offset[1] =
|
||||
offset[2] = (y >> vshift) * src->linesize[1];
|
||||
for (int i = 3; i < AV_NUM_DATA_POINTERS; i++)
|
||||
offset[i] = 0;
|
||||
}
|
||||
offset[0] = y * src->linesize[0];
|
||||
offset[1] =
|
||||
offset[2] = (y >> desc->log2_chroma_h) * src->linesize[1];
|
||||
for (int i = 3; i < AV_NUM_DATA_POINTERS; i++)
|
||||
offset[i] = 0;
|
||||
|
||||
emms_c();
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue