void sei_append_708(sei_t* sei, cea708_t* cea708) { sei_message_t* msg = sei_message_new(sei_type_user_data_registered_itu_t_t35, 0, CEA608_MAX_SIZE); msg->size = cea708_render(cea708, sei_message_data(msg), sei_message_size(msg)); sei_message_append(sei, msg); cea708_init(cea708, sei->timestamp); // will confgure using HLS compatiable defaults }
libcaption_stauts_t sei_parse(sei_t* sei, const uint8_t* data, size_t size, double timestamp) { sei_init(sei, timestamp); int ret = 0; // SEI may contain more than one payload while (1 < size) { size_t payloadType = 0; size_t payloadSize = 0; while (0 < size && 255 == (*data)) { payloadType += 255; ++data, --size; } if (0 == size) { return LIBCAPTION_ERROR; } payloadType += (*data); ++data, --size; while (0 < size && 255 == (*data)) { payloadSize += 255; ++data, --size; } if (0 == size) { return LIBCAPTION_ERROR; } payloadSize += (*data); ++data, --size; if (payloadSize) { sei_message_t* msg = sei_message_new((sei_msgtype_t)payloadType, 0, payloadSize); uint8_t* payloadData = sei_message_data(msg); size_t bytes = _copy_to_rbsp(payloadData, payloadSize, data, size); sei_message_append(sei, msg); if (bytes < payloadSize) { return LIBCAPTION_ERROR; } data += bytes; size -= bytes; ++ret; } } // There should be one trailing byte, 0x80. But really, we can just ignore that fact. return LIBCAPTION_OK; }
int sei_parse_nalu (sei_t* sei, const uint8_t* data, size_t size, double dts, double cts) { assert (0<=cts); // cant present before decode sei->dts = dts; sei->cts = cts; int ret = 0; if (0 == data || 0 == size) { return 0; } uint8_t nal_unit_type = (*data) & 0x1F; ++data; --size; if (6 != nal_unit_type) { return 0; } // SEI may contain more than one payload while (1<size) { int payloadType = 0; int payloadSize = 0; while (0 < size && 255 == (*data)) { payloadType += 255; ++data; --size; } if (0 == size) { goto error; } payloadType += (*data); ++data; --size; while (0 < size && 255 == (*data)) { payloadSize += 255; ++data; --size; } if (0 == size) { goto error; } payloadSize += (*data); ++data; --size; if (payloadSize) { sei_message_t* msg = sei_message_new ( (sei_msgtype_t) payloadType, 0, payloadSize); uint8_t* payloadData = sei_message_data (msg); size_t bytes = _copy_to_rbsp (payloadData, payloadSize, data, size); sei_message_append (sei, msg); if ( (int) bytes < payloadSize) { goto error; } data += bytes; size -= bytes; ++ret; } } // There should be one trailing byte, 0x80. But really, we can just ignore that fact. return ret; error: sei_init (sei); return 0; }