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:
parent
d37f8c9c8f
commit
f0aac7185f
3
configure
vendored
3
configure
vendored
@ -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 */
|
||||
|
@ -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;
|
||||
|
@ -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
|
||||
|
@ -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);
|
||||
|
16
mplayer.c
16
mplayer.c
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user