Skip to content

Commit

Permalink
Group data timestamp flush fixed
Browse files Browse the repository at this point in the history
  • Loading branch information
dnewman-gpsw committed Mar 21, 2019
1 parent 41854e3 commit c9637f2
Show file tree
Hide file tree
Showing 2 changed files with 44 additions and 22 deletions.
29 changes: 25 additions & 4 deletions GPMF_writer.c
Original file line number Diff line number Diff line change
Expand Up @@ -587,7 +587,7 @@ void AppendFormattedMetadata(device_metadata *dm, uint32_t *formatted, uint32_t
if(!(flags & GPMF_FLAGS_LOCKED)) // Use this internal flags if called within a Lock()
Lock(&dm->device_lock);

if (sample_count && flags & GPMF_FLAGS_GROUPED)
if (flags & GPMF_FLAGS_GROUPED)
sample_count = 1;


Expand Down Expand Up @@ -2223,7 +2223,7 @@ static uint32_t DataSizeForSamples(uint32_t *srcPayload, uint32_t samples2store,

uint32_t sampleSize = GPMF_SAMPLE_SIZE(srcPayload[1]);

dataSize = 8 + ((sampleSize*samples2store + 3)&~3);
dataSize = 8 + sampleSize*samples2store;
//remainingSize = ((sampleSize * remainingSamples + 3) & ~3);
//remainingOffset = sampleSize * remainingSamples;
}
Expand Down Expand Up @@ -2632,6 +2632,16 @@ uint32_t GPMFWriteGetPayloadAndSession( size_t ws_handle, uint32_t channel, uint
else
memcpy(ptr, srcPayload, payloadAddition);

if (payloadAddition & 3)
{
uint8_t *ptr8 = (uint8_t *)ptr + payloadAddition;
if ((payloadAddition & 3) <= 3) *ptr8++ = 0;
if ((payloadAddition & 3) <= 2) *ptr8++ = 0;
if ((payloadAddition & 3) <= 1) *ptr8++ = 0;
payloadAddition += 3;
payloadAddition &= 0xfffffffc;
}

devicesizebytes += payloadAddition;
streamsizebytes += payloadAddition;
ptr += (payloadAddition >> 2);
Expand Down Expand Up @@ -2685,6 +2695,7 @@ uint32_t GPMFWriteGetPayloadAndSession( size_t ws_handle, uint32_t channel, uint
if (GPMF_KEY_END != srcPayload[0])
{
dataSize = DataSizeForSamples(srcPayload, samples2store, grouped);
sampleSize = GPMF_SAMPLE_SIZE(srcPayload[1]);

currentTotalSampleBytes = 8 + GPMF_DATA_SIZE(srcPayload[1]); // This is okay for non-grouped data.

Expand Down Expand Up @@ -2964,8 +2975,18 @@ uint32_t GPMFWriteGetPayloadAndSession( size_t ws_handle, uint32_t channel, uint
currts -= dm->deltaTimeStamp[pos];
dm->sampleCount[pos] = (uint16_t)(smps - samples2store);
}
if(nextts > currts)
dm->deltaTimeStamp[pos] = (uint32_t)(currts + dm->deltaTimeStamp[pos] - nextts);
if (nextts > currts)
{
int32_t delta = (int32_t)((int64_t)currts + (int64_t)dm->deltaTimeStamp[pos] - (int64_t)nextts);
if (delta >= 0)
dm->deltaTimeStamp[pos] = (uint32_t)delta;
else
{
dm->deltaTimeStamp[pos] = 0;
if (abs(delta) <= dm->deltaTimeStamp[pos + 1])
dm->deltaTimeStamp[pos + 1] += delta;
}
}

dm->firstTimeStamp = nextts;
memcpy(&dm->deltaTimeStamp[0], &dm->deltaTimeStamp[pos], sizeof(dm->deltaTimeStamp[0])*(dm->payloadTimeStampCount - pos));
Expand Down
37 changes: 19 additions & 18 deletions demo/GPMF_demo.c
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ int main(int argc, char *argv[])
return -1;
}

srand(5);
srand(11);

mp4_handle = OpenMP4Export(argv[1], 1000, 1001);

Expand Down Expand Up @@ -93,16 +93,16 @@ int main(int argc, char *argv[])
if (handleC == 0) goto cleanup;

//Initialize sensor stream with any sticky data
sprintf_s(txt, 80, "Sensor A");
GPMFWriteStreamStore(handleA, GPMF_KEY_STREAM_NAME, GPMF_TYPE_STRING_ASCII, (uint32_t)strlen(txt), 1, &txt, GPMF_FLAGS_STICKY);
sprintf_s(txt, 80, "LB[6]"); // matching sensorAdata
GPMFWriteStreamStore(handleA, GPMF_KEY_TYPE, GPMF_TYPE_STRING_ASCII, (uint32_t)strlen(txt), 1, &txt, GPMF_FLAGS_STICKY);
sprintf_s(txt, 80, "Sensor A");
GPMFWriteStreamStore(handleA, GPMF_KEY_STREAM_NAME, GPMF_TYPE_STRING_ASCII, (uint32_t)strlen(txt), 1, &txt, GPMF_FLAGS_STICKY);
sprintf_s(txt, 80, "LB[6]"); // matching sensorAdata
GPMFWriteStreamStore(handleA, GPMF_KEY_TYPE, GPMF_TYPE_STRING_ASCII, (uint32_t)strlen(txt), 1, &txt, GPMF_FLAGS_STICKY);


sprintf_s(txt, 80, "Sensor B");
GPMFWriteStreamStore(handleB, GPMF_KEY_STREAM_NAME, GPMF_TYPE_STRING_ASCII, (uint32_t)strlen(txt), 1, &txt, GPMF_FLAGS_STICKY);
tmp = 555;
GPMFWriteStreamStore(handleB, GPMF_KEY_SCALE, GPMF_TYPE_UNSIGNED_LONG, sizeof(tmp), 1, &tmp, GPMF_FLAGS_STICKY);
//tmp = 555;
//GPMFWriteStreamStore(handleB, GPMF_KEY_SCALE, GPMF_TYPE_UNSIGNED_LONG, sizeof(tmp), 1, &tmp, GPMF_FLAGS_STICKY);
//fdata[0] = 123.456f; fdata[1] = 74.56f; fdata[2] = 98.76f;
//GPMFWriteStreamStore(handleB, STR2FOURCC("MyCC"), GPMF_TYPE_FLOAT, sizeof(float), 3, fdata, GPMF_FLAGS_STICKY);

Expand All @@ -126,7 +126,7 @@ int main(int argc, char *argv[])
#endif
nowtick = tick;

for (faketime = 0; faketime < 2; faketime++)
for (faketime = 0; faketime < 5; faketime++)
{
payloadtick = tick;
for (fakedata = 0; fakedata < 50; fakedata++)
Expand All @@ -137,7 +137,7 @@ int main(int argc, char *argv[])
tick = tt.QuadPart;
#endif
//sensor = 1;
sensor = 2;
//sensor = 2;
switch(sensor)
{
case 0: //pretend no data
Expand Down Expand Up @@ -169,15 +169,16 @@ int main(int argc, char *argv[])
case 2: //pretend Sensor B data
{
static int count = 1;
samples = 0 + (rand() % 4); //0-3 values
samples = 1;
for (i = 0; i < samples; i++) Ldata[i] = count;// (uint32_t)rand() & 0xffffff;
//samples = 0 + (rand() % 4); //0-3 values
samples = 1 + (rand() % 3); //1-3 values
//samples = 1;
for (i = 0; i < samples; i++) sdata[i] = count;// (uint32_t)rand() & 0xffffff;
count++;
//err = GPMFWriteStreamStoreStamped(handleB, STR2FOURCC("SnrB"), GPMF_TYPE_UNSIGNED_LONG, sizeof(uint32_t), samples, Ldata, GPMF_FLAGS_NONE, tick);
//err = GPMFWriteStreamStoreStamped(handleB, STR2FOURCC("SnrB"), GPMF_TYPE_UNSIGNED_LONG, sizeof(uint32_t), samples, Ldata, GPMF_FLAGS_GROUPED, tick);
err = GPMFWriteStreamStoreStamped(handleB, STR2FOURCC("SnrB"), GPMF_TYPE_UNSIGNED_LONG, sizeof(uint32_t), samples, Ldata, GPMF_FLAGS_STORE_ALL_TIMESTAMPS, tick);
//err = GPMFWriteStreamStore(handleB, STR2FOURCC("SnrB"), GPMF_TYPE_UNSIGNED_LONG, sizeof(uint32_t), samples, Ldata, GPMF_FLAGS_NONE);
//err = GPMFWriteStreamStore(handleB, STR2FOURCC("SnrB"), GPMF_TYPE_UNSIGNED_LONG, sizeof(uint32_t), samples, Ldata, GPMF_FLAGS_GROUPED);
//err = GPMFWriteStreamStoreStamped(handleB, STR2FOURCC("SnrB"), GPMF_TYPE_UNSIGNED_SHORT, sizeof(uint16_t), samples, sdata, GPMF_FLAGS_NONE, tick);
err = GPMFWriteStreamStoreStamped(handleB, STR2FOURCC("SnrB"), GPMF_TYPE_UNSIGNED_SHORT, sizeof(uint16_t), samples, sdata, GPMF_FLAGS_GROUPED, tick);
//err = GPMFWriteStreamStoreStamped(handleB, STR2FOURCC("SnrB"), GPMF_TYPE_UNSIGNED_SHORT, sizeof(uint16_t), samples, sdata, GPMF_FLAGS_STORE_ALL_TIMESTAMPS, tick);
//err = GPMFWriteStreamStore(handleB, STR2FOURCC("SnrB"), GPMF_TYPE_UNSIGNED_SHORT, sizeof(uint16_t), samples, sdata, GPMF_FLAGS_NONE);
//err = GPMFWriteStreamStore(handleB, STR2FOURCC("SnrB"), GPMF_TYPE_UNSIGNED_SHORT, sizeof(uint16_t), samples, sdata, GPMF_FLAGS_GROUPED);
if (err)
{
printf("err = %d\n", err);
Expand All @@ -202,7 +203,7 @@ int main(int argc, char *argv[])
Sleep(2 * samples); // << to help test the time stamps.
#endif
}
nowtick = payloadtick + (tick - payloadtick) * 80 / 100; // test by reading out only the last half samples
nowtick = payloadtick + (tick - payloadtick) * 39 / 50; // test by reading out only the last half samples
//nowtick += 100; // test by reading out only the last half samples
GPMFWriteGetPayloadWindow(gpmfhandle, GPMF_CHANNEL_TIMED, (uint32_t *)buffer, sizeof(buffer), &payload, &payload_size, nowtick);
//GPMFWriteGetPayloadAndSession(gpmfhandle, GPMF_CHANNEL_TIMED, (uint32_t *)buffer, sizeof(buffer), NULL, NULL, &payload, &payload_size, 1, nowtick);
Expand Down

0 comments on commit c9637f2

Please sign in to comment.