Commit 7f9db419 authored by Timothy B. Terriberry's avatar Timothy B. Terriberry Committed by John Koleszar

Add support for YUV4MPEG2 output.

These files can be played back directly in most major open-source media
 frameworks without the need for additional patches or parameters.

Change-Id: I59f98c1658298245c688f7d107cf393445e470d5
parent 44d89495
...@@ -62,8 +62,10 @@ static const arg_def_t postprocarg = ARG_DEF(NULL, "postproc", 0, ...@@ -62,8 +62,10 @@ static const arg_def_t postprocarg = ARG_DEF(NULL, "postproc", 0,
"Postprocess decoded frames"); "Postprocess decoded frames");
static const arg_def_t summaryarg = ARG_DEF(NULL, "summary", 0, static const arg_def_t summaryarg = ARG_DEF(NULL, "summary", 0,
"Show timing summary"); "Show timing summary");
static const arg_def_t outputfile = ARG_DEF("o", "output-raw-file", 1, static const arg_def_t outputfile = ARG_DEF("o", "output", 1,
"Output raw yv12 file instead of images"); "Output raw yv12 file instead of images");
static const arg_def_t usey4marg = ARG_DEF("y", "y4m", 0,
"Output file is YUV4MPEG2");
static const arg_def_t threadsarg = ARG_DEF("t", "threads", 1, static const arg_def_t threadsarg = ARG_DEF("t", "threads", 1,
"Max threads to use"); "Max threads to use");
static const arg_def_t quietarg = ARG_DEF("q", "quiet", 0, static const arg_def_t quietarg = ARG_DEF("q", "quiet", 0,
...@@ -77,7 +79,7 @@ static const arg_def_t *all_args[] = ...@@ -77,7 +79,7 @@ static const arg_def_t *all_args[] =
{ {
&codecarg, &prefixarg, &use_yv12, &use_i420, &flipuvarg, &noblitarg, &codecarg, &prefixarg, &use_yv12, &use_i420, &flipuvarg, &noblitarg,
&progressarg, &limitarg, &postprocarg, &summaryarg, &outputfile, &progressarg, &limitarg, &postprocarg, &summaryarg, &outputfile,
&threadsarg, &quietarg, &usey4marg, &threadsarg, &quietarg,
#if CONFIG_MD5 #if CONFIG_MD5
&md5arg, &md5arg,
#endif #endif
...@@ -288,7 +290,12 @@ void out_close(void *out, const char *out_fn, int do_md5) ...@@ -288,7 +290,12 @@ void out_close(void *out, const char *out_fn, int do_md5)
} }
} }
unsigned int file_is_ivf(FILE *infile, unsigned int *fourcc) unsigned int file_is_ivf(FILE *infile,
unsigned int *fourcc,
unsigned int *width,
unsigned int *height,
unsigned int *timebase_num,
unsigned int *timebase_den)
{ {
char raw_hdr[32]; char raw_hdr[32];
int is_ivf = 0; int is_ivf = 0;
...@@ -305,6 +312,10 @@ unsigned int file_is_ivf(FILE *infile, unsigned int *fourcc) ...@@ -305,6 +312,10 @@ unsigned int file_is_ivf(FILE *infile, unsigned int *fourcc)
" decode properly."); " decode properly.");
*fourcc = mem_get_le32(raw_hdr + 8); *fourcc = mem_get_le32(raw_hdr + 8);
*width = mem_get_le16(raw_hdr + 12);
*height = mem_get_le16(raw_hdr + 14);
*timebase_den = mem_get_le32(raw_hdr + 16);
*timebase_num = mem_get_le32(raw_hdr + 20);
} }
} }
...@@ -330,6 +341,11 @@ int main(int argc, const char **argv_) ...@@ -330,6 +341,11 @@ int main(int argc, const char **argv_)
struct arg arg; struct arg arg;
char **argv, **argi, **argj; char **argv, **argi, **argj;
const char *fn2 = 0; const char *fn2 = 0;
int use_y4m = 0;
unsigned int width;
unsigned int height;
unsigned int timebase_num;
unsigned int timebase_den;
void *out = NULL; void *out = NULL;
vpx_codec_dec_cfg_t cfg = {0}; vpx_codec_dec_cfg_t cfg = {0};
#if CONFIG_VP8_DECODER #if CONFIG_VP8_DECODER
...@@ -361,6 +377,8 @@ int main(int argc, const char **argv_) ...@@ -361,6 +377,8 @@ int main(int argc, const char **argv_)
} }
else if (arg_match(&arg, &outputfile, argi)) else if (arg_match(&arg, &outputfile, argi))
fn2 = arg.val; fn2 = arg.val;
else if (arg_match(&arg, &usey4marg, argi))
use_y4m = 1;
else if (arg_match(&arg, &prefixarg, argi)) else if (arg_match(&arg, &prefixarg, argi))
prefix = strdup(arg.val); prefix = strdup(arg.val);
else if (arg_match(&arg, &use_yv12, argi)) else if (arg_match(&arg, &use_yv12, argi))
...@@ -446,10 +464,31 @@ int main(int argc, const char **argv_) ...@@ -446,10 +464,31 @@ int main(int argc, const char **argv_)
if (fn2) if (fn2)
out = out_open(fn2, do_md5); out = out_open(fn2, do_md5);
is_ivf = file_is_ivf(infile, &fourcc); is_ivf = file_is_ivf(infile, &fourcc, &width, &height,
&timebase_num, &timebase_den);
if (is_ivf) if (is_ivf)
{ {
if (use_y4m)
{
char buffer[128];
if (!fn2)
{
fprintf(stderr, "YUV4MPEG2 output only supported with -o.\n");
return EXIT_FAILURE;
}
/*Correct for the factor of 2 applied to the timebase in the
encoder.*/
if(timebase_den&1)timebase_num<<=1;
else timebase_den>>=1;
/*Note: We can't output an aspect ratio here because IVF doesn't
store one, and neither does VP8.
That will have to wait until these tools support WebM natively.*/
sprintf(buffer, "YUV4MPEG2 C%s W%u H%u F%u:%u I%c\n",
"420jpeg", width, height, timebase_den, timebase_num, 'p');
out_put(out, (unsigned char *)buffer, strlen(buffer), do_md5);
}
/* Try to determine the codec from the fourcc. */ /* Try to determine the codec from the fourcc. */
for (i = 0; i < sizeof(ifaces) / sizeof(ifaces[0]); i++) for (i = 0; i < sizeof(ifaces) / sizeof(ifaces[0]); i++)
if ((fourcc & ifaces[i].fourcc_mask) == ifaces[i].fourcc) if ((fourcc & ifaces[i].fourcc_mask) == ifaces[i].fourcc)
...@@ -465,6 +504,11 @@ int main(int argc, const char **argv_) ...@@ -465,6 +504,11 @@ int main(int argc, const char **argv_)
break; break;
} }
} }
else if(use_y4m)
{
fprintf(stderr, "YUV4MPEG2 output only supported from IVF input.\n");
return EXIT_FAILURE;
}
if (vpx_codec_dec_init(&decoder, iface ? iface : ifaces[0].iface, &cfg, if (vpx_codec_dec_init(&decoder, iface ? iface : ifaces[0].iface, &cfg,
postproc ? VPX_CODEC_USE_POSTPROC : 0)) postproc ? VPX_CODEC_USE_POSTPROC : 0))
...@@ -533,6 +577,8 @@ int main(int argc, const char **argv_) ...@@ -533,6 +577,8 @@ int main(int argc, const char **argv_)
prefix, img->d_w, img->d_h, frame_in, sfx); prefix, img->d_w, img->d_h, frame_in, sfx);
out = out_open(out_fn, do_md5); out = out_open(out_fn, do_md5);
} }
else if(use_y4m)
out_put(out, (unsigned char *)"FRAME\n", 6, do_md5);
buf = img->planes[VPX_PLANE_Y]; buf = img->planes[VPX_PLANE_Y];
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment