Ticket #1357: test.c

File test.c, 2.2 KB (added by xire, 5 years ago)
Line 
1#include "libavcodec/avcodec.h"
2#include "libavformat/avformat.h"
3#include "libavformat/avio.h"
4#include "libavutil/mem.h"
5#include "libavutil/avstring.h"
6#include <libavutil/dict.h>
7
8#define FFMPEG_BuffSize 1024 * 1024
9
10FILE *file;
11char* fname; 
12
13int read(void *opaque, uint8_t *buf, int buf_size) {
14        int ret, pos;
15        ret = fread(buf, 1, buf_size, file);
16        pos = ftell(file);
17        return ret;
18}
19
20int64_t seek(void *opaque, int64_t offset, int whence) {
21        int64_t res = -1;
22        if (whence == AVSEEK_SIZE) {
23                int old = ftell(file);
24                fseek(file, 0L, SEEK_END);
25                int ret = ftell(file);
26                fseek(file, old, SEEK_SET);
27                res = (int64_t)ret;
28        } else if (whence == SEEK_CUR) {
29                res = (int64_t) ftell(file);
30        } else if (whence == SEEK_END) {
31                res = (int64_t)fseek(file, 0L, SEEK_END);
32        }
33        return res;
34}
35
36void decoder_open() {
37   
38    uint8_t* aviocontext_buffer = av_malloc(FFMPEG_BuffSize);
39    if (!aviocontext_buffer) {
40        av_log(NULL, AV_LOG_ERROR, "av_malloc for buffer failed\n");
41        return;
42    }
43   
44    AVInputFormat* av_input_format = NULL;
45    AVFormatContext* av_format_context;
46   
47    av_format_context = avformat_alloc_context();
48   
49    if (!av_format_context) {
50        av_log(NULL, AV_LOG_ERROR, "avformat_alloc_context failed\n");
51        return;
52    }
53   
54    AVIOContext* avio_context = avio_alloc_context(aviocontext_buffer, FFMPEG_BuffSize, 0, NULL, read, NULL, seek);
55   
56    if (!avio_context) {
57        av_log(NULL, AV_LOG_ERROR, "avio_alloc_context failed\n");
58        return;
59    }
60
61    av_format_context->pb = avio_context;
62   
63    int res;
64    res = avformat_open_input(&av_format_context, fname, av_input_format, NULL);
65    if (res < 0) {
66        av_log(NULL, AV_LOG_ERROR,  "avformat_open_input failed %d\n", res);
67        return;
68    }   
69   
70        av_dump_format(av_format_context, 0, fname, 0);
71
72    av_log(NULL, AV_LOG_ERROR,  "avio_context->buffer_size=%d\n", avio_context->buffer_size);
73   
74    // uncommenting this prevents leak
75    //if (avio_context->buffer) {
76    //    av_free(avio_context->buffer);
77    //}
78   
79    av_free(avio_context);
80    avformat_close_input(&av_format_context);
81    return;
82}
83
84int main() {
85    av_register_all();
86
87        fname = "silence.mp3";
88        file = fopen(fname, "rb");
89       
90    decoder_open();
91    fclose(file);
92       
93    return 0;
94}