static void load_headers(struct obs_x264 *obsx264) { x264_nal_t *nals; int nal_count; DARRAY(uint8_t) header; DARRAY(uint8_t) sei; da_init(header); da_init(sei); x264_encoder_headers(obsx264->context, &nals, &nal_count); for (int i = 0; i < nal_count; i++) { x264_nal_t *nal = nals+i; if (nal->i_type == NAL_SEI) da_push_back_array(sei, nal->p_payload, nal->i_payload); else da_push_back_array(header, nal->p_payload, nal->i_payload); } obsx264->extra_data = header.array; obsx264->extra_data_size = header.num; obsx264->sei = sei.array; obsx264->sei_size = sei.num; }
static void send_first_video_packet(struct obs_encoder *encoder, struct encoder_callback *cb, struct encoder_packet *packet) { struct encoder_packet first_packet; DARRAY(uint8_t) data; uint8_t *sei; size_t size; /* always wait for first keyframe */ if (!packet->keyframe) return; da_init(data); if (!get_sei(encoder, &sei, &size)) { cb->new_packet(cb->param, packet); cb->sent_first_packet = true; return; } da_push_back_array(data, sei, size); da_push_back_array(data, packet->data, packet->size); first_packet = *packet; first_packet.data = data.array; first_packet.size = data.num; cb->new_packet(cb->param, &first_packet); cb->sent_first_packet = true; da_free(data); }
static void load_headers(struct obs_qsv *obsqsv) { DARRAY(uint8_t) header; uint8_t sei = 0; // Not sure if SEI is needed. // Just filling in empty meaningless SEI message. // Seems to work fine. // DARRAY(uint8_t) sei; da_init(header); // da_init(sei); uint8_t *pSPS, *pPPS; uint16_t nSPS, nPPS; qsv_encoder_headers(obsqsv->context, &pSPS, &pPPS, &nSPS, &nPPS); da_push_back_array(header, pSPS, nSPS); da_push_back_array(header, pPPS, nPPS); obsqsv->extra_data = header.array; obsqsv->extra_data_size = header.num; obsqsv->sei = &sei; obsqsv->sei_size = 1; }