summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLuke T. Shumaker <lukeshu@lukeshu.com>2025-02-19 10:19:01 -0700
committerLuke T. Shumaker <lukeshu@lukeshu.com>2025-02-20 00:09:48 -0700
commit07dd4bfbd84d33faae33968f3534911b78d160fb (patch)
treef1fb4803dac2577adc1cda63c7aef81df5239285
parent1b6ea8eab1530b092d4d55bd9209a0eee5300133 (diff)
wip
-rw-r--r--libmkv/nut-generate.c34
1 files changed, 10 insertions, 24 deletions
diff --git a/libmkv/nut-generate.c b/libmkv/nut-generate.c
index a1270c6..25b7627 100644
--- a/libmkv/nut-generate.c
+++ b/libmkv/nut-generate.c
@@ -88,12 +88,14 @@ uint8_t nut_startcode_info[] = {'N', 'I', 0xAB, 0x68, 0xB5, 0x96, 0xBA, 0x7
#define NUT_FRAMEFLAG_KEY (1<< 0)
#define NUT_FRAMEFLAG_EOR (1<< 1)
+#define _NUT_FRAMEFLAG_2 (1<< 2)
#define NUT_FRAMEFLAG_CODED_PTS (1<< 3)
#define NUT_FRAMEFLAG_STREAM_ID (1<< 4)
#define NUT_FRAMEFLAG_SIZE_MSB (1<< 5)
#define NUT_FRAMEFLAG_CHECKSUM (1<< 6)
#define NUT_FRAMEFLAG_RESERVED (1<< 7)
#define NUT_FRAMEFLAG_SM_DATA (1<< 8)
+#define _NUT_FRAMEFLAG_9 (1<< 9)
#define NUT_FRAMEFLAG_HEADER_IDX (1<<10)
#define NUT_FRAMEFLAG_MATCH_TIME (1<<11)
#define NUT_FRAMEFLAG_CODED (1<<12)
@@ -249,10 +251,6 @@ size_t app_res_h(enum app_res res) {
size_t app_res_fb_size(enum app_res res) {
return app_res_w(res)*app_res_h(res);
}
-size_t app_res_sm_size(enum app_res) {
- /* See app_write_frame() */
- return 19;
-}
#define APP_FRAME_SIZE_MSB_MUL 0x2000 /* must be less than 0x4000 */
#define APP_FRAME_MAX_HEADER 16
@@ -261,14 +259,7 @@ struct app_state {
enum app_res res;
};
-#define APP_COMMON_FLAGS \
- NUT_FRAMEFLAG_KEY | /* Because they're full framebuffers, all frames are keyframes. */ \
- NUT_FRAMEFLAG_SIZE_MSB | /* 640*480/2 > 16384 (the max val of data_size_lsb). */ \
- NUT_FRAMEFLAG_CODED_PTS | /* framerate is unknown, each frame must have a timestamp. */ \
- NUT_FRAMEFLAG_CHECKSUM /* framerate is unknown, guard against exceeding max_pts_distance. */
-
-
-bool app_write_intro(int fd, struct app_state *state, uint64_t time_ns) {
+bool app_write_intro(int fd, uint64_t time_ns) {
struct buf out = {0};
struct buf pkt = {0};
unsigned int frame_code = 0;
@@ -276,13 +267,6 @@ bool app_write_intro(int fd, struct app_state *state, uint64_t time_ns) {
append(&out, nut_file_id_string, sizeof(nut_file_id_string));
- /* Changing resolution mid-stream requires per-fame side-data,
- * which requires FLAG_SM_DATA, which requires NUT v4.
- *
- * Unfortunately, libnut / nututils does not support v4, so
- * there goes a good debugging tool.
- */
-
#define BOGUS(n) n
/* main_header ********************************************************/
pkt.len = 0;
@@ -293,7 +277,6 @@ bool app_write_intro(int fd, struct app_state *state, uint64_t time_ns) {
nut_append_vu(&pkt, 1); /*! stream_count */
nut_append_vu(&pkt, /*! max_distance */
APP_FRAME_MAX_HEADER +
- app_res_sm_size(APP_RES_MAX) +
app_res_fb_size(APP_RES_MAX));
/* time bases *************************************/
@@ -491,10 +474,13 @@ static_assert(LM_ARRAY_LEN(font) == 10);
static_assert(sizeof(font[0]) == 32);
int main() {
- struct app_state state;
- if (app_write_intro(1, &state, 0))
+ if (app_write_intro(1, 0))
return 1;
+ struct app_state state = {
+ .res = 0,
+ };
+
uint8_t framebuffer[app_res_fb_size(APP_RES_MAX)];
#define SCALE 10
@@ -502,8 +488,8 @@ int main() {
memset(framebuffer, 0, sizeof(framebuffer));
for (int y = 0; y < 4*SCALE; y++)
for (int x = 0; x < 8*SCALE; x++)
- framebuffer[(y*app_res_w(i%3))+x] = font[i][((y/SCALE)*8)+(x/SCALE)] == ' ' ? 0b11000000 : 0b00000011;
- if (app_write_frame(1, &state, ((uint64_t)i)*1000000000ULL, i%3, framebuffer))
+ framebuffer[(y*app_res_w(i%(APP_RES_MAX+1)))+x] = font[i][((y/SCALE)*8)+(x/SCALE)] == ' ' ? 0b11000000 : 0b00000011;
+ if (app_write_frame(1, &state, ((uint64_t)i)*1000000000ULL, i%(APP_RES_MAX+1), framebuffer))
return 1;
}
return 0;