annotate ffmpeg/libavdevice/iec61883.c @ 13:844d341cf643 tip

Back up before ISMIR
author Yading Song <yading.song@eecs.qmul.ac.uk>
date Thu, 31 Oct 2013 13:17:06 +0000
parents 6840f77b83aa
children
rev   line source
yading@10 1 /*
yading@10 2 * Copyright (c) 2012 Georg Lippitsch <georg.lippitsch@gmx.at>
yading@10 3 *
yading@10 4 * This file is part of FFmpeg.
yading@10 5 *
yading@10 6 * FFmpeg is free software; you can redistribute it and/or
yading@10 7 * modify it under the terms of the GNU Lesser General Public
yading@10 8 * License as published by the Free Software Foundation; either
yading@10 9 * version 2.1 of the License, or (at your option) any later version.
yading@10 10 *
yading@10 11 * FFmpeg is distributed in the hope that it will be useful,
yading@10 12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
yading@10 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
yading@10 14 * Lesser General Public License for more details.
yading@10 15 *
yading@10 16 * You should have received a copy of the GNU Lesser General Public
yading@10 17 * License along with FFmpeg; if not, write to the Free Software
yading@10 18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
yading@10 19 */
yading@10 20
yading@10 21 /**
yading@10 22 * @file
yading@10 23 * libiec61883 interface
yading@10 24 */
yading@10 25
yading@10 26 #include <sys/poll.h>
yading@10 27 #include <libraw1394/raw1394.h>
yading@10 28 #include <libavc1394/avc1394.h>
yading@10 29 #include <libavc1394/rom1394.h>
yading@10 30 #include <libiec61883/iec61883.h>
yading@10 31 #include "libavformat/dv.h"
yading@10 32 #include "libavformat/mpegts.h"
yading@10 33 #include "libavutil/opt.h"
yading@10 34 #include "avdevice.h"
yading@10 35
yading@10 36 #define THREADS HAVE_PTHREADS
yading@10 37
yading@10 38 #if THREADS
yading@10 39 #include <pthread.h>
yading@10 40 #endif
yading@10 41
yading@10 42 #define MOTDCT_SPEC_ID 0x00005068
yading@10 43 #define IEC61883_AUTO 0
yading@10 44 #define IEC61883_DV 1
yading@10 45 #define IEC61883_HDV 2
yading@10 46
yading@10 47 /**
yading@10 48 * For DV, one packet corresponds exactly to one frame.
yading@10 49 * For HDV, these are MPEG2 transport stream packets.
yading@10 50 * The queue is implemented as linked list.
yading@10 51 */
yading@10 52 typedef struct DVPacket {
yading@10 53 uint8_t *buf; ///< actual buffer data
yading@10 54 int len; ///< size of buffer allocated
yading@10 55 struct DVPacket *next; ///< next DVPacket
yading@10 56 } DVPacket;
yading@10 57
yading@10 58 struct iec61883_data {
yading@10 59 AVClass *class;
yading@10 60 raw1394handle_t raw1394; ///< handle for libraw1394
yading@10 61 iec61883_dv_fb_t iec61883_dv; ///< handle for libiec61883 when used with DV
yading@10 62 iec61883_mpeg2_t iec61883_mpeg2; ///< handle for libiec61883 when used with HDV
yading@10 63
yading@10 64 DVDemuxContext *dv_demux; ///< generic DV muxing/demuxing context
yading@10 65 MpegTSContext *mpeg_demux; ///< generic HDV muxing/demuxing context
yading@10 66
yading@10 67 DVPacket *queue_first; ///< first element of packet queue
yading@10 68 DVPacket *queue_last; ///< last element of packet queue
yading@10 69
yading@10 70 char *device_guid; ///< to select one of multiple DV devices
yading@10 71
yading@10 72 int packets; ///< Number of packets queued
yading@10 73 int max_packets; ///< Max. number of packets in queue
yading@10 74
yading@10 75 int bandwidth; ///< returned by libiec61883
yading@10 76 int channel; ///< returned by libiec61883
yading@10 77 int input_port; ///< returned by libiec61883
yading@10 78 int type; ///< Stream type, to distinguish DV/HDV
yading@10 79 int node; ///< returned by libiec61883
yading@10 80 int output_port; ///< returned by libiec61883
yading@10 81 int thread_loop; ///< Condition for thread while-loop
yading@10 82 int receiving; ///< True as soon data from device available
yading@10 83 int receive_error; ///< Set in receive task in case of error
yading@10 84 int eof; ///< True as soon as no more data available
yading@10 85
yading@10 86 struct pollfd raw1394_poll; ///< to poll for new data from libraw1394
yading@10 87
yading@10 88 /** Parse function for DV/HDV differs, so this is set before packets arrive */
yading@10 89 int (*parse_queue)(struct iec61883_data *dv, AVPacket *pkt);
yading@10 90
yading@10 91 #if THREADS
yading@10 92 pthread_t receive_task_thread;
yading@10 93 pthread_mutex_t mutex;
yading@10 94 pthread_cond_t cond;
yading@10 95 #endif
yading@10 96 };
yading@10 97
yading@10 98 static int iec61883_callback(unsigned char *data, int length,
yading@10 99 int complete, void *callback_data)
yading@10 100 {
yading@10 101 struct iec61883_data *dv = callback_data;
yading@10 102 DVPacket *packet;
yading@10 103 int ret;
yading@10 104
yading@10 105 #ifdef THREADS
yading@10 106 pthread_mutex_lock(&dv->mutex);
yading@10 107 #endif
yading@10 108
yading@10 109 if (dv->packets >= dv->max_packets) {
yading@10 110 av_log(NULL, AV_LOG_ERROR, "DV packet queue overrun, dropping.\n");
yading@10 111 ret = 0;
yading@10 112 goto exit;
yading@10 113 }
yading@10 114
yading@10 115 packet = av_mallocz(sizeof(*packet));
yading@10 116 if (!packet) {
yading@10 117 ret = -1;
yading@10 118 goto exit;
yading@10 119 }
yading@10 120
yading@10 121 packet->buf = av_malloc(length);
yading@10 122 if (!packet->buf) {
yading@10 123 ret = -1;
yading@10 124 goto exit;
yading@10 125 }
yading@10 126 packet->len = length;
yading@10 127
yading@10 128 memcpy(packet->buf, data, length);
yading@10 129
yading@10 130 if (dv->queue_first) {
yading@10 131 dv->queue_last->next = packet;
yading@10 132 dv->queue_last = packet;
yading@10 133 } else {
yading@10 134 dv->queue_first = packet;
yading@10 135 dv->queue_last = packet;
yading@10 136 }
yading@10 137 dv->packets++;
yading@10 138
yading@10 139 ret = 0;
yading@10 140
yading@10 141 exit:
yading@10 142 #ifdef THREADS
yading@10 143 pthread_cond_broadcast(&dv->cond);
yading@10 144 pthread_mutex_unlock(&dv->mutex);
yading@10 145 #endif
yading@10 146 return ret;
yading@10 147 }
yading@10 148
yading@10 149 static void *iec61883_receive_task(void *opaque)
yading@10 150 {
yading@10 151 struct iec61883_data *dv = (struct iec61883_data *)opaque;
yading@10 152 int result;
yading@10 153
yading@10 154 #ifdef THREADS
yading@10 155 while (dv->thread_loop)
yading@10 156 #endif
yading@10 157 {
yading@10 158 while ((result = poll(&dv->raw1394_poll, 1, 200)) < 0) {
yading@10 159 if (!(errno == EAGAIN || errno == EINTR)) {
yading@10 160 av_log(NULL, AV_LOG_ERROR, "Raw1394 poll error occurred.\n");
yading@10 161 dv->receive_error = AVERROR(EIO);
yading@10 162 return NULL;
yading@10 163 }
yading@10 164 }
yading@10 165 if (result > 0 && ((dv->raw1394_poll.revents & POLLIN)
yading@10 166 || (dv->raw1394_poll.revents & POLLPRI))) {
yading@10 167 dv->receiving = 1;
yading@10 168 raw1394_loop_iterate(dv->raw1394);
yading@10 169 } else if (dv->receiving) {
yading@10 170 av_log(NULL, AV_LOG_ERROR, "No more input data available\n");
yading@10 171 #ifdef THREADS
yading@10 172 pthread_mutex_lock(&dv->mutex);
yading@10 173 dv->eof = 1;
yading@10 174 pthread_cond_broadcast(&dv->cond);
yading@10 175 pthread_mutex_unlock(&dv->mutex);
yading@10 176 #else
yading@10 177 dv->eof = 1;
yading@10 178 #endif
yading@10 179 return NULL;
yading@10 180 }
yading@10 181 }
yading@10 182
yading@10 183 return NULL;
yading@10 184 }
yading@10 185
yading@10 186 static int iec61883_parse_queue_dv(struct iec61883_data *dv, AVPacket *pkt)
yading@10 187 {
yading@10 188 DVPacket *packet;
yading@10 189 int size;
yading@10 190
yading@10 191 size = avpriv_dv_get_packet(dv->dv_demux, pkt);
yading@10 192 if (size > 0)
yading@10 193 return size;
yading@10 194
yading@10 195 packet = dv->queue_first;
yading@10 196 if (!packet)
yading@10 197 return -1;
yading@10 198
yading@10 199 size = avpriv_dv_produce_packet(dv->dv_demux, pkt,
yading@10 200 packet->buf, packet->len, -1);
yading@10 201 pkt->destruct = av_destruct_packet;
yading@10 202 dv->queue_first = packet->next;
yading@10 203 av_free(packet);
yading@10 204 dv->packets--;
yading@10 205
yading@10 206 if (size > 0)
yading@10 207 return size;
yading@10 208
yading@10 209 return -1;
yading@10 210 }
yading@10 211
yading@10 212 static int iec61883_parse_queue_hdv(struct iec61883_data *dv, AVPacket *pkt)
yading@10 213 {
yading@10 214 DVPacket *packet;
yading@10 215 int size;
yading@10 216
yading@10 217 while (dv->queue_first) {
yading@10 218 packet = dv->queue_first;
yading@10 219 size = ff_mpegts_parse_packet(dv->mpeg_demux, pkt, packet->buf,
yading@10 220 packet->len);
yading@10 221 dv->queue_first = packet->next;
yading@10 222 av_free(packet->buf);
yading@10 223 av_free(packet);
yading@10 224 dv->packets--;
yading@10 225
yading@10 226 if (size > 0)
yading@10 227 return size;
yading@10 228 }
yading@10 229
yading@10 230 return -1;
yading@10 231 }
yading@10 232
yading@10 233 static int iec61883_read_header(AVFormatContext *context)
yading@10 234 {
yading@10 235 struct iec61883_data *dv = context->priv_data;
yading@10 236 struct raw1394_portinfo pinf[16];
yading@10 237 rom1394_directory rom_dir;
yading@10 238 char *endptr;
yading@10 239 int inport;
yading@10 240 int nb_ports;
yading@10 241 int port = -1;
yading@10 242 int response;
yading@10 243 int i, j = 0;
yading@10 244 uint64_t guid = 0;
yading@10 245
yading@10 246 dv->input_port = -1;
yading@10 247 dv->output_port = -1;
yading@10 248 dv->channel = -1;
yading@10 249
yading@10 250 dv->raw1394 = raw1394_new_handle();
yading@10 251
yading@10 252 if (!dv->raw1394) {
yading@10 253 av_log(context, AV_LOG_ERROR, "Failed to open IEEE1394 interface.\n");
yading@10 254 return AVERROR(EIO);
yading@10 255 }
yading@10 256
yading@10 257 if ((nb_ports = raw1394_get_port_info(dv->raw1394, pinf, 16)) < 0) {
yading@10 258 av_log(context, AV_LOG_ERROR, "Failed to get number of IEEE1394 ports.\n");
yading@10 259 goto fail;
yading@10 260 }
yading@10 261
yading@10 262 inport = strtol(context->filename, &endptr, 10);
yading@10 263 if (endptr != context->filename && *endptr == '\0') {
yading@10 264 av_log(context, AV_LOG_INFO, "Selecting IEEE1394 port: %d\n", inport);
yading@10 265 j = inport;
yading@10 266 nb_ports = inport + 1;
yading@10 267 } else if (strcmp(context->filename, "auto")) {
yading@10 268 av_log(context, AV_LOG_ERROR, "Invalid input \"%s\", you should specify "
yading@10 269 "\"auto\" for auto-detection, or the port number.\n", context->filename);
yading@10 270 goto fail;
yading@10 271 }
yading@10 272
yading@10 273 if (dv->device_guid) {
yading@10 274 if (sscanf(dv->device_guid, "%llx", (long long unsigned int *)&guid) != 1) {
yading@10 275 av_log(context, AV_LOG_INFO, "Invalid dvguid parameter: %s\n",
yading@10 276 dv->device_guid);
yading@10 277 goto fail;
yading@10 278 }
yading@10 279 }
yading@10 280
yading@10 281 for (; j < nb_ports && port==-1; ++j) {
yading@10 282 raw1394_destroy_handle(dv->raw1394);
yading@10 283
yading@10 284 if (!(dv->raw1394 = raw1394_new_handle_on_port(j))) {
yading@10 285 av_log(context, AV_LOG_ERROR, "Failed setting IEEE1394 port.\n");
yading@10 286 goto fail;
yading@10 287 }
yading@10 288
yading@10 289 for (i=0; i<raw1394_get_nodecount(dv->raw1394); ++i) {
yading@10 290
yading@10 291 /* Select device explicitly by GUID */
yading@10 292
yading@10 293 if (guid > 1) {
yading@10 294 if (guid == rom1394_get_guid(dv->raw1394, i)) {
yading@10 295 dv->node = i;
yading@10 296 port = j;
yading@10 297 break;
yading@10 298 }
yading@10 299 } else {
yading@10 300
yading@10 301 /* Select first AV/C tape recorder player node */
yading@10 302
yading@10 303 if (rom1394_get_directory(dv->raw1394, i, &rom_dir) < 0)
yading@10 304 continue;
yading@10 305 if (((rom1394_get_node_type(&rom_dir) == ROM1394_NODE_TYPE_AVC) &&
yading@10 306 avc1394_check_subunit_type(dv->raw1394, i, AVC1394_SUBUNIT_TYPE_VCR)) ||
yading@10 307 (rom_dir.unit_spec_id == MOTDCT_SPEC_ID)) {
yading@10 308 rom1394_free_directory(&rom_dir);
yading@10 309 dv->node = i;
yading@10 310 port = j;
yading@10 311 break;
yading@10 312 }
yading@10 313 rom1394_free_directory(&rom_dir);
yading@10 314 }
yading@10 315 }
yading@10 316 }
yading@10 317
yading@10 318 if (port == -1) {
yading@10 319 av_log(context, AV_LOG_ERROR, "No AV/C devices found.\n");
yading@10 320 goto fail;
yading@10 321 }
yading@10 322
yading@10 323 /* Provide bus sanity for multiple connections */
yading@10 324
yading@10 325 iec61883_cmp_normalize_output(dv->raw1394, 0xffc0 | dv->node);
yading@10 326
yading@10 327 /* Find out if device is DV or HDV */
yading@10 328
yading@10 329 if (dv->type == IEC61883_AUTO) {
yading@10 330 response = avc1394_transaction(dv->raw1394, dv->node,
yading@10 331 AVC1394_CTYPE_STATUS |
yading@10 332 AVC1394_SUBUNIT_TYPE_TAPE_RECORDER |
yading@10 333 AVC1394_SUBUNIT_ID_0 |
yading@10 334 AVC1394_VCR_COMMAND_OUTPUT_SIGNAL_MODE |
yading@10 335 0xFF, 2);
yading@10 336 response = AVC1394_GET_OPERAND0(response);
yading@10 337 dv->type = (response == 0x10 || response == 0x90 || response == 0x1A || response == 0x9A) ?
yading@10 338 IEC61883_HDV : IEC61883_DV;
yading@10 339 }
yading@10 340
yading@10 341 /* Connect to device, and do initialization */
yading@10 342
yading@10 343 dv->channel = iec61883_cmp_connect(dv->raw1394, dv->node, &dv->output_port,
yading@10 344 raw1394_get_local_id(dv->raw1394),
yading@10 345 &dv->input_port, &dv->bandwidth);
yading@10 346
yading@10 347 if (dv->channel < 0)
yading@10 348 dv->channel = 63;
yading@10 349
yading@10 350 if (!dv->max_packets)
yading@10 351 dv->max_packets = 100;
yading@10 352
yading@10 353 if (dv->type == IEC61883_HDV) {
yading@10 354
yading@10 355 /* Init HDV receive */
yading@10 356
yading@10 357 avformat_new_stream(context, NULL);
yading@10 358
yading@10 359 dv->mpeg_demux = ff_mpegts_parse_open(context);
yading@10 360 if (!dv->mpeg_demux)
yading@10 361 goto fail;
yading@10 362
yading@10 363 dv->parse_queue = iec61883_parse_queue_hdv;
yading@10 364
yading@10 365 dv->iec61883_mpeg2 = iec61883_mpeg2_recv_init(dv->raw1394,
yading@10 366 (iec61883_mpeg2_recv_t)iec61883_callback,
yading@10 367 dv);
yading@10 368
yading@10 369 dv->max_packets *= 766;
yading@10 370 } else {
yading@10 371
yading@10 372 /* Init DV receive */
yading@10 373
yading@10 374 dv->dv_demux = avpriv_dv_init_demux(context);
yading@10 375 if (!dv->dv_demux)
yading@10 376 goto fail;
yading@10 377
yading@10 378 dv->parse_queue = iec61883_parse_queue_dv;
yading@10 379
yading@10 380 dv->iec61883_dv = iec61883_dv_fb_init(dv->raw1394, iec61883_callback, dv);
yading@10 381 }
yading@10 382
yading@10 383 dv->raw1394_poll.fd = raw1394_get_fd(dv->raw1394);
yading@10 384 dv->raw1394_poll.events = POLLIN | POLLERR | POLLHUP | POLLPRI;
yading@10 385
yading@10 386 /* Actually start receiving */
yading@10 387
yading@10 388 if (dv->type == IEC61883_HDV)
yading@10 389 iec61883_mpeg2_recv_start(dv->iec61883_mpeg2, dv->channel);
yading@10 390 else
yading@10 391 iec61883_dv_fb_start(dv->iec61883_dv, dv->channel);
yading@10 392
yading@10 393 #if THREADS
yading@10 394 dv->thread_loop = 1;
yading@10 395 pthread_mutex_init(&dv->mutex, NULL);
yading@10 396 pthread_cond_init(&dv->cond, NULL);
yading@10 397 pthread_create(&dv->receive_task_thread, NULL, iec61883_receive_task, dv);
yading@10 398 #endif
yading@10 399
yading@10 400 return 0;
yading@10 401
yading@10 402 fail:
yading@10 403 raw1394_destroy_handle(dv->raw1394);
yading@10 404 return AVERROR(EIO);
yading@10 405 }
yading@10 406
yading@10 407 static int iec61883_read_packet(AVFormatContext *context, AVPacket *pkt)
yading@10 408 {
yading@10 409 struct iec61883_data *dv = context->priv_data;
yading@10 410 int size;
yading@10 411
yading@10 412 /**
yading@10 413 * Try to parse frames from queue
yading@10 414 */
yading@10 415
yading@10 416 #ifdef THREADS
yading@10 417 pthread_mutex_lock(&dv->mutex);
yading@10 418 while ((size = dv->parse_queue(dv, pkt)) == -1)
yading@10 419 if (!dv->eof)
yading@10 420 pthread_cond_wait(&dv->cond, &dv->mutex);
yading@10 421 else
yading@10 422 break;
yading@10 423 pthread_mutex_unlock(&dv->mutex);
yading@10 424 #else
yading@10 425 int result;
yading@10 426 while ((size = dv->parse_queue(dv, pkt)) == -1) {
yading@10 427 iec61883_receive_task((void *)dv);
yading@10 428 if (dv->receive_error)
yading@10 429 return dv->receive_error;
yading@10 430 }
yading@10 431 #endif
yading@10 432
yading@10 433 return size;
yading@10 434 }
yading@10 435
yading@10 436 static int iec61883_close(AVFormatContext *context)
yading@10 437 {
yading@10 438 struct iec61883_data *dv = context->priv_data;
yading@10 439
yading@10 440 #if THREADS
yading@10 441 dv->thread_loop = 0;
yading@10 442 pthread_join(dv->receive_task_thread, NULL);
yading@10 443 pthread_cond_destroy(&dv->cond);
yading@10 444 pthread_mutex_destroy(&dv->mutex);
yading@10 445 #endif
yading@10 446
yading@10 447 if (dv->type == IEC61883_HDV) {
yading@10 448 iec61883_mpeg2_recv_stop(dv->iec61883_mpeg2);
yading@10 449 iec61883_mpeg2_close(dv->iec61883_mpeg2);
yading@10 450 ff_mpegts_parse_close(dv->mpeg_demux);
yading@10 451 } else {
yading@10 452 iec61883_dv_fb_stop(dv->iec61883_dv);
yading@10 453 iec61883_dv_fb_close(dv->iec61883_dv);
yading@10 454 }
yading@10 455 while (dv->queue_first) {
yading@10 456 DVPacket *packet = dv->queue_first;
yading@10 457 dv->queue_first = packet->next;
yading@10 458 av_free(packet->buf);
yading@10 459 av_free(packet);
yading@10 460 }
yading@10 461
yading@10 462 iec61883_cmp_disconnect(dv->raw1394, dv->node, dv->output_port,
yading@10 463 raw1394_get_local_id(dv->raw1394),
yading@10 464 dv->input_port, dv->channel, dv->bandwidth);
yading@10 465
yading@10 466 raw1394_destroy_handle(dv->raw1394);
yading@10 467
yading@10 468 return 0;
yading@10 469 }
yading@10 470
yading@10 471 static const AVOption options[] = {
yading@10 472 { "dvtype", "override autodetection of DV/HDV", offsetof(struct iec61883_data, type), AV_OPT_TYPE_INT, {.i64 = IEC61883_AUTO}, IEC61883_AUTO, IEC61883_HDV, AV_OPT_FLAG_DECODING_PARAM, "dvtype" },
yading@10 473 { "auto", "auto detect DV/HDV", 0, AV_OPT_TYPE_CONST, {.i64 = IEC61883_AUTO}, 0, 0, AV_OPT_FLAG_DECODING_PARAM, "dvtype" },
yading@10 474 { "dv", "force device being treated as DV device", 0, AV_OPT_TYPE_CONST, {.i64 = IEC61883_DV}, 0, 0, AV_OPT_FLAG_DECODING_PARAM, "dvtype" },
yading@10 475 { "hdv" , "force device being treated as HDV device", 0, AV_OPT_TYPE_CONST, {.i64 = IEC61883_HDV}, 0, 0, AV_OPT_FLAG_DECODING_PARAM, "dvtype" },
yading@10 476 { "dvbuffer", "set queue buffer size (in packets)", offsetof(struct iec61883_data, max_packets), AV_OPT_TYPE_INT, {.i64 = 0}, 0, INT_MAX, AV_OPT_FLAG_DECODING_PARAM },
yading@10 477 { "dvguid", "select one of multiple DV devices by its GUID", offsetof(struct iec61883_data, device_guid), AV_OPT_TYPE_STRING, {.str = NULL}, 0, 0, AV_OPT_FLAG_DECODING_PARAM },
yading@10 478 { NULL },
yading@10 479 };
yading@10 480
yading@10 481 static const AVClass iec61883_class = {
yading@10 482 .class_name = "iec61883 indev",
yading@10 483 .item_name = av_default_item_name,
yading@10 484 .option = options,
yading@10 485 .version = LIBAVUTIL_VERSION_INT,
yading@10 486 };
yading@10 487
yading@10 488 AVInputFormat ff_iec61883_demuxer = {
yading@10 489 .name = "iec61883",
yading@10 490 .long_name = NULL_IF_CONFIG_SMALL("libiec61883 (new DV1394) A/V input device"),
yading@10 491 .priv_data_size = sizeof(struct iec61883_data),
yading@10 492 .read_header = iec61883_read_header,
yading@10 493 .read_packet = iec61883_read_packet,
yading@10 494 .read_close = iec61883_close,
yading@10 495 .flags = AVFMT_NOFILE,
yading@10 496 .priv_class = &iec61883_class,
yading@10 497 };