mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2025-01-13 21:28:01 +02:00
Add PB-frame decoding support for H.263/i263 (and enable it for i263)
Originally committed as revision 17745 to svn://svn.ffmpeg.org/ffmpeg/trunk
This commit is contained in:
parent
6053da0182
commit
685502cf3d
@ -40,6 +40,7 @@
|
|||||||
#include "h263data.h"
|
#include "h263data.h"
|
||||||
#include "mpeg4data.h"
|
#include "mpeg4data.h"
|
||||||
#include "mathops.h"
|
#include "mathops.h"
|
||||||
|
#include "unary.h"
|
||||||
|
|
||||||
//#undef NDEBUG
|
//#undef NDEBUG
|
||||||
//#include <assert.h>
|
//#include <assert.h>
|
||||||
@ -3905,12 +3906,50 @@ static void h263_decode_dquant(MpegEncContext *s){
|
|||||||
ff_set_qscale(s, s->qscale);
|
ff_set_qscale(s, s->qscale);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int h263_skip_b_part(MpegEncContext *s, int cbp)
|
||||||
|
{
|
||||||
|
DECLARE_ALIGNED(16, DCTELEM, dblock[64]);
|
||||||
|
int i, mbi;
|
||||||
|
|
||||||
|
/* we have to set s->mb_intra to zero to decode B-part of PB-frame correctly
|
||||||
|
* but real value should be restored in order to be used later (in OBMC condition)
|
||||||
|
*/
|
||||||
|
mbi = s->mb_intra;
|
||||||
|
s->mb_intra = 0;
|
||||||
|
for (i = 0; i < 6; i++) {
|
||||||
|
if (h263_decode_block(s, dblock, i, cbp&32) < 0)
|
||||||
|
return -1;
|
||||||
|
cbp+=cbp;
|
||||||
|
}
|
||||||
|
s->mb_intra = mbi;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int h263_get_modb(GetBitContext *gb, int pb_frame, int *cbpb)
|
||||||
|
{
|
||||||
|
int c, mv = 1;
|
||||||
|
|
||||||
|
if (pb_frame < 3) { // h.263 Annex G and i263 PB-frame
|
||||||
|
c = get_bits1(gb);
|
||||||
|
if (pb_frame == 2 && c)
|
||||||
|
mv = !get_bits1(gb);
|
||||||
|
} else { // h.263 Annex M improved PB-frame
|
||||||
|
mv = get_unary(gb, 0, 4) + 1;
|
||||||
|
c = mv & 1;
|
||||||
|
mv = !!(mv & 2);
|
||||||
|
}
|
||||||
|
if(c)
|
||||||
|
*cbpb = get_bits(gb, 6);
|
||||||
|
return mv;
|
||||||
|
}
|
||||||
|
|
||||||
int ff_h263_decode_mb(MpegEncContext *s,
|
int ff_h263_decode_mb(MpegEncContext *s,
|
||||||
DCTELEM block[6][64])
|
DCTELEM block[6][64])
|
||||||
{
|
{
|
||||||
int cbpc, cbpy, i, cbp, pred_x, pred_y, mx, my, dquant;
|
int cbpc, cbpy, i, cbp, pred_x, pred_y, mx, my, dquant;
|
||||||
int16_t *mot_val;
|
int16_t *mot_val;
|
||||||
const int xy= s->mb_x + s->mb_y * s->mb_stride;
|
const int xy= s->mb_x + s->mb_y * s->mb_stride;
|
||||||
|
int cbpb = 0, pb_mv_count = 0;
|
||||||
|
|
||||||
assert(!s->h263_pred);
|
assert(!s->h263_pred);
|
||||||
|
|
||||||
@ -3943,6 +3982,8 @@ int ff_h263_decode_mb(MpegEncContext *s,
|
|||||||
s->mb_intra = ((cbpc & 4) != 0);
|
s->mb_intra = ((cbpc & 4) != 0);
|
||||||
if (s->mb_intra) goto intra;
|
if (s->mb_intra) goto intra;
|
||||||
|
|
||||||
|
if(s->pb_frame && get_bits1(&s->gb))
|
||||||
|
pb_mv_count = h263_get_modb(&s->gb, s->pb_frame, &cbpb);
|
||||||
cbpy = get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1);
|
cbpy = get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1);
|
||||||
|
|
||||||
if(s->alt_inter_vlc==0 || (cbpc & 3)!=3)
|
if(s->alt_inter_vlc==0 || (cbpc & 3)!=3)
|
||||||
@ -4118,6 +4159,8 @@ intra:
|
|||||||
}else
|
}else
|
||||||
s->ac_pred = 0;
|
s->ac_pred = 0;
|
||||||
|
|
||||||
|
if(s->pb_frame && get_bits1(&s->gb))
|
||||||
|
pb_mv_count = h263_get_modb(&s->gb, s->pb_frame, &cbpb);
|
||||||
cbpy = get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1);
|
cbpy = get_vlc2(&s->gb, cbpy_vlc.table, CBPY_VLC_BITS, 1);
|
||||||
if(cbpy<0){
|
if(cbpy<0){
|
||||||
av_log(s->avctx, AV_LOG_ERROR, "I cbpy damaged at %d %d\n", s->mb_x, s->mb_y);
|
av_log(s->avctx, AV_LOG_ERROR, "I cbpy damaged at %d %d\n", s->mb_x, s->mb_y);
|
||||||
@ -4127,6 +4170,13 @@ intra:
|
|||||||
if (dquant) {
|
if (dquant) {
|
||||||
h263_decode_dquant(s);
|
h263_decode_dquant(s);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pb_mv_count += !!s->pb_frame;
|
||||||
|
}
|
||||||
|
|
||||||
|
while(pb_mv_count--){
|
||||||
|
h263_decode_motion(s, 0, 1);
|
||||||
|
h263_decode_motion(s, 0, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* decode each block */
|
/* decode each block */
|
||||||
@ -4136,6 +4186,8 @@ intra:
|
|||||||
cbp+=cbp;
|
cbp+=cbp;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(s->pb_frame && h263_skip_b_part(s, cbpb) < 0)
|
||||||
|
return -1;
|
||||||
if(s->obmc && !s->mb_intra){
|
if(s->obmc && !s->mb_intra){
|
||||||
if(s->pict_type == FF_P_TYPE && s->mb_x+1<s->mb_width && s->mb_num_left != 1)
|
if(s->pict_type == FF_P_TYPE && s->mb_x+1<s->mb_width && s->mb_num_left != 1)
|
||||||
preview_obmc(s);
|
preview_obmc(s);
|
||||||
@ -6241,10 +6293,6 @@ int intel_h263_decode_picture_header(MpegEncContext *s)
|
|||||||
if(s->avctx->debug&FF_DEBUG_PICT_INFO)
|
if(s->avctx->debug&FF_DEBUG_PICT_INFO)
|
||||||
show_pict_info(s);
|
show_pict_info(s);
|
||||||
|
|
||||||
if(s->pb_frame){
|
|
||||||
av_log(s->avctx, AV_LOG_ERROR, "PB frame mode no supported\n");
|
|
||||||
return -1; /* PB frame mode */
|
|
||||||
}
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user