DECODER * b25_startup(decoder_options *opt) { DECODER *dec = (DECODER *)calloc(1, sizeof(DECODER)); int code; const char *err = NULL; dec->b25 = create_arib_std_b25(); if(!dec->b25) { err = "create_arib_std_b25 failed"; goto error; } code = dec->b25->set_multi2_round(dec->b25, opt->round); if(code < 0) { err = "set_multi2_round failed"; goto error; } code = dec->b25->set_strip(dec->b25, opt->strip); if(code < 0) { err = "set_strip failed"; goto error; } code = dec->b25->set_emm_proc(dec->b25, opt->emm); if(code < 0) { err = "set_emm_proc failed"; goto error; } dec->bcas = create_b_cas_card(); if(!dec->bcas) { err = "create_b_cas_card failed"; goto error; } code = dec->bcas->init(dec->bcas); if(code < 0) { err = "bcas->init failed"; goto error; } code = dec->b25->set_b_cas_card(dec->b25, dec->bcas); if(code < 0) { err = "set_b_cas_card failed"; goto error; } return dec; error: fprintf(stderr, "%s\n", err); free(dec); return NULL; }
int B25Decoder::init() { int rc; pthread_mutex_lock(&_mtx); if (_b25) { rc = -2; goto unlock; } _bcas = create_b_cas_card(); if (!_bcas) { rc = -3; goto unlock; } rc = _bcas->init(_bcas); if (rc < 0) { rc = -4; goto err; } _b25 = create_arib_std_b25(); if (!_b25) { rc = -5; goto err; } if (_b25->set_b_cas_card(_b25, _bcas) < 0) { rc = -6; goto err; } // success _b25->set_strip(_b25, strip); _b25->set_emm_proc(_b25, emm_proc); _b25->set_multi2_round(_b25, multi2_round); rc = 0; goto unlock; err: // error if (_b25) { _b25->release(_b25); _b25 = NULL; } if (_bcas) { _bcas->release(_bcas); _bcas = NULL; } clock_gettime(CLOCK_MONOTONIC_COARSE, &_errtime); unlock: pthread_mutex_unlock(&_mtx); return rc; }
static void test_arib_std_b25(const char *src, const char *dst, OPTION *opt) { int code,i,n,m; int sfd,dfd; int64_t total; int64_t offset; #if defined(WIN32) unsigned long tick,tock; #else struct timeval tick,tock; double millisec; #endif double mbps; ARIB_STD_B25 *b25; B_CAS_CARD *bcas; ARIB_STD_B25_PROGRAM_INFO pgrm; uint8_t data[64*1024]; ARIB_STD_B25_BUFFER sbuf; ARIB_STD_B25_BUFFER dbuf; sfd = -1; dfd = -1; b25 = NULL; bcas = NULL; sfd = _open(src, _O_BINARY|_O_RDONLY|_O_SEQUENTIAL); if(sfd < 0){ fprintf(stderr, "error - failed on _open(%s) [src]\n", src); goto LAST; } _lseeki64(sfd, 0, SEEK_END); total = _telli64(sfd); _lseeki64(sfd, opt->skip, SEEK_SET); b25 = create_arib_std_b25(); if(b25 == NULL){ fprintf(stderr, "error - failed on create_arib_std_b25()\n"); goto LAST; } code = b25->set_multi2_round(b25, opt->round); if(code < 0){ fprintf(stderr, "error - failed on ARIB_STD_B25::set_multi2_round() : code=%d\n", code); goto LAST; } code = b25->set_strip(b25, opt->strip); if(code < 0){ fprintf(stderr, "error - failed on ARIB_STD_B25::set_strip() : code=%d\n", code); goto LAST; } code = b25->set_emm_proc(b25, opt->emm); if(code < 0){ fprintf(stderr, "error - failed on ARIB_STD_B25::set_emm_proc() : code=%d\n", code); goto LAST; } bcas = create_b_cas_card(); if(bcas == NULL){ fprintf(stderr, "error - failed on create_b_cas_card()\n"); goto LAST; } code = bcas->init(bcas); if(code < 0){ fprintf(stderr, "error - failed on B_CAS_CARD::init() : code=%d\n", code); goto LAST; } code = b25->set_b_cas_card(b25, bcas); if(code < 0){ fprintf(stderr, "error - failed on ARIB_STD_B25::set_b_cas_card() : code=%d\n", code); goto LAST; } dfd = _open(dst, _O_BINARY|_O_WRONLY|_O_SEQUENTIAL|_O_CREAT|_O_TRUNC, _S_IREAD|_S_IWRITE); if(dfd < 0){ fprintf(stderr, "error - failed on _open(%s) [dst]\n", dst); goto LAST; } offset = 0; #if defined(WIN32) tock = GetTickCount(); #else gettimeofday(&tock, NULL); #endif while( (n = _read(sfd, data, sizeof(data))) > 0 ){ sbuf.data = data; sbuf.size = n; code = b25->put(b25, &sbuf); if(code < 0){ fprintf(stderr, "error - failed on ARIB_STD_B25::put() : code=%d\n", code); goto LAST; } code = b25->get(b25, &dbuf); if(code < 0){ fprintf(stderr, "error - failed on ARIB_STD_B25::get() : code=%d\n", code); goto LAST; } if(dbuf.size > 0){ n = _write(dfd, dbuf.data, dbuf.size); if(n != dbuf.size){ fprintf(stderr, "error failed on _write(%d)\n", dbuf.size); goto LAST; } } offset += sbuf.size; if(opt->verbose != 0){ m = (int)(10000*offset/total); mbps = 0.0; #if defined(WIN32) tick = GetTickCount(); if (tick-tock > 100) { mbps = offset; mbps /= 1024; mbps /= (tick-tock); } #else gettimeofday(&tick, NULL); millisec = (tick.tv_sec - tock.tv_sec) * 1000; millisec += (tick.tv_usec - tock.tv_usec) / 1000; if(millisec > 100.0) { mbps = offset; mbps /= 1024; mbps /= millisec; } #endif fprintf(stderr, "\rprocessing: %2d.%02d%% [%6.2f MB/sec]", m/100, m%100, mbps); } } code = b25->flush(b25); if(code < 0){ fprintf(stderr, "error - failed on ARIB_STD_B25::flush() : code=%d\n", code); goto LAST; } code = b25->get(b25, &dbuf); if(code < 0){ fprintf(stderr, "error - failed on ARIB_STD_B25::get() : code=%d\n", code); goto LAST; } if(dbuf.size > 0){ n = _write(dfd, dbuf.data, dbuf.size); if(n != dbuf.size){ fprintf(stderr, "error - failed on _write(%d)\n", dbuf.size); goto LAST; } } if(opt->verbose != 0){ mbps = 0.0; #if defined(WIN32) tick = GetTickCount(); if (tick-tock > 100) { mbps = offset; mbps /= 1024; mbps /= (tick-tock); } #else gettimeofday(&tick, NULL); millisec = (tick.tv_sec - tock.tv_sec) * 1000; millisec += (tick.tv_usec - tock.tv_usec) / 1000; if(millisec > 100.0) { mbps = offset; mbps /= 1024; mbps /= millisec; } #endif fprintf(stderr, "\rprocessing: finish [%6.2f MB/sec]\n", mbps); fflush(stderr); fflush(stdout); } n = b25->get_program_count(b25); if(n < 0){ fprintf(stderr, "error - failed on ARIB_STD_B25::get_program_count() : code=%d\n", code); goto LAST; } for(i=0;i<n;i++){ code = b25->get_program_info(b25, &pgrm, i); if(code < 0){ fprintf(stderr, "error - failed on ARIB_STD_B25::get_program_info(%d) : code=%d\n", i, code); goto LAST; } if(pgrm.ecm_unpurchased_count > 0){ fprintf(stderr, "warning - unpurchased ECM is detected\n"); fprintf(stderr, " channel: %d\n", pgrm.program_number); fprintf(stderr, " unpurchased ECM count: %d\n", pgrm.ecm_unpurchased_count); fprintf(stderr, " last ECM error code: %04x\n", pgrm.last_ecm_error_code); #if defined(WIN32) fprintf(stderr, " undecrypted TS packet: %d\n", pgrm.undecrypted_packet_count); fprintf(stderr, " total TS packet: %d\n", pgrm.total_packet_count); #else fprintf(stderr, " undecrypted TS packet: %"PRId64"\n", pgrm.undecrypted_packet_count); fprintf(stderr, " total TS packet: %"PRId64"\n", pgrm.total_packet_count); #endif } } if(opt->power_ctrl != 0){ show_bcas_power_on_control_info(bcas); } LAST: if(sfd >= 0){ _close(sfd); sfd = -1; } if(dfd >= 0){ _close(dfd); dfd = -1; } if(b25 != NULL){ b25->release(b25); b25 = NULL; } if(bcas != NULL){ bcas->release(bcas); bcas = NULL; } }
static int Open( vlc_object_t *p_object ) { stream_t *p_stream = (stream_t *) p_object; int64_t i_stream_size = stream_Size( p_stream->s ); if ( i_stream_size > 0 && i_stream_size < ARIB_STD_B25_TS_PROBING_MIN_DATA ) return VLC_EGENERIC; stream_sys_t *p_sys = p_stream->p_sys = calloc( 1, sizeof(*p_sys) ); if (p_sys == NULL) return VLC_ENOMEM; p_sys->p_b25 = create_arib_std_b25(); if ( p_sys->p_b25 ) { if ( p_sys->p_b25->set_multi2_round( p_sys->p_b25, 4 ) < 0 ) msg_Warn( p_stream, "cannot set B25 round number" ); if ( p_sys->p_b25->set_strip( p_sys->p_b25, 0 ) < 0 ) msg_Warn( p_stream, "cannot set B25 strip option" ); if ( p_sys->p_b25->set_emm_proc( p_sys->p_b25, 0 ) < 0 ) msg_Warn( p_stream, "cannot set B25 emm_proc" ); /* ARIB STD-B25 scrambled TS's packet size is always 188 bytes */ if ( p_sys->p_b25->set_unit_size( p_sys->p_b25, 188 ) < 0) msg_Warn( p_stream, "cannot set B25 TS packet size" ); p_sys->p_bcas = create_b_cas_card(); if ( p_sys->p_bcas ) { int i_code = p_sys->p_bcas->init( p_sys->p_bcas ); if ( i_code < 0 ) { /* Card could be just missing */ msg_Warn( p_stream, "cannot initialize BCAS card (missing ?): %s", GetErrorMessage( i_code, bcas_errors ) ); goto error; } B_CAS_ID bcasid; if ( p_sys->p_bcas->get_id( p_sys->p_bcas, &bcasid ) == 0 ) { for ( int32_t i=0; i<bcasid.count; i++) { msg_Dbg( p_stream, "BCAS card id 0x%"PRId64" initialized", bcasid.data[i] ); } } B_CAS_INIT_STATUS bcas_status; if ( p_sys->p_bcas->get_init_status( p_sys->p_bcas, &bcas_status ) == 0 ) { msg_Dbg( p_stream, "BCAS card system id 0x%"PRIx32, bcas_status.ca_system_id ); } i_code = p_sys->p_b25->set_b_cas_card( p_sys->p_b25, p_sys->p_bcas ); if ( i_code < 0 ) { msg_Err( p_stream, "cannot attach BCAS card to decoder: %s", GetErrorMessage( i_code, bcas_errors ) ); goto error; } } else msg_Err( p_stream, "cannot create BCAS card" ); } else { msg_Err( p_stream, "cannot create B25 instance" ); goto error; } p_stream->pf_read = Read; p_stream->pf_seek = Seek; p_stream->pf_control = Control; return VLC_SUCCESS; error: Close( VLC_OBJECT(p_stream) ); return VLC_EGENERIC; }