| 7062 | } |
| 7063 | |
| 7064 | avifResult avifDecoderNthImageTiming(const avifDecoder * decoder, uint32_t frameIndex, avifImageTiming * outTiming) |
| 7065 | { |
| 7066 | if (!decoder->data) { |
| 7067 | // Nothing has been parsed yet |
| 7068 | return AVIF_RESULT_NO_CONTENT; |
| 7069 | } |
| 7070 | |
| 7071 | if ((frameIndex > INT_MAX) || ((int)frameIndex >= decoder->imageCount)) { |
| 7072 | // Impossible index |
| 7073 | return AVIF_RESULT_NO_IMAGES_REMAINING; |
| 7074 | } |
| 7075 | |
| 7076 | if (!decoder->data->sourceSampleTable) { |
| 7077 | // There isn't any real timing associated with this decode, so |
| 7078 | // just hand back the defaults chosen in avifDecoderReset(). |
| 7079 | *outTiming = decoder->imageTiming; |
| 7080 | return AVIF_RESULT_OK; |
| 7081 | } |
| 7082 | |
| 7083 | outTiming->timescale = decoder->timescale; |
| 7084 | outTiming->ptsInTimescales = 0; |
| 7085 | for (uint32_t imageIndex = 0; imageIndex < frameIndex; ++imageIndex) { |
| 7086 | outTiming->ptsInTimescales += avifSampleTableGetImageDelta(decoder->data->sourceSampleTable, imageIndex); |
| 7087 | } |
| 7088 | outTiming->durationInTimescales = avifSampleTableGetImageDelta(decoder->data->sourceSampleTable, frameIndex); |
| 7089 | |
| 7090 | if (outTiming->timescale > 0) { |
| 7091 | outTiming->pts = (double)outTiming->ptsInTimescales / (double)outTiming->timescale; |
| 7092 | outTiming->duration = (double)outTiming->durationInTimescales / (double)outTiming->timescale; |
| 7093 | } else { |
| 7094 | outTiming->pts = 0.0; |
| 7095 | outTiming->duration = 0.0; |
| 7096 | } |
| 7097 | return AVIF_RESULT_OK; |
| 7098 | } |
| 7099 | |
| 7100 | avifResult avifDecoderNthImage(avifDecoder * decoder, uint32_t frameIndex) |
| 7101 | { |
no test coverage detected