41
41
#define DC_VLC_BITS 14 //FIXME find a better solution
43
typedef struct RVDecContext {
43
48
static const uint16_t rv_lum_code[256] =
45
50
0x3e7f, 0x0f00, 0x0f01, 0x0f02, 0x0f03, 0x0f04, 0x0f05, 0x0f06,
187
192
static VLC rv_dc_lum, rv_dc_chrom;
189
int rv_decode_dc(MpegEncContext *s, int n)
194
int ff_rv_decode_dc(MpegEncContext *s, int n)
328
if(RV_GET_MINOR_VER(s->avctx->sub_id) >= 2)
334
if(RV_GET_MINOR_VER(rv->sub_id) >= 2)
329
335
s->loop_filter = get_bits1(&s->gb);
331
if(RV_GET_MINOR_VER(s->avctx->sub_id) <= 1)
337
if(RV_GET_MINOR_VER(rv->sub_id) <= 1)
332
338
seq = get_bits(&s->gb, 8) << 7;
334
340
seq = get_bits(&s->gb, 13) << 2;
356
362
av_log(s->avctx, AV_LOG_DEBUG, "attempting to change resolution to %dx%d\n", new_w, new_h);
357
363
if (av_image_check_size(new_w, new_h, 0, s->avctx) < 0)
365
ff_MPV_common_end(s);
360
366
avcodec_set_dimensions(s->avctx, new_w, new_h);
361
367
s->width = new_w;
362
368
s->height = new_h;
363
if (MPV_common_init(s) < 0)
369
if (ff_MPV_common_init(s) < 0)
373
379
mb_pos = ff_h263_decode_mba(s);
375
//av_log(s->avctx, AV_LOG_DEBUG, "%d\n", seq);
376
381
seq |= s->time &~0x7FFF;
377
382
if(seq - s->time > 0x4000) seq -= 0x8000;
378
383
if(seq - s->time < -0x4000) seq += 0x8000;
391
396
ff_mpeg4_init_direct_mv(s);
394
// printf("%d %d %d %d %d\n", seq, (int)s->time, (int)s->last_non_b_time, s->pp_time, s->pb_time);
395
/*for(i=0; i<32; i++){
396
av_log(s->avctx, AV_LOG_DEBUG, "%d", get_bits1(&s->gb));
398
av_log(s->avctx, AV_LOG_DEBUG, "\n");*/
399
400
s->no_rounding= get_bits1(&s->gb);
401
if(RV_GET_MINOR_VER(s->avctx->sub_id) <= 1 && s->pict_type == AV_PICTURE_TYPE_B)
402
if(RV_GET_MINOR_VER(rv->sub_id) <= 1 && s->pict_type == AV_PICTURE_TYPE_B)
402
403
skip_bits(&s->gb, 5); // binary decoder reads 3+2 bits here but they don't seem to be used
424
424
static av_cold int rv10_decode_init(AVCodecContext *avctx)
426
MpegEncContext *s = avctx->priv_data;
426
RVDecContext *rv = avctx->priv_data;
427
MpegEncContext *s = &rv->m;
427
428
static int done=0;
428
429
int major_ver, minor_ver, micro_ver;
443
444
s->orig_height= s->height = avctx->coded_height;
445
446
s->h263_long_vectors= ((uint8_t*)avctx->extradata)[3] & 1;
446
avctx->sub_id= AV_RB32((uint8_t*)avctx->extradata + 4);
447
rv->sub_id = AV_RB32((uint8_t*)avctx->extradata + 4);
448
major_ver = RV_GET_MAJOR_VER(avctx->sub_id);
449
minor_ver = RV_GET_MINOR_VER(avctx->sub_id);
450
micro_ver = RV_GET_MICRO_VER(avctx->sub_id);
449
major_ver = RV_GET_MAJOR_VER(rv->sub_id);
450
minor_ver = RV_GET_MINOR_VER(rv->sub_id);
451
micro_ver = RV_GET_MICRO_VER(rv->sub_id);
452
453
s->low_delay = 1;
453
454
switch (major_ver) {
465
av_log(s->avctx, AV_LOG_ERROR, "unknown header %X\n", avctx->sub_id);
466
av_log(s->avctx, AV_LOG_ERROR, "unknown header %X\n", rv->sub_id);
466
467
av_log_missing_feature(avctx, "RV1/2 version", 1);
467
468
return AVERROR_PATCHWELCOME;
470
471
if(avctx->debug & FF_DEBUG_PICT_INFO){
471
av_log(avctx, AV_LOG_DEBUG, "ver:%X ver0:%X\n", avctx->sub_id, avctx->extradata_size >= 4 ? ((uint32_t*)avctx->extradata)[0] : -1);
472
av_log(avctx, AV_LOG_DEBUG, "ver:%X ver0:%X\n", rv->sub_id, avctx->extradata_size >= 4 ? ((uint32_t*)avctx->extradata)[0] : -1);
474
avctx->pix_fmt = PIX_FMT_YUV420P;
475
avctx->pix_fmt = AV_PIX_FMT_YUV420P;
476
if (MPV_common_init(s) < 0)
477
if (ff_MPV_common_init(s) < 0)
479
480
ff_h263_decode_init_vlc(s);
497
498
MpegEncContext *s = avctx->priv_data;
500
ff_MPV_common_end(s);
503
504
static int rv10_decode_packet(AVCodecContext *avctx,
504
505
const uint8_t *buf, int buf_size, int buf_size2)
506
MpegEncContext *s = avctx->priv_data;
507
RVDecContext *rv = avctx->priv_data;
508
MpegEncContext *s = &rv->m;
507
509
int mb_count, mb_pos, left, start_mb_x, active_bits_size;
509
511
active_bits_size = buf_size * 8;
510
512
init_get_bits(&s->gb, buf, FFMAX(buf_size, buf_size2) * 8);
511
if(s->codec_id ==CODEC_ID_RV10)
513
if(s->codec_id ==AV_CODEC_ID_RV10)
512
514
mb_count = rv10_decode_picture_header(s);
514
mb_count = rv20_decode_picture_header(s);
516
mb_count = rv20_decode_picture_header(rv);
515
517
if (mb_count < 0) {
516
518
av_log(s->avctx, AV_LOG_ERROR, "HEADER ERROR\n");
532
534
if ((s->mb_x == 0 && s->mb_y == 0) || s->current_picture_ptr==NULL) {
533
535
if(s->current_picture_ptr){ //FIXME write parser so we always have complete frames?
534
536
ff_er_frame_end(s);
536
538
s->mb_x= s->mb_y = s->resync_mb_x = s->resync_mb_y= 0;
538
if(MPV_frame_start(s, avctx) < 0)
540
if(ff_MPV_frame_start(s, avctx) < 0)
540
542
ff_er_frame_start(s);
548
550
av_dlog(avctx, "qscale=%d\n", s->qscale);
550
552
/* default quantization values */
551
if(s->codec_id== CODEC_ID_RV10){
553
if(s->codec_id== AV_CODEC_ID_RV10){
552
554
if(s->mb_y==0) s->first_slice_line=1;
554
556
s->first_slice_line=1;
616
618
if(s->pict_type != AV_PICTURE_TYPE_B)
617
619
ff_h263_update_motion_val(s);
618
MPV_decode_mb(s, s->block);
620
ff_MPV_decode_mb(s, s->block);
619
621
if(s->loop_filter)
620
622
ff_h263_loop_filter(s);
643
645
static int rv10_decode_frame(AVCodecContext *avctx,
644
void *data, int *data_size,
646
void *data, int *got_frame,
647
649
const uint8_t *buf = avpkt->data;
671
673
slice_count = avctx->slice_count;
673
675
for(i=0; i<slice_count; i++){
674
int offset= get_slice_offset(avctx, slices_hdr, i);
676
unsigned offset = get_slice_offset(avctx, slices_hdr, i);
679
if (offset >= buf_size)
680
return AVERROR_INVALIDDATA;
677
682
if(i+1 == slice_count)
678
683
size= buf_size - offset;
685
690
size2= get_slice_offset(avctx, slices_hdr, i+2) - offset;
692
if (size <= 0 || size2 <= 0 ||
693
offset + FFMAX(size, size2) > buf_size)
694
return AVERROR_INVALIDDATA;
687
696
if(rv10_decode_packet(avctx, buf+offset, size, size2) > 8*size)
691
700
if(s->current_picture_ptr != NULL && s->mb_y>=s->mb_height){
692
701
ff_er_frame_end(s);
695
704
if (s->pict_type == AV_PICTURE_TYPE_B || s->low_delay) {
696
*pict= *(AVFrame*)s->current_picture_ptr;
705
*pict = s->current_picture_ptr->f;
697
706
} else if (s->last_picture_ptr != NULL) {
698
*pict= *(AVFrame*)s->last_picture_ptr;
707
*pict = s->last_picture_ptr->f;
701
710
if(s->last_picture_ptr || s->low_delay){
702
*data_size = sizeof(AVFrame);
703
712
ff_print_debug_info(s, pict);
705
s->current_picture_ptr= NULL; //so we can detect if frame_end wasnt called (find some nicer solution...)
714
s->current_picture_ptr= NULL; // so we can detect if frame_end was not called (find some nicer solution...)
708
717
return avpkt->size;
711
720
AVCodec ff_rv10_decoder = {
713
722
.type = AVMEDIA_TYPE_VIDEO,
715
.priv_data_size = sizeof(MpegEncContext),
723
.id = AV_CODEC_ID_RV10,
724
.priv_data_size = sizeof(RVDecContext),
716
725
.init = rv10_decode_init,
717
726
.close = rv10_decode_end,
718
727
.decode = rv10_decode_frame,
719
728
.capabilities = CODEC_CAP_DR1,
721
.long_name = NULL_IF_CONFIG_SMALL("RealVideo 1.0"),
722
.pix_fmts= ff_pixfmt_list_420,
729
.long_name = NULL_IF_CONFIG_SMALL("RealVideo 1.0"),
730
.pix_fmts = ff_pixfmt_list_420,
725
733
AVCodec ff_rv20_decoder = {
727
735
.type = AVMEDIA_TYPE_VIDEO,
729
.priv_data_size = sizeof(MpegEncContext),
736
.id = AV_CODEC_ID_RV20,
737
.priv_data_size = sizeof(RVDecContext),
730
738
.init = rv10_decode_init,
731
739
.close = rv10_decode_end,
732
740
.decode = rv10_decode_frame,
733
741
.capabilities = CODEC_CAP_DR1 | CODEC_CAP_DELAY,
734
.flush= ff_mpeg_flush,
736
.long_name = NULL_IF_CONFIG_SMALL("RealVideo 2.0"),
737
.pix_fmts= ff_pixfmt_list_420,
742
.flush = ff_mpeg_flush,
743
.long_name = NULL_IF_CONFIG_SMALL("RealVideo 2.0"),
744
.pix_fmts = ff_pixfmt_list_420,