On Sun, Oct 23, 2011 at 09:14:38PM +0100, Måns Rullgård wrote:
> "Anton Khirnov " <[email protected]> writes:
>
> > Module: libav
> > Branch: master
> > Commit: da22ba7df461c13bf0b0eabc953303803a285d91
> >
> > Author: Anton Khirnov <[email protected]>
> > Committer: Anton Khirnov <[email protected]>
> > Date: Wed Oct 19 09:28:45 2011 +0200
> >
> > mpeg12: move full_pel from MpegEncContext to Mpeg1Context
> >
> > It's MPEG-1 specific.
> >
> > ---
> >
> > libavcodec/mpeg12.c | 15 ++++++++-------
> > libavcodec/mpeg12.h | 1 +
> > libavcodec/mpegvideo.h | 1 -
> > libavcodec/vdpau.c | 7 ++++---
> > libavcodec/vdpau_internal.h | 3 ++-
> > 5 files changed, 15 insertions(+), 12 deletions(-)
>
> This appears to have broken threading. Easily reproduced with more than
> two threads.
it broke slice threading, easiest solution is to revert. slice threading
and mpeg_decode_slice don't agree on which type to take. Before this
commit mpeg_decode_slice needed only MpegEncContext which is all the
slice threading has available it wasn't reflected in the code though.
Janne
---8<---
This reverts commit da22ba7df461c13bf0b0eabc953303803a285d91 since it
broke slice threading. Slice threading just duplicates MpegEncContext
so every value used during mpeg_decode_slice has to be in it.
A second patch will fix the illusion that Mpeg1Context is available
in mpeg_decode_slice.
---
libavcodec/mpeg12.c | 15 +++++++--------
libavcodec/mpeg12.h | 1 -
libavcodec/mpegvideo.h | 1 +
libavcodec/vdpau.c | 7 +++----
libavcodec/vdpau_internal.h | 3 +--
5 files changed, 12 insertions(+), 15 deletions(-)
diff --git a/libavcodec/mpeg12.c b/libavcodec/mpeg12.c
index 6fb175e..4542d59 100644
--- a/libavcodec/mpeg12.c
+++ b/libavcodec/mpeg12.c
@@ -734,9 +734,8 @@ static void exchange_uv(MpegEncContext *s)
#define MT_16X8 2
#define MT_DMV 3
-static int mpeg_decode_mb(Mpeg1Context *s1, DCTELEM block[12][64])
+static int mpeg_decode_mb(MpegEncContext *s, DCTELEM block[12][64])
{
- MpegEncContext *s = &s1->mpeg_enc_ctx;
int i, j, k, cbp, val, mb_type, motion_type;
const int mb_block_count = 4 + (1 << s->chroma_format);
@@ -910,7 +909,7 @@ static int mpeg_decode_mb(Mpeg1Context *s1, DCTELEM
block[12][64])
s->mv[i][0][1]= s->last_mv[i][0][1]=
s->last_mv[i][1][1] =
mpeg_decode_motion(s, s->mpeg_f_code[i][1],
s->last_mv[i][0][1]);
/* full_pel: only for MPEG-1 */
- if (s1->full_pel[i]) {
+ if (s->full_pel[i]) {
s->mv[i][0][0] <<= 1;
s->mv[i][0][1] <<= 1;
}
@@ -1328,7 +1327,7 @@ static int mpeg1_decode_picture(AVCodecContext *avctx,
vbv_delay = get_bits(&s->gb, 16);
if (s->pict_type == AV_PICTURE_TYPE_P || s->pict_type ==
AV_PICTURE_TYPE_B) {
- s1->full_pel[0] = get_bits1(&s->gb);
+ s->full_pel[0] = get_bits1(&s->gb);
f_code = get_bits(&s->gb, 3);
if (f_code == 0 && (avctx->err_recognition & AV_EF_BITSTREAM))
return -1;
@@ -1336,7 +1335,7 @@ static int mpeg1_decode_picture(AVCodecContext *avctx,
s->mpeg_f_code[0][1] = f_code;
}
if (s->pict_type == AV_PICTURE_TYPE_B) {
- s1->full_pel[1] = get_bits1(&s->gb);
+ s->full_pel[1] = get_bits1(&s->gb);
f_code = get_bits(&s->gb, 3);
if (f_code == 0 && (avctx->err_recognition & AV_EF_BITSTREAM))
return -1;
@@ -1484,7 +1483,7 @@ static void
mpeg_decode_picture_coding_extension(Mpeg1Context *s1)
{
MpegEncContext *s = &s1->mpeg_enc_ctx;
- s1->full_pel[0] = s1->full_pel[1] = 0;
+ s->full_pel[0] = s->full_pel[1] = 0;
s->mpeg_f_code[0][0] = get_bits(&s->gb, 4);
s->mpeg_f_code[0][1] = get_bits(&s->gb, 4);
s->mpeg_f_code[1][0] = get_bits(&s->gb, 4);
@@ -1716,7 +1715,7 @@ static int mpeg_decode_slice(Mpeg1Context *s1, int mb_y,
if (CONFIG_MPEG_XVMC_DECODER && s->avctx->xvmc_acceleration > 1)
ff_xvmc_init_block(s); // set s->block
- if (mpeg_decode_mb(s1, s->block) < 0)
+ if (mpeg_decode_mb(s, s->block) < 0)
return -1;
if (s->current_picture.f.motion_val[0] && !s->encoding) { // note
motion_val is normally NULL unless we want to extract the MVs
@@ -2259,7 +2258,7 @@ static int decode_chunks(AVCodecContext *avctx,
}
if (CONFIG_MPEG_VDPAU_DECODER && avctx->codec->capabilities &
CODEC_CAP_HWACCEL_VDPAU)
- ff_vdpau_mpeg_picture_complete(s, buf, buf_size,
s->slice_count);
+ ff_vdpau_mpeg_picture_complete(s2, buf, buf_size,
s->slice_count);
if (slice_end(avctx, picture)) {
if (s2->last_picture_ptr || s2->low_delay) //FIXME merge
with the stuff in mpeg_decode_slice
diff --git a/libavcodec/mpeg12.h b/libavcodec/mpeg12.h
index 209bf05..ab0352f 100644
--- a/libavcodec/mpeg12.h
+++ b/libavcodec/mpeg12.h
@@ -41,7 +41,6 @@ typedef struct Mpeg1Context {
int save_width, save_height, save_progressive_seq;
AVRational frame_rate_ext; ///< MPEG-2 specific framerate modificator
int sync; ///< Did we reach a sync point like a
GOP/SEQ/KEYFrame?
- int full_pel[2];
int closed_gop; ///< GOP is closed
} Mpeg1Context;
diff --git a/libavcodec/mpegvideo.h b/libavcodec/mpegvideo.h
index b69519a..46ad5d8 100644
--- a/libavcodec/mpegvideo.h
+++ b/libavcodec/mpegvideo.h
@@ -633,6 +633,7 @@ typedef struct MpegEncContext {
int chroma_y_shift;
int progressive_frame;
+ int full_pel[2];
int interlaced_dct;
int first_slice;
int first_field; ///< is 1 for the first field of a field picture
0 otherwise
diff --git a/libavcodec/vdpau.c b/libavcodec/vdpau.c
index 2a7894e..df04ca0 100644
--- a/libavcodec/vdpau.c
+++ b/libavcodec/vdpau.c
@@ -190,10 +190,9 @@ void ff_vdpau_h264_picture_complete(MpegEncContext *s)
render->bitstream_buffers_used = 0;
}
-void ff_vdpau_mpeg_picture_complete(Mpeg1Context *s1, const uint8_t *buf,
+void ff_vdpau_mpeg_picture_complete(MpegEncContext *s, const uint8_t *buf,
int buf_size, int slice_count)
{
- MpegEncContext *s = &s1->mpeg_enc_ctx;
struct vdpau_render_state *render, *last, *next;
int i;
@@ -212,8 +211,8 @@ void ff_vdpau_mpeg_picture_complete(Mpeg1Context *s1, const
uint8_t *buf,
render->info.mpeg.alternate_scan = s->alternate_scan;
render->info.mpeg.q_scale_type = s->q_scale_type;
render->info.mpeg.top_field_first = s->top_field_first;
- render->info.mpeg.full_pel_forward_vector = s1->full_pel[0]; // MPEG-1
only. Set 0 for MPEG-2
- render->info.mpeg.full_pel_backward_vector = s1->full_pel[1]; // MPEG-1
only. Set 0 for MPEG-2
+ render->info.mpeg.full_pel_forward_vector = s->full_pel[0]; // MPEG-1
only. Set 0 for MPEG-2
+ render->info.mpeg.full_pel_backward_vector = s->full_pel[1]; // MPEG-1
only. Set 0 for MPEG-2
render->info.mpeg.f_code[0][0] = s->mpeg_f_code[0][0]; //
For MPEG-1 fill both horiz. & vert.
render->info.mpeg.f_code[0][1] = s->mpeg_f_code[0][1];
render->info.mpeg.f_code[1][0] = s->mpeg_f_code[1][0];
diff --git a/libavcodec/vdpau_internal.h b/libavcodec/vdpau_internal.h
index 49f8e46..673fd33 100644
--- a/libavcodec/vdpau_internal.h
+++ b/libavcodec/vdpau_internal.h
@@ -26,12 +26,11 @@
#include <stdint.h>
#include "mpegvideo.h"
-#include "mpeg12.h"
void ff_vdpau_add_data_chunk(MpegEncContext *s, const uint8_t *buf,
int buf_size);
-void ff_vdpau_mpeg_picture_complete(Mpeg1Context *s1, const uint8_t *buf,
+void ff_vdpau_mpeg_picture_complete(MpegEncContext *s, const uint8_t *buf,
int buf_size, int slice_count);
void ff_vdpau_h264_picture_start(MpegEncContext *s);
--
1.7.7
_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel