1
0
mirror of https://github.com/mpv-player/mpv synced 2025-04-01 23:00:41 +00:00

added mpeg 1/2 postprocessing

git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@42 b3059339-0415-0410-9bf9-f77b7e298cf2
This commit is contained in:
arpi_esp 2001-03-05 23:02:30 +00:00
parent d37f8c9c8f
commit f0aac7185f
5 changed files with 62 additions and 12 deletions

3
configure vendored
View File

@ -683,6 +683,9 @@ $_xmmpaudio
/* LIRC (remote control, see www.lirc.org) support: */
$_lircdefs
/* Define this to enable MPEG 1/2 image postprocessing (requires FAST cpu!) */
#define MPEG12_POSTPROC
/* Define if your processor stores words with the most significant
byte first (like Motorola and SPARC, unlike Intel and VAX). */
/* #define WORDS_BIGENDIAN */

View File

@ -51,7 +51,7 @@ mpeg2_config_t config;
static int drop_flag = 0;
static int drop_frame = 0;
#ifdef POSTPROC
#ifdef MPEG12_POSTPROC
int quant_store[MBR+1][MBC+1]; // [Review]
#endif
@ -86,7 +86,7 @@ void mpeg2_init (void)
motion_comp_init ();
}
static vo_frame_t frames[3];
static vo_frame_t frames[4];
void mpeg2_allocate_image_buffers (picture_t * picture)
{
@ -100,7 +100,11 @@ void mpeg2_allocate_image_buffers (picture_t * picture)
buff_size = frame_size + (frame_size/4)*2; // 4Y + 1U + 1V
// allocate images in YV12 format
#ifdef MPEG12_POSTPROC
for(i=0;i<4;i++){
#else
for(i=0;i<3;i++){
#endif
base = shmem_alloc(buff_size);
frames[i].base[0] = base;
frames[i].base[1] = base + frame_size * 5 / 4;
@ -114,13 +118,6 @@ void mpeg2_allocate_image_buffers (picture_t * picture)
picture->backward_reference_frame=&frames[1];
picture->current_frame=&frames[2];
#ifdef POSTPROC
base = shmem_alloc(buff_size);
picture->pp_frame[0] = base;
picture->pp_frame[1] = base + frame_size * 5 / 4;
picture->pp_frame[2] = base + frame_size;
#endif
}
static void copy_slice (vo_frame_t * frame, uint8_t ** src){
@ -157,6 +154,23 @@ static int parse_chunk (vo_functions_t * output, int code, uint8_t * buffer)
if (((picture->picture_structure == FRAME_PICTURE) ||
(picture->second_field))
) {
#ifdef MPEG12_POSTPROC
if(picture->pp_options){
// apply OpenDivX postprocess filter
int stride[3];
stride[0]=picture->coded_picture_width;
stride[1]=stride[2]=stride[0]/2;
postprocess((picture->picture_coding_type == B_TYPE) ?
picture->current_frame->base :
picture->forward_reference_frame->base,
stride[0], frames[3].base, stride[0],
picture->coded_picture_width, picture->coded_picture_height,
&quant_store[1][1], (MBC+1), picture->pp_options);
output->draw_slice (frames[3].base, stride,
picture->display_picture_width,
picture->display_picture_height, 0, 0);
} else
#endif
#if 1
if (picture->picture_coding_type != B_TYPE) {
int stride[3];
@ -215,6 +229,10 @@ static int parse_chunk (vo_functions_t * output, int code, uint8_t * buffer)
} else {
if (picture->picture_coding_type == B_TYPE){
picture->current_frame = &frames[2];
#ifdef MPEG12_POSTPROC
if(picture->pp_options)
picture->current_frame->copy=NULL; else
#endif
picture->current_frame->copy=copy_slice;
} else {
picture->current_frame = picture->forward_reference_frame;

View File

@ -209,3 +209,9 @@ int slice_process (picture_t *picture, uint8_t code, uint8_t * buffer);
/* stats.c */
void stats_header (uint8_t code, uint8_t * buffer);
#ifdef MPEG12_POSTPROC
#define MBC 45
#define MBR 36
extern int quant_store[MBR+1][MBC+1]; // [Review]
#endif

View File

@ -1488,7 +1488,7 @@ do { \
dest[1] += 4 * stride; \
dest[2] += 4 * stride; \
} while (0); \
offset = 0; \
offset = 0; ++code; \
} \
} while (0)
@ -1739,6 +1739,9 @@ int slice_process (picture_t * picture, uint8_t code, uint8_t * buffer)
picture->dc_dct_pred[2] = 1 << (picture->intra_dc_precision+7);
}
#ifdef MPEG12_POSTPROC
quant_store[code][(offset>>4)+1] = picture->quantizer_scale;
#endif
offset += 16;
CHECK_DISPLAY;
@ -1769,6 +1772,10 @@ int slice_process (picture_t * picture, uint8_t code, uint8_t * buffer)
else
MOTION (motion_fi_zero, MACROBLOCK_MOTION_FORWARD);
#ifdef MPEG12_POSTPROC
quant_store[code][(offset>>4)+1] = picture->quantizer_scale;
#endif
offset += 16;
CHECK_DISPLAY;
} while (--mba_inc);
@ -1781,6 +1788,10 @@ int slice_process (picture_t * picture, uint8_t code, uint8_t * buffer)
else
MOTION (motion_fi_reuse, macroblock_modes);
#ifdef MPEG12_POSTPROC
quant_store[code][(offset>>4)+1] = picture->quantizer_scale;
#endif
offset += 16;
CHECK_DISPLAY;
} while (--mba_inc);

View File

@ -337,7 +337,11 @@ int force_ni=0;
for(i=1;i<argc;i++){
if(strcmp(argv[i],"-o")==0){
printf("Option -o has been changed to -vo (video-out), use -vo !\n");
printf("Option -o has been renamed to -vo (video-out), use -vo !\n");
exit(1);
} else
if(strcmp(argv[i],"-divxq")==0){
printf("Option -divxq has been renamed to -pp (postprocessing), use -pp !\n");
exit(1);
} else
if(strcmp(argv[i],"-vo")==0) video_driver=argv[++i]; else
@ -368,7 +372,7 @@ for(i=1;i<argc;i++){
if(strcmp(argv[i],"-fps")==0) force_fps=strtod(argv[++i],NULL); else
if(strcmp(argv[i],"-afm")==0) audio_format=strtol(argv[++i],NULL,0); else
if(strcmp(argv[i],"-vcd")==0) vcd_track=strtol(argv[++i],NULL,0); else
if(strcmp(argv[i],"-divxq")==0) divx_quality=strtol(argv[++i],NULL,0); else
if(strcmp(argv[i],"-pp")==0) divx_quality=strtol(argv[++i],NULL,0); else
if(strcmp(argv[i],"-br")==0) encode_bitrate=strtol(argv[++i],NULL,0); else
if(strcmp(argv[i],"-x")==0) screen_size_x=strtol(argv[++i],NULL,0); else
if(strcmp(argv[i],"-y")==0) screen_size_y=strtol(argv[++i],NULL,0); else
@ -847,7 +851,15 @@ switch(has_video){
if(!videobuffer){ printf("Cannot allocate shared memory\n");exit(0);}
// init libmpeg2:
mpeg2_init();
#ifdef MPEG12_POSTPROC
picture->pp_options=divx_quality;
#else
if(divx_quality){
printf("WARNING! You requested image postprocessing for an MPEG 1/2 video,\n");
printf(" but compiled MPlayer without MPEG 1/2 postprocessing support!\n");
printf(" #define MPEG12_POSTPROC in config.h, and recompile libmpeg2!\n");
}
#endif
if(verbose) printf("mpeg2_init() ok\n");
// ========= Read & process sequence header & extension ============
videobuf_len=0;