int do_proxy(srs_flv_t flv, srs_rtmp_t ortmp, int64_t re, int32_t *pstarttime, u_int32_t *ptimestamp) { int ret = 0; // packet data char type; int size; char *data = NULL; srs_human_trace("start ingest flv to RTMP stream"); for (; ;) { // tag header if ((ret = srs_flv_read_tag_header(flv, &type, &size, ptimestamp)) != 0) { if (srs_flv_is_eof(ret)) { srs_human_trace("parse completed."); return 0; } srs_human_trace("flv get packet failed. ret=%d", ret); return ret; } if (size <= 0) { srs_human_trace("invalid size=%d", size); break; } // TODO: FIXME: mem leak when error. data = (char *) malloc(size); if ((ret = srs_flv_read_tag_data(flv, data, size)) != 0) { return ret; } u_int32_t timestamp = *ptimestamp; if ((ret = srs_human_print_rtmp_packet(type, timestamp, data, size)) != 0) { srs_human_trace("print packet failed. ret=%d", ret); return ret; } if ((ret = srs_rtmp_write_packet(ortmp, type, *ptimestamp, data, size)) != 0) { srs_human_trace("irtmp get packet failed. ret=%d", ret); return ret; } if (*pstarttime < 0) { *pstarttime = *ptimestamp; } re_update(re, *pstarttime, *ptimestamp); } return ret; }
int proxy(int flv_fd, srs_rtmp_t ortmp) { int ret = 0; // packet data int type, size; u_int32_t timestamp = 0; char* data = NULL; // re int64_t re = re_create(); if ((ret = flv_open_ic(flv_fd)) != 0) { return ret; } if ((ret = connect_oc(ortmp)) != 0) { return ret; } trace("start ingest flv to RTMP stream"); for (;;) { if ((ret = flv_read_packet(flv_fd, &type, ×tamp, &data, &size)) != 0) { trace("irtmp get packet failed. ret=%d", ret); return ret; } verbose("irtmp got packet: type=%s, time=%d, size=%d", srs_type2string(type), timestamp, size); if ((ret = srs_write_packet(ortmp, type, timestamp, data, size)) != 0) { trace("irtmp get packet failed. ret=%d", ret); return ret; } verbose("ortmp sent packet: type=%s, time=%d, size=%d", srs_type2string(type), timestamp, size); re = re_update(re, timestamp); } return ret; }