Ticket #6305: BugTestCase.c

File BugTestCase.c, 3.0 KB (added by s0m3, 2 years ago)

Test case to trigger the bug

Line 
1#include <stdio.h> /* For printf, fprintf */
2#include <stdbool.h> /* For bool */
3
4#ifdef _WIN32
5#define inline _inline
6#endif
7
8#include <libavformat\avformat.h> /* For AVFormatContext */
9#include <inttypes.h> /* For PRId64 */
10
11int ret;
12bool hasNoError;
13
14#define CHECK(v) do { if ((v)) { fprintf(stderr, "[ERR]:%s:%d Unexpected failure\n", __FILE__, __LINE__); return false; } } while(0)
15#define CHECK2(v) do { if ((v)) { fprintf(stderr, "[ERR]:%s:%d Unexpected failure\n", __FILE__, __LINE__); goto onError; } } while(0)
16
17typedef struct testCaseContext
18{
19    AVFormatContext *format_context;
20    int video_stream_index;
21} testCaseContext;
22
23void init(testCaseContext *zis)
24{
25    zis->format_context = NULL;
26    zis->video_stream_index = -1;
27
28    avcodec_register_all();
29    av_register_all();
30}
31
32bool analyse(testCaseContext *zis)
33{
34    int videoStreamCount, videoStreamIndex;
35
36    ret = avformat_find_stream_info(zis->format_context, NULL);
37    CHECK(ret < 0);
38    CHECK(zis->format_context->nb_streams <= 0);
39
40    for (int i = videoStreamCount = 0; i < (int)zis->format_context->nb_streams; i++)
41    {
42        if (zis->format_context->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_VIDEO)
43        {
44            if (!videoStreamCount)
45                videoStreamIndex = i;
46            videoStreamCount++;
47        }
48    }
49
50    /* Media has no video stream - Aborting */
51    CHECK(videoStreamCount == 0);
52    /* Note that if videoStreamCount != 1, it means media has more than 1 video stream
53    videoStreamIndex is the first one */
54
55    zis->video_stream_index = videoStreamIndex;
56
57    return true;
58}
59
60int main(int argc, char **argv)
61{
62    testCaseContext zis;
63    bool isNativeIndexAvailable;
64
65    if (argc != 2)
66    {
67        printf("Usage: %s <filepath>\n", *argv);
68        return -1;
69    }
70
71    init(&zis);
72
73    ret = avformat_open_input(&zis.format_context, argv[1], NULL, NULL);
74    /* media file format not supported */
75    CHECK2(ret == AVERROR_INVALIDDATA);
76
77    hasNoError = analyse(&zis);
78    CHECK2(!hasNoError);
79
80    isNativeIndexAvailable = zis.format_context->streams[zis.video_stream_index]->nb_index_entries != 0;
81    CHECK2(!isNativeIndexAvailable);
82
83    for (int i = 0; i < zis.format_context->streams[zis.video_stream_index]->nb_index_entries; i++)
84    {
85        int64_t frameTime=-1, indexEntryTimestamp = zis.format_context->streams[zis.video_stream_index]->index_entries[i].timestamp;
86
87        if (indexEntryTimestamp >= 0)
88        {
89            /* pts * time_base = seconds. Change formula to get 100ns. */
90            AVRational streamTimeBase = zis.format_context->streams[zis.video_stream_index]->time_base;
91            streamTimeBase.num *= 10000000;
92
93            frameTime = (int64_t)(indexEntryTimestamp * av_q2d(streamTimeBase));
94        }
95
96        printf("Index entry #%d, timestamp=%"PRId64", frame time=%"PRId64" 100ns\n",
97            i+1, indexEntryTimestamp, frameTime);
98    }
99
100onError:
101    if (zis.format_context) avformat_close_input(&zis.format_context);
102    return 0;
103}