/**************************************************************************** * apps/system/nxcodec/nxcodec_main.c * * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. The * ASF licenses this file to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance with the * License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations * under the License. * ****************************************************************************/ /**************************************************************************** * Included Files ****************************************************************************/ #include #include #include #include #include #include "nxcodec.h" /**************************************************************************** * Pre-processor Definitions ****************************************************************************/ #define NXCODEC_VER "1.00" #define NXCODEC_WIDTH 640 #define NXCODEC_HEIGHT 480 /**************************************************************************** * Private Data ****************************************************************************/ static const char g_short_options[] = "d:s:hf:i:o:"; static const struct option g_long_options[] = { { "device", required_argument, NULL, 'd' }, { "size", required_argument, NULL, 's' }, { "help", no_argument, NULL, 'h' }, { "format", required_argument, NULL, 'f' }, { "infile", required_argument, NULL, 'i' }, { "outfile", required_argument, NULL, 'o' }, { NULL, 0, NULL, 0 } }; /**************************************************************************** * Private Functions ****************************************************************************/ static void usage(FAR const char *progname) { printf("NxCodec Version: "NXCODEC_VER"\n" "Usage: %s -d devname -s [wxh] -f [informt] " "-i infile -f [outformat] -o outfile\n" "Default settings for decoder parameters\n\n" "Options:\n" "-d | --device Video device name\n" "-s | --size Size of stream\n" "-h | --help Print this message\n" "-f | --format Format of stream\n" "-i | --infile Input filename for M2M devices\n" "-o | --outfile Outputs stream to filename\n", progname); exit(EXIT_SUCCESS); } /**************************************************************************** * Public Functions ****************************************************************************/ /**************************************************************************** * nxcodec_main ****************************************************************************/ int main(int argc, FAR char **argv) { nxcodec_t codec; int ret; char cc[5] = { 0 }; /* Default settings for decoder parameters */ codec.output.format.fmt.pix.width = codec.capture.format.fmt.pix.width = NXCODEC_WIDTH; codec.output.format.fmt.pix.height = codec.capture.format.fmt.pix.height = NXCODEC_HEIGHT; codec.output.format.fmt.pix.pixelformat = V4L2_PIX_FMT_H264; codec.capture.format.fmt.pix.pixelformat = V4L2_PIX_FMT_YUV420; while (1) { int idx; int c; c = getopt_long(argc, argv, g_short_options, g_long_options, &idx); if (-1 == c) { break; } switch (c) { case 0: /* getopt_long() flag */ break; case 'd': memset(codec.devname, 0, sizeof(codec.devname)); snprintf(codec.devname, sizeof(codec.devname), "%s", optarg); break; case 's' : sscanf(optarg, "%"SCNu32"x%"SCNu32"", &codec.capture.format.fmt.pix.width, &codec.capture.format.fmt.pix.height); codec.output.format.fmt.pix.width = codec.capture.format.fmt.pix.width; codec.output.format.fmt.pix.height = codec.capture.format.fmt.pix.height; break; case 'h': usage(argv[0]); case 'f': memset(cc, 0, 5); snprintf(cc, sizeof(cc), "%s", optarg); break; case 'i': memset(codec.output.filename, 0, sizeof(codec.output.filename)); snprintf(codec.output.filename, sizeof(codec.output.filename), "%s", optarg); if (cc[0]) { codec.output.format.fmt.pix.pixelformat = v4l2_fourcc(cc[0], cc[1], cc[2], cc[3]); } break; case 'o': memset(codec.capture.filename, 0, sizeof(codec.capture.filename)); snprintf(codec.capture.filename, sizeof(codec.capture.filename), "%s", optarg); if (cc[0]) { codec.capture.format.fmt.pix.pixelformat = v4l2_fourcc(cc[0], cc[1], cc[2], cc[3]); } break; default: usage(argv[0]); break; } } ret = nxcodec_init(&codec); if (ret < 0) { return ret; } ret = nxcodec_start(&codec); if (ret < 0) { goto end0; } while (1) { struct pollfd pfd = { .events = POLLIN | POLLOUT, .fd = codec.fd, }; poll(&pfd, 1, -1); if (pfd.revents & POLLIN) { if (nxcodec_context_dequeue_frame(&codec.capture) < 0) { break; } } if (pfd.revents & POLLOUT) { if (nxcodec_context_enqueue_frame(&codec.output) < 0) { break; } } } nxcodec_stop(&codec); end0: nxcodec_uninit(&codec); return ret; }