Skip to content
GitLab
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
Xiph.Org
aom-rav1e
Commits
2e862ce7
Commit
2e862ce7
authored
Jan 28, 2014
by
Dmitry Kovalev
Browse files
Adapting postproc example to use new file reading API.
Change-Id: Ib3747c81db8cc89b5d7012db557411a3b49712aa
parent
c3821361
Changes
2
Hide whitespace changes
Inline
Side-by-side
examples.mk
View file @
2e862ce7
...
...
@@ -79,6 +79,8 @@ simple_decoder.SRCS += ivfdec.h ivfdec.c
simple_decoder.SRCS
+=
tools_common.h tools_common.c
simple_decoder.DESCRIPTION
=
Simplified decoder loop
GEN_EXAMPLES-$(CONFIG_VP8_DECODER)
+=
postproc.c
postproc.SRCS
+=
ivfdec.h ivfdec.c
postproc.SRCS
+=
tools_common.h tools_common.c
postproc.GUID
=
65E33355-F35E-4088-884D-3FD4905881D7
postproc.DESCRIPTION
=
Decoder postprocessor control
GEN_EXAMPLES-$(CONFIG_VP8_DECODER)
+=
decode_to_md5.c
...
...
examples/postproc.c
View file @
2e862ce7
...
...
@@ -39,130 +39,105 @@
// postprocessors. VP8 is one example. The following sample code toggles
// postprocessing on and off every 15 frames.
#include
<stdarg.h>
#include
<stdio.h>
#include
<stdlib.h>
#include
<string.h>
#include
"./ivfdec.h"
#define VPX_CODEC_DISABLE_COMPAT 1
#include
"./vpx_config.h"
#include
"vpx/vp8dx.h"
#include
"vpx/vpx_decoder.h"
#define interface (vpx_codec_vp8_dx())
#include
"./tools_common.h"
#include
"./vpx_config.h"
#define IVF_FILE_HDR_SZ (32)
#define IVF_FRAME_HDR_SZ (12)
static
const
char
*
exec_name
;
static
unsigned
int
mem_get_le32
(
const
unsigned
char
*
mem
)
{
return
(
mem
[
3
]
<<
24
)
|
(
mem
[
2
]
<<
16
)
|
(
mem
[
1
]
<<
8
)
|
(
mem
[
0
]);
void
usage_exit
()
{
fprintf
(
stderr
,
"Usage: %s <infile> <outfile>
\n
"
,
exec_name
);
exit
(
EXIT_FAILURE
);
}
static
void
die
(
const
char
*
fmt
,
...)
{
va_list
ap
;
int
main
(
int
argc
,
char
**
argv
)
{
FILE
*
infile
,
*
outfile
;
vpx_codec_ctx_t
codec
;
vpx_codec_iface_t
*
iface
;
int
frame_cnt
=
0
;
vpx_video_t
*
video
;
vpx_codec_err_t
res
;
exec_name
=
argv
[
0
];
va_start
(
ap
,
fmt
);
vprintf
(
fmt
,
ap
);
if
(
fmt
[
strlen
(
fmt
)
-
1
]
!=
'\n'
)
printf
(
"
\n
"
);
exit
(
EXIT_FAILURE
);
}
if
(
argc
!=
3
)
die
(
"Invalid number of arguments"
);
static
void
die_codec
(
vpx_codec_ctx_t
*
ctx
,
const
char
*
s
)
{
const
char
*
detail
=
vpx_codec_error_detail
(
ctx
);
if
(
!
(
infile
=
fopen
(
argv
[
1
],
"rb"
)))
die
(
"Failed to open %s for reading"
,
argv
[
1
]
);
printf
(
"%s: %s
\n
"
,
s
,
vpx_codec_error
(
ctx
));
if
(
detail
)
printf
(
" %s
\n
"
,
detail
);
exit
(
EXIT_FAILURE
);
}
if
(
!
(
outfile
=
fopen
(
argv
[
2
],
"wb"
)))
die
(
"Failed to open %s for writing"
,
argv
[
2
]);
video
=
vpx_video_open_file
(
infile
);
if
(
!
video
)
die
(
"%s is not a supported input file."
,
argv
[
1
]);
int
main
(
int
argc
,
char
**
argv
)
{
FILE
*
infile
,
*
outfile
;
vpx_codec_ctx_t
codec
;
int
flags
=
0
,
frame_cnt
=
0
;
unsigned
char
file_hdr
[
IVF_FILE_HDR_SZ
];
unsigned
char
frame_hdr
[
IVF_FRAME_HDR_SZ
];
unsigned
char
frame
[
256
*
1024
];
vpx_codec_err_t
res
;
(
void
)
res
;
/* Open files */
if
(
argc
!=
3
)
die
(
"Usage: %s <infile> <outfile>
\n
"
,
argv
[
0
]);
if
(
!
(
infile
=
fopen
(
argv
[
1
],
"rb"
)))
die
(
"Failed to open %s for reading"
,
argv
[
1
]);
if
(
!
(
outfile
=
fopen
(
argv
[
2
],
"wb"
)))
die
(
"Failed to open %s for writing"
,
argv
[
2
]);
/* Read file header */
if
(
!
(
fread
(
file_hdr
,
1
,
IVF_FILE_HDR_SZ
,
infile
)
==
IVF_FILE_HDR_SZ
&&
file_hdr
[
0
]
==
'D'
&&
file_hdr
[
1
]
==
'K'
&&
file_hdr
[
2
]
==
'I'
&&
file_hdr
[
3
]
==
'F'
))
die
(
"%s is not an IVF file."
,
argv
[
1
]);
printf
(
"Using %s
\n
"
,
vpx_codec_iface_name
(
interface
));
/* Initialize codec */
res
=
vpx_codec_dec_init
(
&
codec
,
interface
,
NULL
,
VPX_CODEC_USE_POSTPROC
);
if
(
res
==
VPX_CODEC_INCAPABLE
)
{
printf
(
"NOTICE: Postproc not supported by %s
\n
"
,
vpx_codec_iface_name
(
interface
));
res
=
vpx_codec_dec_init
(
&
codec
,
interface
,
NULL
,
flags
);
}
if
(
res
)
die_codec
(
&
codec
,
"Failed to initialize decoder"
);
/* Read each frame */
while
(
fread
(
frame_hdr
,
1
,
IVF_FRAME_HDR_SZ
,
infile
)
==
IVF_FRAME_HDR_SZ
)
{
int
frame_sz
=
mem_get_le32
(
frame_hdr
);
vpx_codec_iter_t
iter
=
NULL
;
vpx_image_t
*
img
;
frame_cnt
++
;
if
(
frame_sz
>
sizeof
(
frame
))
die
(
"Frame %d data too big for example code buffer"
,
frame_sz
);
if
(
fread
(
frame
,
1
,
frame_sz
,
infile
)
!=
frame_sz
)
die
(
"Frame %d failed to read complete frame"
,
frame_cnt
);
#if CONFIG_VP9_DECODER
if
(
frame_cnt
%
30
==
1
)
{
vp8_postproc_cfg_t
pp
=
{
0
,
0
,
0
};
if
(
vpx_codec_control
(
&
codec
,
VP8_SET_POSTPROC
,
&
pp
))
die_codec
(
&
codec
,
"Failed to turn off postproc"
);
}
else
if
(
frame_cnt
%
30
==
16
)
{
vp8_postproc_cfg_t
pp
=
{
VP8_DEBLOCK
|
VP8_DEMACROBLOCK
|
VP8_MFQE
,
4
,
0
};
if
(
vpx_codec_control
(
&
codec
,
VP8_SET_POSTPROC
,
&
pp
))
die_codec
(
&
codec
,
"Failed to turn on postproc"
);
};
#endif
/* Decode the frame with 15ms deadline */
if
(
vpx_codec_decode
(
&
codec
,
frame
,
frame_sz
,
NULL
,
15000
))
die_codec
(
&
codec
,
"Failed to decode frame"
);
/* Write decoded data to disk */
while
((
img
=
vpx_codec_get_frame
(
&
codec
,
&
iter
)))
{
unsigned
int
plane
,
y
;
for
(
plane
=
0
;
plane
<
3
;
plane
++
)
{
unsigned
char
*
buf
=
img
->
planes
[
plane
];
for
(
y
=
0
;
y
<
(
plane
?
(
img
->
d_h
+
1
)
>>
1
:
img
->
d_h
);
y
++
)
{
(
void
)
fwrite
(
buf
,
1
,
(
plane
?
(
img
->
d_w
+
1
)
>>
1
:
img
->
d_w
),
outfile
);
buf
+=
img
->
stride
[
plane
];
}
}
}
iface
=
get_codec_interface
(
vpx_video_get_fourcc
(
video
));
if
(
!
iface
)
die
(
"Unknown FOURCC code."
);
printf
(
"Using %s
\n
"
,
vpx_codec_iface_name
(
iface
));
res
=
vpx_codec_dec_init
(
&
codec
,
iface
,
NULL
,
VPX_CODEC_USE_POSTPROC
);
if
(
res
==
VPX_CODEC_INCAPABLE
)
{
printf
(
"NOTICE: Postproc not supported.
\n
"
);
res
=
vpx_codec_dec_init
(
&
codec
,
iface
,
NULL
,
0
);
}
if
(
res
)
die_codec
(
&
codec
,
"Failed to initialize decoder"
);
while
(
vpx_video_read_frame
(
video
))
{
vpx_codec_iter_t
iter
=
NULL
;
vpx_image_t
*
img
=
NULL
;
size_t
frame_size
=
0
;
const
unsigned
char
*
frame
=
vpx_video_get_frame
(
video
,
&
frame_size
);
++
frame_cnt
;
if
(
frame_cnt
%
30
==
1
)
{
vp8_postproc_cfg_t
pp
=
{
0
,
0
,
0
};
if
(
vpx_codec_control
(
&
codec
,
VP8_SET_POSTPROC
,
&
pp
))
die_codec
(
&
codec
,
"Failed to turn off postproc"
);
}
else
if
(
frame_cnt
%
30
==
16
)
{
vp8_postproc_cfg_t
pp
=
{
VP8_DEBLOCK
|
VP8_DEMACROBLOCK
|
VP8_MFQE
,
4
,
0
};
if
(
vpx_codec_control
(
&
codec
,
VP8_SET_POSTPROC
,
&
pp
))
die_codec
(
&
codec
,
"Failed to turn on postproc"
);
};
// Decode the frame with 15ms deadline
if
(
vpx_codec_decode
(
&
codec
,
frame
,
frame_size
,
NULL
,
15000
))
die_codec
(
&
codec
,
"Failed to decode frame"
);
while
((
img
=
vpx_codec_get_frame
(
&
codec
,
&
iter
))
!=
NULL
)
{
vpx_img_write
(
img
,
outfile
);
}
printf
(
"Processed %d frames.
\n
"
,
frame_cnt
);
if
(
vpx_codec_destroy
(
&
codec
))
die_codec
(
&
codec
,
"Failed to destroy codec"
);
}
printf
(
"Processed %d frames.
\n
"
,
frame_cnt
);
if
(
vpx_codec_destroy
(
&
codec
))
die_codec
(
&
codec
,
"Failed to destroy codec"
);
printf
(
"Play: ffplay -f rawvideo -pix_fmt yuv420p -s %dx%d %s
\n
"
,
vpx_video_get_width
(
video
),
vpx_video_get_height
(
video
),
argv
[
2
]);
vpx_video_close
(
video
);
fclose
(
outfile
);
fclose
(
infile
);
return
EXIT_SUCCESS
;
fclose
(
outfile
);
fclose
(
infile
);
return
EXIT_SUCCESS
;
}
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment