Guest User

Untitled

a guest
Dec 26th, 2014
198
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.05 KB | None | 0 0
  1. commit 9692df8226c9c2aa4d928f5a3cfcfbb847517c93
  2. Author: Eejya Singh <[email protected]>
  3. Date: Mon Dec 15 18:57:31 2014 +0530
  4.  
  5. DVD input device
  6.  
  7. diff --git a/configure b/configure
  8. index 40d5428..6e7ffbd 100755
  9. --- a/configure
  10. +++ b/configure
  11. @@ -1350,6 +1350,7 @@ EXTERNAL_LIBRARY_LIST="
  12. libcdio
  13. libcelt
  14. libdc1394
  15. + libdvdnav
  16. libfaac
  17. libfdk_aac
  18. libflite
  19. @@ -2485,6 +2486,7 @@ dshow_indev_deps="IBaseFilter"
  20. dshow_indev_extralibs="-lpsapi -lole32 -lstrmiids -luuid"
  21. dv1394_indev_deps="dv1394"
  22. dv1394_indev_select="dv_demuxer"
  23. +dvd_indev_deps="libdvdnav"
  24. fbdev_indev_deps="linux_fb_h"
  25. fbdev_outdev_deps="linux_fb_h"
  26. gdigrab_indev_deps="CreateDIBSection"
  27. @@ -4858,6 +4860,7 @@ enabled libcelt && require libcelt celt/celt.h celt_decode -lcelt0 &&
  28. { check_lib celt/celt.h celt_decoder_create_custom -lcelt0 ||
  29. die "ERROR: libcelt must be installed and version must be >= 0.11.0."; }
  30. enabled libcaca && require_pkg_config caca caca.h caca_create_canvas
  31. +enabled libdvdnav && require_pkg_config dvdnav dvdnav/dvdnav.h dvdnav_open -ldvdnav -lpthread
  32. enabled libfaac && require2 libfaac "stdint.h faac.h" faacEncGetVersion -lfaac
  33. enabled libfdk_aac && require libfdk_aac fdk-aac/aacenc_lib.h aacEncOpen -lfdk-aac
  34. flite_libs="-lflite_cmu_time_awb -lflite_cmu_us_awb -lflite_cmu_us_kal -lflite_cmu_us_kal16 -lflite_cmu_us_rms -lflite_cmu_us_slt -lflite_usenglish -lflite_cmulex -lflite"
  35. diff --git a/libavdevice/Makefile b/libavdevice/Makefile
  36. index 6b8ab2e..ef0ce60 100644
  37. --- a/libavdevice/Makefile
  38. +++ b/libavdevice/Makefile
  39. @@ -22,6 +22,7 @@ OBJS-$(CONFIG_DSHOW_INDEV) += dshow.o dshow_enummediatypes.o \
  40. dshow_enumpins.o dshow_filter.o \
  41. dshow_pin.o dshow_common.o
  42. OBJS-$(CONFIG_DV1394_INDEV) += dv1394.o
  43. +OBJS-$(CONFIG_DVD_INDEV) += dvd-dec.o
  44. OBJS-$(CONFIG_FBDEV_INDEV) += fbdev_dec.o \
  45. fbdev_common.o
  46. OBJS-$(CONFIG_FBDEV_OUTDEV) += fbdev_enc.o \
  47. diff --git a/libavdevice/alldevices.c b/libavdevice/alldevices.c
  48. index 26aecf2..dd125df 100644
  49. --- a/libavdevice/alldevices.c
  50. +++ b/libavdevice/alldevices.c
  51. @@ -53,6 +53,7 @@ void avdevice_register_all(void)
  52. REGISTER_INOUTDEV(DECKLINK, decklink);
  53. REGISTER_INDEV (DSHOW, dshow);
  54. REGISTER_INDEV (DV1394, dv1394);
  55. + REGISTER_INDEV (DVD, dvd);
  56. REGISTER_INOUTDEV(FBDEV, fbdev);
  57. REGISTER_INDEV (GDIGRAB, gdigrab);
  58. REGISTER_INDEV (IEC61883, iec61883);
  59. diff --git a/libavdevice/dvd-dec.c b/libavdevice/dvd-dec.c
  60. new file mode 100644
  61. index 0000000..b41b5cb
  62. --- /dev/null
  63. +++ b/libavdevice/dvd-dec.c
  64. @@ -0,0 +1,152 @@
  65. +/*
  66. + * Copyright (c) 2014 Eejya Singh
  67. + *
  68. + * This file is part of FFmpeg.
  69. + *
  70. + * Permission to use, copy, modify, and/or distribute this software for any
  71. + * purpose with or without fee is hereby granted, provided that the above
  72. + * copyright notice and this permission notice appear in all copies.
  73. + *
  74. + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
  75. + * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
  76. + * AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
  77. + * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
  78. + * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
  79. + * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
  80. + * PERFORMANCE OF THIS SOFTWARE.
  81. + */
  82. +
  83. +/**
  84. + * @file
  85. + * DVD 1.1 capture device for libavdevice
  86. + **/
  87. +
  88. +#include "libavutil/opt.h"
  89. +#include "libavutil/time.h"
  90. +#include "libavformat/internal.h"
  91. +#include "avdevice.h"
  92. +
  93. +#include <dvdnav/dvdnav.h>
  94. +#include <dvdnav/dvd_types.h>
  95. +
  96. +
  97. +/* libdvdnav's read ahead cache to be used */
  98. +#define DVD_READ_CACHE 1
  99. +
  100. +/* default language for menus/audio/subpictures */
  101. +#define DVD_LANGUAGE "en"
  102. +
  103. +typedef struct {
  104. + dvdnav_t *nav_data;
  105. + uint8_t cache_buf[DVD_VIDEO_LB_LEN];
  106. + char *language;
  107. + dvdnav_status_t status;
  108. +} DVDContext;
  109. +
  110. +
  111. +static int read_header(AVFormatContext *ctx)
  112. +{
  113. + int finished = 0;
  114. + AVStream *st_audio = NULL;
  115. + AVStream *st_video = NULL;
  116. + AVStream *st_subp = NULL;
  117. + int dump = 0, tt_dump = 0;
  118. + uint8_t mem[DVD_VIDEO_LB_LEN];
  119. + int audio_stream,spu_stream,parts;
  120. + DVDContext *dvd = ctx->priv_data;
  121. +
  122. + if((dvd->status = dvdnav_open(&dvd->nav_data,ctx->filename[0] ? ctx->filename : NULL)) != DVDNAV_STATUS_OK)
  123. + {
  124. + return AVERROR(EIO);
  125. + }
  126. + av_log(ctx , 0 , " Status of the opened DVD is %d\n",dvd->status);
  127. + dvd->language = av_strdup(DVD_LANGUAGE);
  128. +
  129. + /* set read ahead cache usage */
  130. + if (dvdnav_set_readahead_flag(dvd->nav_data, DVD_READ_CACHE) != DVDNAV_STATUS_OK) {
  131. + dvdnav_close(dvd->nav_data);
  132. + av_freep(&dvd);
  133. + return AVERROR(EACCES);
  134. + }
  135. + av_log(ctx, 0 , "Setting Readahead Flag\n");
  136. + /* set the language */
  137. + if ((dvdnav_menu_language_select (dvd->nav_data, dvd->language) != DVDNAV_STATUS_OK) ||
  138. + (dvdnav_audio_language_select(dvd->nav_data, dvd->language) != DVDNAV_STATUS_OK) ||
  139. + (dvdnav_spu_language_select (dvd->nav_data, dvd->language) != DVDNAV_STATUS_OK)) {
  140. + av_log(ctx, AV_LOG_ERROR, "Error selecting language\n");
  141. + return AVERROR(EACCES);
  142. + }
  143. +
  144. +
  145. + /*set the PGC positioning flag to have position information relatively to the
  146. + *current chapter (seek will seek in the chapter) */
  147. + if (dvdnav_set_PGC_positioning_flag(dvd->nav_data, 0) != DVDNAV_STATUS_OK) {
  148. + av_log(ctx, AV_LOG_ERROR, "Error setting PGC positioning flags\n");
  149. + dvdnav_close(dvd->nav_data);
  150. + return AVERROR(EACCES);
  151. + }
  152. + audio_stream = dvdnav_get_active_audio_stream(dvd->nav_data);
  153. +
  154. + av_log(ctx, 0, "Active Audio Stream is %d\n",audio_stream);
  155. + av_log(ctx,0,"Video Aspect ratio ",dvdnav_get_video_aspect(dvd->nav_data));
  156. +
  157. + st_video = avformat_new_stream(ctx, NULL);
  158. + st_audio = avformat_new_stream(ctx, NULL);
  159. + st_subp = avformat_new_stream(ctx, NULL);
  160. +
  161. + if (!st_video)
  162. + return AVERROR(ENOMEM);
  163. + avpriv_set_pts_info(st_video, 64, 1, 100); //pts information in seconds at max??
  164. + st_video->codec->codec_type = AVMEDIA_TYPE_VIDEO;
  165. + st_video->codec->codec_id = AV_CODEC_ID_MPEG2VIDEO;
  166. +
  167. +
  168. + if (!st_audio)
  169. + return AVERROR(ENOMEM);
  170. + avpriv_set_pts_info(st_audio, 64, 1, 100); //pts information in seconds at max??
  171. + st_audio->codec->codec_type = AVMEDIA_TYPE_AUDIO;
  172. + st_audio->codec->codec_id = AV_CODEC_ID_AC3;
  173. +
  174. + if (!st_subp)
  175. + return AVERROR(ENOMEM);
  176. + avpriv_set_pts_info(st_subp, 64, 1, 100); //pts information in seconds at max??
  177. + st_subp->codec->codec_type = AVMEDIA_TYPE_SUBTITLE;
  178. + st_subp->codec->codec_id = AV_CODEC_ID_DVD_SUBTITLE;
  179. +
  180. + return 0;
  181. +}
  182. +
  183. +static int read_packet(AVFormatContext* ctx, AVPacket *pkt)
  184. +{
  185. +
  186. + return pkt->size;
  187. +}
  188. +
  189. +static int read_close(AVFormatContext* ctx)
  190. +{
  191. + DVDContext *dvd = (DVDContext *)ctx->priv_data;
  192. + if (dvd->status && dvd->nav_data != NULL) {
  193. + dvdnav_close(dvd->nav_data);
  194. + }
  195. + return 0;
  196. +}
  197. +
  198. +static const AVClass class = {
  199. + .class_name = "dvd",
  200. + .item_name = av_default_item_name,
  201. +// .option = options,
  202. + .version = LIBAVUTIL_VERSION_INT,
  203. + .category = AV_CLASS_CATEGORY_DEVICE_AUDIO_INPUT,
  204. +};
  205. +
  206. +AVInputFormat ff_dvd_demuxer = {
  207. + .name = "dvd",
  208. + .long_name = NULL_IF_CONFIG_SMALL("DVD audio video capture device"),
  209. + .priv_data_size = sizeof(DVDContext),
  210. + .read_probe = NULL,
  211. + .read_header = read_header,
  212. + .read_packet = read_packet,
  213. + .read_close = read_close,
  214. + .flags = AVFMT_NOFILE,
  215. + .priv_class = &class
  216. +};
Advertisement
Add Comment
Please, Sign In to add comment