/***************************************************************************** * XviD Native decoder entry point * * This function is just a wrapper to all the option cases. * * Returned values : XVID_ERR_FAIL when opt is invalid * else returns the wrapped function result * ****************************************************************************/ int xvid_decore(void *handle, int opt, void *param1, void *param2) { switch (opt) { case XVID_DEC_CREATE: return decoder_create((xvid_dec_create_t *) param1); case XVID_DEC_DESTROY: delete (S_decoder*)handle; return 0; case XVID_DEC_DECODE: return ((S_decoder*)handle)->Decode((xvid_dec_frame_t *) param1, (xvid_dec_stats_t*) param2); default: return XVID_ERR_FAIL; } }
int xvid_decore(void *handle, int opt, void *param1, void *param2) { switch (opt) { case XVID_DEC_CREATE: return decoder_create((xvid_dec_create_t *) param1); case XVID_DEC_DESTROY: return decoder_destroy((DECODER *) handle); case XVID_DEC_DECODE: return decoder_decode((DECODER *) handle, (xvid_dec_frame_t *) param1, (xvid_dec_stats_t*) param2); default: return XVID_ERR_FAIL; } }
int main(int argc, char *argv[]) { srand(time(NULL)); struct timespec start, end; double cpu_time = 0.0; if (argc < 3) { fprintf(stdout, "Usage: %s [file_name] [decode file]\n", argv[0]); } FILE *fp; fp = fopen(argv[1], "r"); FILE *fb; fb = fopen(argv[2], "w"); uint32_t symbol_size = 16*70;//16 bytes = 128 bits for SIMD struct encoder *encoder = encoder_create(symbol_size); /*int32_t i; for (i = 0; i < encoder->block_size; i++) { encoder->block[i] = (uint8_t) rand(); }*/ uint8_t *payload = calloc(encoder->symbol_size + 1, sizeof(uint8_t)); clock_gettime(CLOCK_REALTIME, &start); while (!feof(fp)) { int number = fread(encoder->block, sizeof(char), symbol_size, fp); struct decoder *decoder = decoder_create(symbol_size); /* systematic */ int o; for (o = 0; o < encoder->symbols; o++) { encoder->flag = 1; encoder_write_payload(encoder, payload); /* with 75% probability to trigger systematic */ if ((rand() % 4) != 0) { decoder_read_payload(decoder, payload); printf("decoder rank = %u\n", decoder->rank); decoder_print(decoder); } } /* rlnc */ while (decoder->rank < 8) { encoder->flag = 0; encoder_write_payload(encoder, payload); decoder_read_payload(decoder, payload); //printf("decoder rank = %u\n", decoder->rank); //decoder_print(decoder); } printf("\ndecoding block...\n\n"); decoder_decode_block(decoder); decoder_print(decoder); printf("\ndecode finished\n\n"); if (memcmp(decoder->block, encoder->block, decoder->symbols * decoder->symbol_size) == 0) printf("decode success\n"); else printf("decode fail\n"); fwrite(decoder->block, sizeof(char), number, fb); memset(payload, 0, encoder->symbol_size + 1); decoder_flush(decoder); decoder_destroy(&decoder); } clock_gettime(CLOCK_REALTIME, &end); cpu_time = diff_in_second(start, end); printf("execution time of transmission : %lf sec\n", cpu_time); fclose(fb); free(payload); encoder_destroy(&encoder); return 0; }