static void run_implementation(const uint8_t *input, uint8_t *output, struct hash_impl *impl, unsigned size) { uint64_t t0, t1; unsigned nruns = specified_runs ? specified_runs : (1 << 30) / size; unsigned outlen = 0, outcrc = 0; unsigned i, j, val; double mtime, ttime = 0, ttime2 = 0, stime; uint8_t outref[MAX_OUTPUT_SIZE]; if (enabled_libs && !av_stristr(enabled_libs, impl->lib) || enabled_algos && !av_stristr(enabled_algos, impl->name)) return; if (!sscanf(impl->output, "crc:%x", &outcrc)) { outlen = strlen(impl->output) / 2; for (i = 0; i < outlen; i++) { sscanf(impl->output + i * 2, "%02x", &val); outref[i] = val; } } for (i = 0; i < 8; i++) /* heat caches */ impl->run(output, input, size); for (i = 0; i < nruns; i++) { memset(output, 0, size); /* avoid leftovers from previous runs */ t0 = AV_READ_TIME(); impl->run(output, input, size); t1 = AV_READ_TIME(); if (outlen ? memcmp(output, outref, outlen) : crc32(output, size) != outcrc) { fprintf(stderr, "Expected: "); if (outlen) for (j = 0; j < outlen; j++) fprintf(stderr, "%02x", output[j]); else fprintf(stderr, "%08x", crc32(output, size)); fprintf(stderr, "\n"); fatal_error("output mismatch"); } mtime = (double)(t1 - t0) / size; ttime += mtime; ttime2 += mtime * mtime; } ttime /= nruns; ttime2 /= nruns; stime = sqrt(ttime2 - ttime * ttime); printf("%-10s %-12s size: %7d runs: %6d time: %8.3f +- %.3f\n", impl->lib, impl->name, size, nruns, ttime, stime); fflush(stdout); }
static inline int has_header(const char *str, const char *header) { /* header + 2 to skip over CRLF prefix. (make sure you have one!) */ if (!str) return 0; return av_stristart(str, header + 2, NULL) || av_stristr(str, header); }
static const char* get_mine_type(char *name) { int i, n; static const char* mm[][2] = { ".htm", "text/html", ".m3u8", "text/plain", ".ts", "video/MP2T", ".flv", "video/MP2T", ".xml", "text/xml", "", "application/octet-stream", }; n = sizeof(mm)/sizeof(mm[0]); for(i = 0; i < n; ++i){ if(av_stristr(name, mm[i][0]))break; } if(i >= n)i = n -1; return mm[i][1]; }
/* parse HTTP request and prepare header */ static int http_parse_request(HTTPContext *c) { char *q, msg[1024]; const char *mime_type, *p; HTTPContext *ctx; int ret = 0, is_first = 0; const char *first_tag = "First-Request=0"; RequestData rd = {{0}}; p = c->buffer; while(get_line(msg, sizeof(msg), &p) > 0){ ret = handle_line(c, msg, sizeof(msg), &rd); if(ret < 0)return ret; } is_first = !av_stristr(rd.cookie, first_tag); if(c->post && c->content_length && !av_match_ext(c->url, "m3u8") && !av_match_ext(c->url, "ts") && !av_match_ext(c->url, "flv")){ c->post = 0; c->content_length = read_request_content(c, rd.content, sizeof(rd.content)); } #if defined(PLUGIN_DVB) if(!c->post && !strcmp(c->url, "digitalDvb/allServiceType/getClientInfo")){ uint32_t *ptr = (uint32_t*)rd.content, *ptr_end = (uint32_t*)(rd.content+sizeof(rd.content)-8); for(ctx = first_http_ctx; ctx; ctx = ctx->next) if(!ctx->post && av_match_ext(ctx->url, "flv") ) {/*todo: record hls*/ if(ptr < ptr_end){ int chid = -1; sscanf(ctx->url, "%d", &chid); *ptr++ = inet_addr(inet_ntoa(ctx->from_addr.sin_addr)); *ptr++ = chid; printf("ip %s id %u %s\t", inet_ntoa(ctx->from_addr.sin_addr), chid, ctx->url); } } } #endif //http_log("New conn: %s:%u %d %s cookie:%s\n", inet_ntoa(c->from_addr.sin_addr), ntohs(c->from_addr.sin_port), c->post, c->url, rd.cookie); /*handle m3u8/ts request solely*/ if(av_match_ext(c->url, "m3u8") || av_match_ext(c->url, "ts")){ c->keep_alive = 0; ret = hls_parse_request(c, c->url, is_first); if(ret < 0)goto send_error; else if(ret == 1){ long chid = atoi(c->url); if(!(0 <= chid && chid <= 10000)){ sprintf(msg, "bad request: %s-->%ld", c->url, chid); http_log("%s\n", msg); goto send_error; } #if defined(PLUGIN_DVB) ff_ctl_send_string(1, c->url, rd.content); #endif http_log("wait get %s\n", c->url); } if(c->state == HTTPSTATE_SEND_HEADER) goto send_header; return 0; /*end here*/ } #if defined(PLUGIN_DVB) ret = plugin_dvb(c, &rd); if(ret < 0){ goto send_error; }else if(ret > 0){ return 0; } #endif /*handle feed request*/ if (c->post) { ctx = find_feed(c->url); if(ctx && ctx != c){ sprintf(msg, "file %s has been feeded", c->url); http_log("%s\n", msg); goto send_error; } c->http_error = 0; c->state = HTTPSTATE_RECEIVE_DATA; return 0; /*end here*/ }else{ if(prepare_local_file(c) > 0){ c->http_error = 200; c->state = HTTPSTATE_SEND_HEADER; return 0; /*no need feed, send local files directly.*/ } ctx = find_feed(c->url); if(!ctx){ c->keep_alive = 0; sprintf(msg, "wait to get %s", c->url); http_log("%s\n", msg); #if defined(PLUGIN_DVB) ff_ctl_send(2, c->url, strlen(c->url)+1, rd.content, sizeof(rd.content)); #endif }else{ ctx->sff_ref_cnt++; } c->feed_ctx = ctx; } send_header: /* prepare HTTP header */ c->buffer[0] = 0; av_strlcatf(c->buffer, c->buffer_size, "HTTP/1.1 200 OK\r\n"); mime_type = get_mine_type(c->url); av_strlcatf(c->buffer, c->buffer_size, "Pragma: no-cache\r\n"); av_strlcatf(c->buffer, c->buffer_size, "Content-Type: %s\r\n", mime_type); av_strlcatf(c->buffer, c->buffer_size, "Connection: %s\r\n", (c->keep_alive ? "keep-alive" : "close")); av_strlcatf(c->buffer, c->buffer_size, "Set-Cookie: %s; Path=/; Domain=%s\r\n", first_tag, rd.domain); av_strlcatf(c->buffer, c->buffer_size, "\r\n"); q = c->buffer + strlen(c->buffer); /* prepare output buffer */ c->http_error = 0; c->buffer_ptr = c->buffer; c->buffer_end = q; c->state = HTTPSTATE_SEND_HEADER; #if 0 if(S == c->hls_idx){ HLS *s = &s_hls[c->hls_idx]; char *ext = strrchr(c->url, '.'); if(!(2 == s->flag && s->data && s->csize > 0)){/*not exist yet, fake one*/ c->http_error = 200; c->buffer_end += sprintf(c->buffer_end, "#EXTM3U\n" "#EXT-X-VERSION:3\n" "#EXT-X-TARGETDURATION:2\n" "#EXT-X-MEDIA-SEQUENCE:0\n" "#EXTINF:1.283989,\n" "%.*s0.ts\n", ext - c->url, c->url); } } #endif return 0; send_error: c->keep_alive = 0; c->http_error = 404; q = c->buffer; htmlstrip(msg); snprintf(q, c->buffer_size, "HTTP/1.1 404 Not Found\r\n" "Content-type: text/html\r\n" "\r\n" "<html>\n" "<head><title>404 Not Found</title></head>\n" "<body>%s</body>\n" "</html>\n", msg); q += strlen(q); /* prepare output buffer */ c->buffer_ptr = c->buffer; c->buffer_end = q; c->state = HTTPSTATE_SEND_HEADER; return 0; }
static int sami_paragraph_to_ass(AVCodecContext *avctx, const char *src) { SAMIContext *sami = avctx->priv_data; int ret = 0; char *tag = NULL; char *dupsrc = av_strdup(src); char *p = dupsrc; av_bprint_clear(&sami->content); for (;;) { char *saveptr = NULL; int prev_chr_is_space = 0; AVBPrint *dst = &sami->content; /* parse & extract paragraph tag */ p = av_stristr(p, "<P"); if (!p) break; if (p[2] != '>' && !av_isspace(p[2])) { // avoid confusion with tags such as <PRE> p++; continue; } if (dst->len) // add a separator with the previous paragraph if there was one av_bprintf(dst, "\\N"); tag = av_strtok(p, ">", &saveptr); if (!tag || !saveptr) break; p = saveptr; /* check if the current paragraph is the "source" (speaker name) */ if (av_stristr(tag, "ID=Source") || av_stristr(tag, "ID=\"Source\"")) { dst = &sami->source; av_bprint_clear(dst); } /* if empty event -> skip subtitle */ while (av_isspace(*p)) p++; if (!strncmp(p, " ", 6)) { ret = -1; goto end; } /* extract the text, stripping most of the tags */ while (*p) { if (*p == '<') { if (!av_strncasecmp(p, "<P", 2) && (p[2] == '>' || av_isspace(p[2]))) break; if (!av_strncasecmp(p, "<BR", 3)) av_bprintf(dst, "\\N"); p++; while (*p && *p != '>') p++; if (!*p) break; if (*p == '>') p++; } if (!av_isspace(*p)) av_bprint_chars(dst, *p, 1); else if (!prev_chr_is_space) av_bprint_chars(dst, ' ', 1); prev_chr_is_space = av_isspace(*p); p++; } } av_bprint_clear(&sami->full); if (sami->source.len) av_bprintf(&sami->full, "{\\i1}%s{\\i0}\\N", sami->source.str); av_bprintf(&sami->full, "%s", sami->content.str); end: av_free(dupsrc); return ret; }