1/* MiniDLNA media server
2 * Copyright (C) 2013  NETGEAR
3 *
4 * This file is part of MiniDLNA.
5 *
6 * MiniDLNA is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License version 2 as
8 * published by the Free Software Foundation.
9 *
10 * MiniDLNA is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with MiniDLNA. If not, see <http://www.gnu.org/licenses/>.
17 */
18#if defined HAVE_FFMPEG_LIBAVUTIL_AVUTIL_H
19#include <ffmpeg/libavutil/avutil.h>
20#elif defined HAVE_LIBAV_LIBAVUTIL_AVUTIL_H
21#include <libav/libavutil/avutil.h>
22#elif  defined HAVE_LIBAVUTIL_AVUTIL_H
23#include <libavutil/avutil.h>
24#elif defined HAVE_FFMPEG_AVUTIL_H
25#include <ffmpeg/avutil.h>
26#elif defined HAVE_LIBAV_AVUTIL_H
27#include <libav/avutil.h>
28#elif defined HAVE_AVUTIL_H
29#include <avutil.h>
30#endif
31
32#if defined HAVE_FFMPEG_LIBAVCODEC_AVCODEC_H
33#include <ffmpeg/libavcodec/avcodec.h>
34#elif defined HAVE_LIBAV_LIBAVCODEC_AVCODEC_H
35#include <libav/libavcodec/avcodec.h>
36#elif defined HAVE_LIBAVCODEC_AVCODEC_H
37#include <libavcodec/avcodec.h>
38#elif defined HAVE_FFMPEG_AVCODEC_H
39#include <ffmpeg/avcodec.h>
40#elif defined HAVE_LIBAV_AVCODEC_H
41#include <libav/avcodec.h>
42#elif defined HAVE_AVCODEC_H
43#include <avcodec.h>
44#endif
45
46#if defined HAVE_FFMPEG_LIBAVFORMAT_AVFORMAT_H
47#include <ffmpeg/libavformat/avformat.h>
48#elif defined HAVE_LIBAV_LIBAVFORMAT_AVFORMAT_H
49#include <libav/libavformat/avformat.h>
50#elif defined HAVE_LIBAVFORMAT_AVFORMAT_H
51#include <libavformat/avformat.h>
52#elif defined HAVE_FFMPEG_AVFORMAT_H
53#include <ffmpeg/avformat.h>
54#elif defined HAVE_LIBAV_LIBAVFORMAT_H
55#include <libav/avformat.h>
56#elif defined HAVE_AVFORMAT_H
57#include <avformat.h>
58#endif
59
60#ifndef FF_PROFILE_H264_BASELINE
61#define FF_PROFILE_H264_BASELINE 66
62#endif
63#ifndef FF_PROFILE_H264_CONSTRAINED_BASELINE
64#define FF_PROFILE_H264_CONSTRAINED_BASELINE 578
65#endif
66#ifndef FF_PROFILE_H264_MAIN
67#define FF_PROFILE_H264_MAIN 77
68#endif
69#ifndef FF_PROFILE_H264_HIGH
70#define FF_PROFILE_H264_HIGH 100
71#endif
72#ifndef FF_PROFILE_SKIP
73#define FF_PROFILE_SKIP -100
74#endif
75
76#if LIBAVCODEC_VERSION_MAJOR < 53
77#define AVMEDIA_TYPE_AUDIO CODEC_TYPE_AUDIO
78#define AVMEDIA_TYPE_VIDEO CODEC_TYPE_VIDEO
79#endif
80
81#if LIBAVCODEC_VERSION_INT <= ((51<<16)+(50<<8)+1)
82#define CODEC_ID_WMAPRO CODEC_ID_NONE
83#endif
84
85#if LIBAVCODEC_VERSION_MAJOR < 55
86#define AV_CODEC_ID_AAC CODEC_ID_AAC
87#define AV_CODEC_ID_AC3 CODEC_ID_AC3
88#define AV_CODEC_ID_ADPCM_IMA_QT CODEC_ID_ADPCM_IMA_QT
89#define AV_CODEC_ID_AMR_NB CODEC_ID_AMR_NB
90#define AV_CODEC_ID_DTS CODEC_ID_DTS
91#define AV_CODEC_ID_H264 CODEC_ID_H264
92#define AV_CODEC_ID_MP2 CODEC_ID_MP2
93#define AV_CODEC_ID_MP3 CODEC_ID_MP3
94#define AV_CODEC_ID_MPEG1VIDEO CODEC_ID_MPEG1VIDEO
95#define AV_CODEC_ID_MPEG2VIDEO CODEC_ID_MPEG2VIDEO
96#define AV_CODEC_ID_MPEG4 CODEC_ID_MPEG4
97#define AV_CODEC_ID_MSMPEG4V3 CODEC_ID_MSMPEG4V3
98#define AV_CODEC_ID_PCM_S16LE CODEC_ID_PCM_S16LE
99#define AV_CODEC_ID_VC1 CODEC_ID_VC1
100#define AV_CODEC_ID_WMAPRO CODEC_ID_WMAPRO
101#define AV_CODEC_ID_WMAV1 CODEC_ID_WMAV1
102#define AV_CODEC_ID_WMAV2 CODEC_ID_WMAV2
103#define AV_CODEC_ID_WMV3 CODEC_ID_WMV3
104#endif
105
106#if LIBAVUTIL_VERSION_INT < ((50<<16)+(13<<8)+0)
107#define av_strerror(x, y, z) snprintf(y, z, "%d", x)
108#endif
109
110#if LIBAVFORMAT_VERSION_INT >= ((52<<16)+(31<<8)+0)
111# if LIBAVUTIL_VERSION_INT < ((51<<16)+(5<<8)+0) && !defined(FF_API_OLD_METADATA2)
112#define AV_DICT_IGNORE_SUFFIX AV_METADATA_IGNORE_SUFFIX
113#define av_dict_get av_metadata_get
114typedef AVMetadataTag AVDictionaryEntry;
115# endif
116#endif
117
118static inline int
119lav_open(AVFormatContext **ctx, const char *filename)
120{
121	int ret;
122#if LIBAVFORMAT_VERSION_INT >= ((53<<16)+(17<<8)+0)
123	ret = avformat_open_input(ctx, filename, NULL, NULL);
124	if (ret == 0)
125		avformat_find_stream_info(*ctx, NULL);
126#else
127	ret = av_open_input_file(ctx, filename, NULL, 0, NULL);
128	if (ret == 0)
129		av_find_stream_info(*ctx);
130#endif
131	return ret;
132}
133
134static inline void
135lav_close(AVFormatContext *ctx)
136{
137#if LIBAVFORMAT_VERSION_INT >= ((53<<16)+(17<<8)+0)
138	avformat_close_input(&ctx);
139#else
140	av_close_input_file(ctx);
141#endif
142}
143
144static inline int
145lav_get_fps(AVStream *s)
146{
147#if LIBAVCODEC_VERSION_MAJOR < 54
148	if (s->r_frame_rate.den)
149		return s->r_frame_rate.num / s->r_frame_rate.den;
150#else
151	if (s->avg_frame_rate.den)
152		return s->avg_frame_rate.num / s->avg_frame_rate.den;
153#endif
154	return 0;
155}
156
157static inline int
158lav_get_interlaced(AVCodecContext *vc, AVStream *s)
159{
160#if LIBAVCODEC_VERSION_MAJOR < 54
161	return (vc->time_base.den ? (s->r_frame_rate.num / vc->time_base.den) : 0);
162#else
163	return (vc->time_base.den ? (s->avg_frame_rate.num / vc->time_base.den) : 0);
164#endif
165}
166
167static inline int
168lav_is_thumbnail_stream(AVStream *s, uint8_t **data, int *size)
169{
170#if LIBAVFORMAT_VERSION_INT >= ((54<<16)+(6<<8))
171	if (s->disposition & AV_DISPOSITION_ATTACHED_PIC &&
172	    s->codec->codec_id == AV_CODEC_ID_MJPEG)
173	{
174		if (data)
175			*data = s->attached_pic.data;
176		if (size)
177			*size = s->attached_pic.size;
178		return 1;
179	}
180#endif
181	return 0;
182}
183