X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fmodules%2Flinsys%2Fconsumer_SDIstream.c;h=8e7cec5e8f243265cc4e3a69a778ff91e12991ce;hb=11ceb3a29fd27c05bfac2b05463eff1790309a81;hp=47af4aec5d076fa5addec3e073be06f81b66ea8d;hpb=0e280f3bf6bc7c80a2a85015ec08caee35c3e93d;p=mlt diff --git a/src/modules/linsys/consumer_SDIstream.c b/src/modules/linsys/consumer_SDIstream.c index 47af4aec..8e7cec5e 100644 --- a/src/modules/linsys/consumer_SDIstream.c +++ b/src/modules/linsys/consumer_SDIstream.c @@ -122,8 +122,8 @@ * System No. System nomenclature Form of scanning Frame rate Embedded Audio MLT profile Linsys board support (model) * SD PAL 720 × 576/50/I interlaced 25 HZ 8 x AES (16 channels) dv_pal 180,145,159,107 * SD PAL 720 × 576/50/I interlaced 25 HZ 4 x AES (8 channels) dv_pal 193 - * SD NTSC 720 × 480/59.94/I interlaced 30000/1001 ~ 29.97 HZ 8 x AES (16 channels) sdi_486i_5994 TODO:180,145,159,107 - * SD NTSC 720 × 480/59.94/I interlaced 30000/1001 ~ 29.97 HZ 4 x AES (8 channels) sdi_486i_5994 193 + * SD NTSC 720 × 486/59.94/I interlaced 30000/1001 ~ 29.97 HZ 8 x AES (16 channels) sdi_486i_5994 TODO:180,145,159,107 + * SD NTSC 720 × 486/59.94/I interlaced 30000/1001 ~ 29.97 HZ 4 x AES (8 channels) sdi_486i_5994 193 * **/ @@ -131,11 +131,14 @@ #include #include #include +#include #include #include #include #include #include +#include +#include #ifdef WITH_JPEG // for JPEG output @@ -179,7 +182,7 @@ struct consumer_SDIstream_s { // our audio channel pair for this frame int16_t audio_buffer[MAX_AUDIO_STREAMS][MAX_AUDIO_SAMPLES]; // The SDI audio channel pairs for this frame - char *video_fmt_name; // 1080i25, 1080p25, 576i50, 480i2997, ... + char *video_fmt_name; // 1080i25, 1080p25, 576i50, 486i2997, ... }; @@ -208,7 +211,7 @@ int convertYCBCRtoRGB(int y1, int cb, int cr, int y2, uint8_t * target_rgb); mlt_consumer consumer_SDIstream_init(mlt_profile profile, mlt_service_type type, const char *id, char *arg) { // Create the consumer object - consumer_SDIstream this = calloc(sizeof(struct consumer_SDIstream_s), 1); + consumer_SDIstream this = calloc( 1, sizeof(struct consumer_SDIstream_s) ); // If malloc and consumer init ok if (this != NULL && mlt_consumer_init(&this->parent, this, profile) == 0) { @@ -238,6 +241,8 @@ mlt_consumer consumer_SDIstream_init(mlt_profile profile, mlt_service_type type, this->audio_buffer[i][j] = j; } } + + mlt_events_register( MLT_CONSUMER_PROPERTIES(parent), "consumer-fatal-error", NULL ); // Return the consumer produced return parent; @@ -339,21 +344,6 @@ static void *consumer_thread(void *arg) { int counter = 0; // each second we save a Jpeg - // set blanking flag; is not nessary we write no own blanking(HANC) for HD board ASSY 193 - if (mlt_properties_get(MLT_CONSUMER_PROPERTIES( consumer ), "blanking") != NULL) { - // set value - if (strcmp(strdup(mlt_properties_get(MLT_CONSUMER_PROPERTIES( consumer ), "blanking")), "false")) { - this->blanking = 1; - } else if (strcmp(strdup(mlt_properties_get(MLT_CONSUMER_PROPERTIES( consumer ), "blanking")), "true")) { - this->blanking = 0; - } else { - this->blanking = 1; - } - } else { - // set default value without HD board, also with blanking - this->blanking = 1; - } - // set properties (path) for device files if (mlt_properties_get(MLT_CONSUMER_PROPERTIES( consumer ), "dev_video") != NULL) { this->device_file_video = strdup(mlt_properties_get(MLT_CONSUMER_PROPERTIES( consumer ), "dev_video")); @@ -367,6 +357,51 @@ static void *consumer_thread(void *arg) { } } + // Set additional device file defaults + struct stat st; + int fd = -1; + if (this->device_file_video) + fd = stat(this->device_file_video, &st); + if (fd == -1) { + if (this->device_file_video) + free(this->device_file_video); + this->device_file_video = strdup("/dev/sdivideotx0"); + } else { + close(fd); + } + if (this->device_file_audio) { + fd = stat(this->device_file_audio, &st); + if (fd == -1) { + if (this->device_file_audio) + free(this->device_file_audio); + this->device_file_audio = strdup("/dev/sdiaudiotx0"); + } else { + close(fd); + } + } else if (this->device_file_video && + strstr(this->device_file_video, "sdivideotx")) { + if (this->device_file_audio) + free(this->device_file_audio); + this->device_file_audio = strdup("/dev/sdiaudiotx0"); + } + + // set blanking flag; is not nessary we write no own blanking(HANC) for HD board ASSY 193 + if (mlt_properties_get(MLT_CONSUMER_PROPERTIES( consumer ), "blanking")) { + // set value + if (!strcmp( mlt_properties_get(MLT_CONSUMER_PROPERTIES( consumer ), "blanking"), "false")) { + this->blanking = 0; + } else if (!strcmp( mlt_properties_get(MLT_CONSUMER_PROPERTIES( consumer ), "blanking"), "true")) { + this->blanking = 1; + } else { + this->blanking = mlt_properties_get_int(MLT_CONSUMER_PROPERTIES( consumer ), "blanking"); + } + } else if (this->device_file_video && strstr(this->device_file_video, "sdivideotx")) { + this->blanking = 0; + } else { + // set default value without HD board, also with blanking + this->blanking = 1; + } + // Define a frame pointer mlt_frame frame; @@ -378,8 +413,8 @@ static void *consumer_thread(void *arg) { // Tell the framework how we want our audio and video int frequency = this->audio_format.sample_rate; - int channels = 0; - int samples = mlt_sample_calculator(fps, frequency, count++); + int channels = mlt_properties_get_int( MLT_CONSUMER_PROPERTIES(consumer), "channels" ); + int samples; // set number of audio channels, linsys vidport model 193 is limited to 8 channels (4AES frames) this->audio_format.channels = 8; /* 0,2,4,6,8 */ @@ -387,8 +422,10 @@ static void *consumer_thread(void *arg) { this->audio_format.sample_rate = 48000; this->pix_fmt = mlt_image_yuv422; - if (!sdi_init(this->device_file_video, this->device_file_audio, this->blanking, mlt_service_profile((mlt_service) consumer), &this->audio_format)) { - exit(0); + if (this->device_file_video && this->device_file_audio && + !sdi_init(this->device_file_video, this->device_file_audio, this->blanking, mlt_service_profile((mlt_service) consumer), &this->audio_format)) { + mlt_log_fatal( MLT_CONSUMER_SERVICE(consumer), "failed to initialize\n" ); + mlt_events_fire( MLT_CONSUMER_PROPERTIES(consumer), "consumer-fatal-error", NULL ); } uint8_t *video_buffer; @@ -416,6 +453,7 @@ static void *consumer_thread(void *arg) { mlt_frame_get_image(frame, &video_buffer, &this->pix_fmt, &this->width, &this->height, 1); // Get the audio from this frame and save it to our audio_buffer + samples = mlt_sample_calculator(fps, frequency, count++); mlt_frame_get_audio(frame, (void**) &audio_buffer_tmp, &this->audio_format.aformat, &frequency, &channels, &samples); this->audio_format.sample_rate = frequency; @@ -470,6 +508,7 @@ static void *consumer_thread(void *arg) { } else if (save_jpegs > 0) { counter++; } + mlt_events_fire(MLT_CONSUMER_PROPERTIES( consumer ), "consumer-frame-show", frame, NULL ); } else { mlt_log_warning(MLT_CONSUMER_SERVICE(consumer), "Videobuffer was NULL, skipping playout!\n"); }