275{
276 std::map<int, int> m = c_m;
277 unsigned int ss = in_len /
m_n;
278
279
280 for (auto it = m.begin(); it != m.end(); ++it) {
281 int start = it->first;
282 int size = it->second;
283
284 auto neighbour = m.end();
285 while ((neighbour = m.find(
start + size)) != m.end()) {
286 it->second += neighbour->second;
287 size = it->second;
288 m.erase(neighbour);
289 }
290 }
291
292 if (
state ==
nullptr) {
294 *out = (char *) in + sizeof(uint32_t);
295 auto fst_sgmt = m.find(0);
296 return fst_sgmt != m.end() && (unsigned) fst_sgmt->second >= ss *
m_k;
297 }
298
299#ifdef HAVE_ZFEC
302 unsigned int index[
MAX_N];
303 unsigned int i = 0;
304#if 0
305
307
308
309 for (auto it = m.begin(); it != m.end(); ++it) {
310 int start = it->first;
312
313 int first_symbol_start = (
start + ss - 1) / ss * ss;
315
316 for (int j = first_symbol_start; j < last_symbol_end; j += ss) {
317
318 pkt[i] = (void *) (in + j);
319 index[i] = j / ss;
320 i++;
322 }
324 }
325
328 return;
329 }
330
332
333 int ret = fec_decode(
state, pkt, index, ss);
334 if (ret != 0) {
336 return;
337 }
338 uint32_t out_sz;
339 memcpy(&out_sz, pkt[0], sizeof(out_sz));
340 fprintf(stderr, "%d %d\n\n", out_sz, index[0]);
342 *out = (char *) in + 4;
343#else
344
345
346 std::bitset<MAX_K> empty_slots;
347 std::bitset<MAX_K> repaired_slots;
348
349 for (auto it = m.begin(); it != m.end(); ++it) {
350 int start = it->first;
351 int size = it->second;
352
353 unsigned int first_symbol_start = (
start + ss - 1) / ss * ss;
354 unsigned int last_symbol_end = (
start + size) / ss * ss;
355 for (unsigned int j = first_symbol_start; j < last_symbol_end; j += ss) {
357 pkt[j/ss] = in + j;
358 index[j/ss] = j/ss;
359 empty_slots.set(j/ss);
360
361 } else {
362 for (
unsigned int k = 0; k <
m_k; ++k) {
363 if (!empty_slots.test(k)) {
364 pkt[k] = in + j;
365 index[k] = j/ss;
366
367 empty_slots.set(k);
368 repaired_slots.set(k);
369 break;
370 }
371
372 }
373 }
374 i++;
375
377 }
379 }
380
381
382
385 *out = (char *) in + sizeof(uint32_t);
386 return false;
387 }
388
389 char **output = (
char **) malloc(
m_k *
sizeof(
char *));
390 for (
unsigned int i = 0; i <
m_k; ++i) {
391 output[i] = (char *) malloc(ss);
392 }
393
394 fec_decode((
const fec_t *)
state, (
const gf *
const *) pkt,
395 (gf *const *) output, index, ss);
396
397 i = 0;
398 for (
unsigned int j = 0; j <
m_k; ++j) {
399 if (repaired_slots.test(j)) {
400 memcpy((void *) (in + j * ss), output[i], ss);
401 i++;
402 }
403 }
404
405 for (
unsigned int i = 0; i <
m_k; ++i) {
406 free(output[i]);
407 }
408 free(output);
409
410 uint32_t out_sz;
411 memcpy(&out_sz, in, sizeof(out_sz));
412
414 *out = (char *) in + sizeof(uint32_t);
415#endif
416#endif
417
418 return true;
419}
static __device__ const float offset
uint32_t get_buf_len(const char *buf, std::map< int, int > const &c_m)