1cabdff1aSopenharmony_ci/* 2cabdff1aSopenharmony_ci * Copyright (c) 2013 Stefano Sabatini 3cabdff1aSopenharmony_ci * 4cabdff1aSopenharmony_ci * This file is part of FFmpeg. 5cabdff1aSopenharmony_ci * 6cabdff1aSopenharmony_ci * FFmpeg is free software; you can redistribute it and/or 7cabdff1aSopenharmony_ci * modify it under the terms of the GNU Lesser General Public 8cabdff1aSopenharmony_ci * License as published by the Free Software Foundation; either 9cabdff1aSopenharmony_ci * version 2.1 of the License, or (at your option) any later version. 10cabdff1aSopenharmony_ci * 11cabdff1aSopenharmony_ci * FFmpeg is distributed in the hope that it will be useful, 12cabdff1aSopenharmony_ci * but WITHOUT ANY WARRANTY; without even the implied warranty of 13cabdff1aSopenharmony_ci * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 14cabdff1aSopenharmony_ci * Lesser General Public License for more details. 15cabdff1aSopenharmony_ci * 16cabdff1aSopenharmony_ci * You should have received a copy of the GNU Lesser General Public 17cabdff1aSopenharmony_ci * License along with FFmpeg; if not, write to the Free Software 18cabdff1aSopenharmony_ci * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 19cabdff1aSopenharmony_ci */ 20cabdff1aSopenharmony_ci 21cabdff1aSopenharmony_ci#include "config.h" 22cabdff1aSopenharmony_ci 23cabdff1aSopenharmony_ci#include <zmq.h> 24cabdff1aSopenharmony_ci 25cabdff1aSopenharmony_ci#include "libavutil/mem.h" 26cabdff1aSopenharmony_ci#include "libavutil/bprint.h" 27cabdff1aSopenharmony_ci 28cabdff1aSopenharmony_ci#if HAVE_UNISTD_H 29cabdff1aSopenharmony_ci#include <unistd.h> /* getopt */ 30cabdff1aSopenharmony_ci#endif 31cabdff1aSopenharmony_ci 32cabdff1aSopenharmony_ci#if !HAVE_GETOPT 33cabdff1aSopenharmony_ci#include "compat/getopt.c" 34cabdff1aSopenharmony_ci#endif 35cabdff1aSopenharmony_ci 36cabdff1aSopenharmony_ci/** 37cabdff1aSopenharmony_ci * @file 38cabdff1aSopenharmony_ci * zmq message sender example, meant to be used with the zmq filters 39cabdff1aSopenharmony_ci */ 40cabdff1aSopenharmony_ci 41cabdff1aSopenharmony_cistatic void usage(void) 42cabdff1aSopenharmony_ci{ 43cabdff1aSopenharmony_ci printf("send message to ZMQ recipient, to use with the zmq filters\n"); 44cabdff1aSopenharmony_ci printf("usage: zmqsend [OPTIONS]\n"); 45cabdff1aSopenharmony_ci printf("\n" 46cabdff1aSopenharmony_ci "Options:\n" 47cabdff1aSopenharmony_ci "-b ADDRESS set bind address\n" 48cabdff1aSopenharmony_ci "-h print this help\n" 49cabdff1aSopenharmony_ci "-i INFILE set INFILE as input file, stdin if omitted\n"); 50cabdff1aSopenharmony_ci} 51cabdff1aSopenharmony_ci 52cabdff1aSopenharmony_ciint main(int argc, char **argv) 53cabdff1aSopenharmony_ci{ 54cabdff1aSopenharmony_ci AVBPrint src; 55cabdff1aSopenharmony_ci char *src_buf, *recv_buf; 56cabdff1aSopenharmony_ci int c; 57cabdff1aSopenharmony_ci int recv_buf_size, ret = 0; 58cabdff1aSopenharmony_ci void *zmq_ctx, *socket; 59cabdff1aSopenharmony_ci const char *bind_address = "tcp://localhost:5555"; 60cabdff1aSopenharmony_ci const char *infilename = NULL; 61cabdff1aSopenharmony_ci FILE *infile = NULL; 62cabdff1aSopenharmony_ci zmq_msg_t msg; 63cabdff1aSopenharmony_ci 64cabdff1aSopenharmony_ci while ((c = getopt(argc, argv, "b:hi:")) != -1) { 65cabdff1aSopenharmony_ci switch (c) { 66cabdff1aSopenharmony_ci case 'b': 67cabdff1aSopenharmony_ci bind_address = optarg; 68cabdff1aSopenharmony_ci break; 69cabdff1aSopenharmony_ci case 'h': 70cabdff1aSopenharmony_ci usage(); 71cabdff1aSopenharmony_ci return 0; 72cabdff1aSopenharmony_ci case 'i': 73cabdff1aSopenharmony_ci infilename = optarg; 74cabdff1aSopenharmony_ci break; 75cabdff1aSopenharmony_ci case '?': 76cabdff1aSopenharmony_ci return 1; 77cabdff1aSopenharmony_ci } 78cabdff1aSopenharmony_ci } 79cabdff1aSopenharmony_ci 80cabdff1aSopenharmony_ci if (!infilename || !strcmp(infilename, "-")) { 81cabdff1aSopenharmony_ci infilename = "stdin"; 82cabdff1aSopenharmony_ci infile = stdin; 83cabdff1aSopenharmony_ci } else { 84cabdff1aSopenharmony_ci infile = fopen(infilename, "r"); 85cabdff1aSopenharmony_ci } 86cabdff1aSopenharmony_ci if (!infile) { 87cabdff1aSopenharmony_ci av_log(NULL, AV_LOG_ERROR, 88cabdff1aSopenharmony_ci "Impossible to open input file '%s': %s\n", infilename, strerror(errno)); 89cabdff1aSopenharmony_ci return 1; 90cabdff1aSopenharmony_ci } 91cabdff1aSopenharmony_ci 92cabdff1aSopenharmony_ci zmq_ctx = zmq_ctx_new(); 93cabdff1aSopenharmony_ci if (!zmq_ctx) { 94cabdff1aSopenharmony_ci av_log(NULL, AV_LOG_ERROR, 95cabdff1aSopenharmony_ci "Could not create ZMQ context: %s\n", zmq_strerror(errno)); 96cabdff1aSopenharmony_ci return 1; 97cabdff1aSopenharmony_ci } 98cabdff1aSopenharmony_ci 99cabdff1aSopenharmony_ci socket = zmq_socket(zmq_ctx, ZMQ_REQ); 100cabdff1aSopenharmony_ci if (!socket) { 101cabdff1aSopenharmony_ci av_log(NULL, AV_LOG_ERROR, 102cabdff1aSopenharmony_ci "Could not create ZMQ socket: %s\n", zmq_strerror(errno)); 103cabdff1aSopenharmony_ci ret = 1; 104cabdff1aSopenharmony_ci goto end; 105cabdff1aSopenharmony_ci } 106cabdff1aSopenharmony_ci 107cabdff1aSopenharmony_ci if (zmq_connect(socket, bind_address) == -1) { 108cabdff1aSopenharmony_ci av_log(NULL, AV_LOG_ERROR, "Could not bind ZMQ responder to address '%s': %s\n", 109cabdff1aSopenharmony_ci bind_address, zmq_strerror(errno)); 110cabdff1aSopenharmony_ci ret = 1; 111cabdff1aSopenharmony_ci goto end; 112cabdff1aSopenharmony_ci } 113cabdff1aSopenharmony_ci 114cabdff1aSopenharmony_ci /* grab the input and store it in src */ 115cabdff1aSopenharmony_ci av_bprint_init(&src, 1, AV_BPRINT_SIZE_UNLIMITED); 116cabdff1aSopenharmony_ci while ((c = fgetc(infile)) != EOF) 117cabdff1aSopenharmony_ci av_bprint_chars(&src, c, 1); 118cabdff1aSopenharmony_ci av_bprint_chars(&src, 0, 1); 119cabdff1aSopenharmony_ci 120cabdff1aSopenharmony_ci if (!av_bprint_is_complete(&src)) { 121cabdff1aSopenharmony_ci av_log(NULL, AV_LOG_ERROR, "Could not allocate a buffer for the source string\n"); 122cabdff1aSopenharmony_ci av_bprint_finalize(&src, NULL); 123cabdff1aSopenharmony_ci ret = 1; 124cabdff1aSopenharmony_ci goto end; 125cabdff1aSopenharmony_ci } 126cabdff1aSopenharmony_ci av_bprint_finalize(&src, &src_buf); 127cabdff1aSopenharmony_ci 128cabdff1aSopenharmony_ci if (zmq_send(socket, src_buf, strlen(src_buf), 0) == -1) { 129cabdff1aSopenharmony_ci av_log(NULL, AV_LOG_ERROR, "Could not send message: %s\n", zmq_strerror(errno)); 130cabdff1aSopenharmony_ci ret = 1; 131cabdff1aSopenharmony_ci goto end; 132cabdff1aSopenharmony_ci } 133cabdff1aSopenharmony_ci 134cabdff1aSopenharmony_ci if (zmq_msg_init(&msg) == -1) { 135cabdff1aSopenharmony_ci av_log(NULL, AV_LOG_ERROR, 136cabdff1aSopenharmony_ci "Could not initialize receiving message: %s\n", zmq_strerror(errno)); 137cabdff1aSopenharmony_ci ret = 1; 138cabdff1aSopenharmony_ci goto end; 139cabdff1aSopenharmony_ci } 140cabdff1aSopenharmony_ci 141cabdff1aSopenharmony_ci if (zmq_msg_recv(&msg, socket, 0) == -1) { 142cabdff1aSopenharmony_ci av_log(NULL, AV_LOG_ERROR, 143cabdff1aSopenharmony_ci "Could not receive message: %s\n", zmq_strerror(errno)); 144cabdff1aSopenharmony_ci zmq_msg_close(&msg); 145cabdff1aSopenharmony_ci ret = 1; 146cabdff1aSopenharmony_ci goto end; 147cabdff1aSopenharmony_ci } 148cabdff1aSopenharmony_ci 149cabdff1aSopenharmony_ci recv_buf_size = zmq_msg_size(&msg) + 1; 150cabdff1aSopenharmony_ci recv_buf = av_malloc(recv_buf_size); 151cabdff1aSopenharmony_ci if (!recv_buf) { 152cabdff1aSopenharmony_ci av_log(NULL, AV_LOG_ERROR, 153cabdff1aSopenharmony_ci "Could not allocate receiving message buffer\n"); 154cabdff1aSopenharmony_ci zmq_msg_close(&msg); 155cabdff1aSopenharmony_ci ret = 1; 156cabdff1aSopenharmony_ci goto end; 157cabdff1aSopenharmony_ci } 158cabdff1aSopenharmony_ci memcpy(recv_buf, zmq_msg_data(&msg), recv_buf_size - 1); 159cabdff1aSopenharmony_ci recv_buf[recv_buf_size-1] = 0; 160cabdff1aSopenharmony_ci printf("%s\n", recv_buf); 161cabdff1aSopenharmony_ci zmq_msg_close(&msg); 162cabdff1aSopenharmony_ci av_free(recv_buf); 163cabdff1aSopenharmony_ci 164cabdff1aSopenharmony_ciend: 165cabdff1aSopenharmony_ci zmq_close(socket); 166cabdff1aSopenharmony_ci zmq_ctx_destroy(zmq_ctx); 167cabdff1aSopenharmony_ci return ret; 168cabdff1aSopenharmony_ci} 169